;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