|
org
0000h
ajmp main
org 0030h
main:
mov
dptr,#tab ;将表头放入DPTR
lcall
key
;调用键盘扫描程序
movc
a,@a+dptr ;查表后将键值送入ACC
mov
p0,a
;将Acc值送入P0口
CLR
P2.1
;开显示
ljmp
main
;返回反复循环显示
KEY: LCALL KS
;调用检测按键子程序
JNZ
K1
;有键按下继续
LCALL
DELAY2 ;无键按调用延时去抖
AJMP
KEY
;返回继续检测按键
K1: LCALL DELAY2
LCALL
DELAY2 ;有键按下延时去抖动
LCALL
KS
;再调用检测按键程序
JNZ
K2
;确认有按下进行下一步
AJMP
KEY
;无键按下返回继续检测
K2: MOV R2,#0EFH
;将扫描值送入 R2暂存
MOV R4,#00H ;将第一列值送入R4暂存
K3: MOV
P1,R2 ;将R2的值送入P1口
L6: JB P1.0,L1
;P1.0等于1跳转到L1
MOV
A,#00H ;将第一行值送入ACC
AJMP
LK
;跳转到键值处理程序
L1: JB P1.1,L2
;P1.1等于1跳转到L2
MOV
A,#04H ;将第二行的行值送入ACC
AJMP
LK ;跳转到键值理程序进行键值处理
L2: JB P1.2,L3
;P1.2等于1跳转到L3
MOV
A,#08H ;将第三行的行值送入ACC
AJMP
LK
;跳转到键值处理程序
|
L3: JB P1.3,NEXT
;P1.3等于1跳转到NEXT处
MOV
A,#0cH
;将第四行的行值送入ACC
LK: ADD A,R4
;行值与列值相加后的键值送入A
PUSH
ACC
;将A中的值送入堆栈暂存
K4: LCALL DELAY2
;调用延时去抖动程序
LCALL
KS
;调用按键检测程序
JNZ
K4
;按键没有松开继续返回检测
POP
ACC ;将堆栈的值送入ACC
RET
NEXT:
INC
R4 ;将列值加一
MOV
A,R2
;将R2的值送入A
JNB
ACC.7,KEY ;扫描完至KEY处进行下一扫描
RL A
;扫描未完将A中的值右移一位进行下一列的扫描
MOV
R2,A ;将ACC的值送入R2暂存
AJMP K3
;跳转到K3继续
KS: MOV P1,#0FH
;将P1口高四位置0低四位值1
MOV
A,P1 ;读P1口
XRL
A,#0FH ;将A中的值与A中的值相异或
RET
;子程序返回
DELAY2:
;40ms延时去抖动子程序
MOV
R5,#08H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ
R5,L7
RET
tab:
db 28h,34h,28h,34h,0a9h,60h,20h,7ah,
20h,21h,61h,74h,30h,62h,0a2h,7eh
;0h0hc9878654a321
轮流显示键盘因为无法表达*# 就用H表示,B用8表示
end
|