org
0000h
ajmp main org 0030h main: mov
dptr,#tab ;将表头放入DPTR lcall
key
;调用键盘扫描程序 movca,@a+dptr ;查表后将键值送入ACC mov
p0,a
;将Acc值送入P0口 CLR
P2.1
;开显示 ljmpmain
;返回反复循环显示 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 |