矩阵键盘线反转法实现


 			;project:  	线反转法扫描键盘,一位数码显示
			;version:	20130611
			;problems: 1.有时出现数码管显示相应数字后变暗闪烁,键盘失灵
			;				a.尝试加全部键盘检测完,没有找到则返回主程序,没用
			;				b.加键盘消抖,解决
			;			2.两个按键同时按下,出现第一种错误
			;				a.加全部键盘检测完,没有找到则返回主程序,解决
			;conclusion: 1.仿真和实际应用存在差别
			;			 2.键盘需要消抖,否则容易出错
			;			 3.  区分ret 与 lcall 指令使用
			
			org 	0000h
			ljmp	main
			org		0030h
main:		mov		p2,#0f0h           ;p2接键盘
			mov		a,p2
			cjne	a,#0f0h,hit_key
			sjmp	main
			
hit_key:    lcall	DELAY10MS       	 ;延时消抖
			mov		a,p2
			cjne	a,#0f0h,hit_keyrel
			ljmp	main
			
hit_keyrel:	orl		a,#0fh
			mov		p2,a
			mov		a,p2
			mov		b,a           		;b中有按键记录
			
			mov		r1,#0ffh   		;键盘计数
			mov  	dptr,#keytab    
res:		clr		a
			movc	a,@a+dptr
			inc		dptr
			inc		r1
			cjne	r1,#10h,hav         ;如果键盘扫描完没有找到,返回主程序
			ljmp	main
hav:		cjne	a,b,res
			
			
dispkey:	mov		 p1,#11111110b      ;开位选  
			mov		a,r1
			mov		dptr,#numtab
			movc	a,@a+dptr
			mov		p0,a         		  ;数码管显示
rk_exit:	ljmp  	main
			
DELAY10MS:   ;误差 0us
    MOV R7,#01H
DL1:
    MOV R6,#26H
DL0:
    MOV R5,#82H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET
	
keytab:	    db   01111110b,01111101b,01111011b,01110111b
	    db   10111110b,10111101b,10111011b,10110111b
 	    db   11011110b,11011101b,11011011b,11010111b
   	    db   11101110b,11101101b,11101011b,11100111b
			
numtab:	    db   0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h
	    db   80h,90h,88h,83h,0c6h,0a1h,86h,8eh
	end
			
			
			
矩阵键盘线反转法实现_第1张图片

你可能感兴趣的:(矩阵键盘线反转法实现)