;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
