;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