📄 key.asm
字号:
KEYBUF EQU 30H
ORG 0
LJMP START
ORG 3
LJMP KEYSCAN
ORG 30H
START: MOV SP,#60H
SETB IT0
SETB EX0
MOV P1,#0FH
SETB EA
MOV KEYBUF,#47H ;将“G”送显示缓冲区,以便熄灭显示器
LOOP: LCALL DISP
SJMP LOOP
;显示程序
;将KEYBUF单元的ASCII码送数码管显示
;可以显示的ASCII码数据0-9,A-F。若ASCII码为“G”(47H)则显示熄灭
DISP: MOV A,KEYBUF
CLR C
SUBB A,#3AH
JC DISP1
MOV A,KEYBUF
SUBB A,#37H
SJMP DISP2
DISP1: MOV A,KEYBUF
ANL A,#0FH
DISP2: MOV DPTR,#DISP_TAB
MOVC A,@A+DPTR
ANL A,#7FH
MOV P0,A
RET
DISP_TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
;键盘扫描程序
;键码存在KEYBUF单元,格式为ASCII码
KEYSCAN:PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
CLR RS1
SETB RS0 ;选择1区工作寄存器
LCALL DELAY
MOV A,P1
CPL A
ANL A,#0FH
JZ FINISH
MOV DPTR,#TAB
MOV P1,#0EFH ;扫描第一行
MOV P1,#0EFH
MOV A,P1
CPL A
ANL A,#0FH
JZ K1 ;第一行没键按下,则扫描第二行
SJMP KEND
K1: MOV P1,#0DFH ;扫描第二行
MOV P1,#0DFH
MOV A,P1
CPL A
ANL A,#0FH
JZ K2 ;第二行没键按下,则扫描第三行
ADD A,#9
SJMP KEND
K2: MOV P1,#0BFH ;扫描第三行
MOV P1,#0BFH
MOV A,P1
CPL A
ANL A,#0FH
JZ K3
ADD A,#18
SJMP KEND
K3: MOV P1,#7FH
MOV P1,#7FH
MOV A,P1
CPL A
ANL A,#0FH
JZ K4
ADD A,#27
KEND: MOVC A,@A+DPTR
MOV KEYBUF,A
SJMP FINISH
K4: MOV KEYBUF,#47H ;'G'送键盘缓冲区,以便将显示器熄灭
FINISH: MOV P1,#0FH ;为下一次扫描作准备
POP DPL
POP DPH
POP ACC
POP PSW
RETI
TAB: DB 00H,30H,31H,00H,32H,00H,00H,00H,33H
DB 00H,34H,35H,00H,36H,00H,00H,00H,37H
DB 00H,38H,39H,00H,41H,00H,00H,00H,42H
DB 00H,43H,44H,00H,45H,00H,00H,00H,46H
DELAY: MOV R6,#20
L1: MOV R7,#250
L2: NOP
NOP
DJNZ R7,L2
DJNZ R6,L1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -