;project: 线反转法扫描键盘,一位数码显示
;version:20130611
;problems: 1.有时出现数码管显示相应数字后变暗闪烁,键盘失灵
;a.尝试加全部键盘检测完,没有找到则返回主程序,没用
;b.加键盘消抖,解决
;2.两个按键同时按下,出现第一种错误
;a.加全部键盘检测完,没有找到则返回主程序,解决
;conclusion: 1.仿真和实际应用存在差别
; 2.键盘需要消抖,否则容易出错
; 3. 区分ret 与 lcall 指令使用
org 0000h
ljmpmain
org0030h
main:movp2,#0f0h ;p2接键盘
mova,p2
cjnea,#0f0h,hit_key
sjmpmain
hit_key: lcallDELAY10MS ;延时消抖
mova,p2
cjnea,#0f0h,hit_keyrel
ljmpmain
hit_keyrel:orla,#0fh
movp2,a
mova,p2
movb,a ;b中有按键记录
movr1,#0ffh ;键盘计数
mov dptr,#keytab
res:clra
movca,@a+dptr
incdptr
incr1
cjner1,#10h,hav ;如果键盘扫描完没有找到,返回主程序
ljmpmain
hav:cjnea,b,res
dispkey:mov p1,#11111110b ;开位选
mova,r1
movdptr,#numtab
movca,@a+dptr
movp0,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