矩阵键盘线反转法实现

 

 			;project:  	线反转法扫描键盘,一位数码显示;version:	20130611;problems: 1.有时出现数码管显示相应数字后变暗闪烁,键盘失灵;				a.尝试加全部键盘检测完,没有找到则返回主程序,没用;				b.加键盘消抖,解决;			2.两个按键同时按下,出现第一种错误;				a.加全部键盘检测完,没有找到则返回主程序,解决;conclusion: 1.仿真和实际应用存在差别;			 2.键盘需要消抖,否则容易出错;			 3.  区分ret 与 lcall 指令使用org 	0000hljmp	mainorg		0030h
main:		mov		p2,#0f0h           ;p2接键盘mov		a,p2cjne	a,#0f0h,hit_keysjmp	mainhit_key:    lcall	DELAY10MS       	 ;延时消抖mov		a,p2cjne	a,#0f0h,hit_keyrelljmp	mainhit_keyrel:	orl		a,#0fhmov		p2,amov		a,p2mov		b,a           		;b中有按键记录mov		r1,#0ffh   		;键盘计数mov  	dptr,#keytab    
res:		clr		amovc	a,@a+dptrinc		dptrinc		r1cjne	r1,#10h,hav         ;如果键盘扫描完没有找到,返回主程序ljmp	main
hav:		cjne	a,b,resdispkey:	mov		 p1,#11111110b      ;开位选  mov		a,r1mov		dptr,#numtabmovc	a,@a+dptrmov		p0,a         		  ;数码管显示
rk_exit:	ljmp  	mainDELAY10MS:   ;误差 0usMOV R7,#01H
DL1:MOV R6,#26H
DL0:MOV R5,#82HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1RETkeytab:	    db   01111110b,01111101b,01111011b,01110111bdb   10111110b,10111101b,10111011b,10110111bdb   11011110b,11011101b,11011011b,11010111bdb   11101110b,11101101b,11101011b,11100111bnumtab:	    db   0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8hdb   80h,90h,88h,83h,0c6h,0a1h,86h,8ehend