📄 8155_key.asm
字号:
;FOR EAT598
;---------------------------------------------------------
C8155 EQU 0F100H ;8155命令口地址,确保A8=1
P8155A EQU 0F101H ;8155 PA口地址
P8155B EQU 0F102H ;8155 PB口地址
P8155C EQU 0F103H ;8155 PC口地址
KEYVAL EQU 30H ;读到的键码
;---------------------------------------------------------
ORG 0000H
SJMP START
ORG 0030H
START:
MOV SP,#60H
LCALL DELAY
MOV KEYVAL,#00H ;置显示初始值
MOV DPTR,#C8155
MOV A,#0DH ;PB口输入,PA,PC口输出
MOVX @DPTR,A
MOV DPTR,#P8155C
MOV A,#00H
MOVX @DPTR,A
KB_DIS:
LCALL RD_KB ;读键子程序
LCALL DISP ;显示子程序
SJMP KB_DIS ;循环扫描
;---------------------------------------------------------
DISP:
MOV DPTR,#P8155A ;显示键值
MOV A,KEYVAL
MOVX @DPTR,A
RET
;---------------------------------------------------------
;读取键盘子程序
RD_KB:
MOV A,#02H ;键盘扫描第一行
MOV DPTR,#P8155C
MOVX @DPTR,A
MOV DPTR,#P8155B
MOVX A,@DPTR
CJNE A,#0FFH,KEY_L0 ;判键是否按下,有键转AA
SJMP KEY_L1 ;无键转第二行
KEY_L0:
LCALL DELAY ;延时消抖
MOV DPTR,#P8155B ;读键值
MOVX A,@DPTR
MOV R1,#00H
CJNE A,#0FFH,KEYCAL ;计算键值
KEY_L1:
MOV A,#01H ;扫描第二行
MOV DPTR,#P8155C
MOVX @DPTR,A
MOV DPTR,#P8155B
MOVX A,@DPTR
CJNE A,#0FFH,J_KEY_L1;判键是否按下,有键转CC
SJMP NOKEY ;无键转结束
J_KEY_L1:
LCALL DELAY ;延时消抖
MOV DPTR,#P8155B ;读键值
MOVX A,@DPTR
MOV R1,#08H
CJNE A,#0FFH,KEYCAL ;计算键值
SJMP NOKEY ;无键按下
KEYCAL: ;计算键码
MOV R0,#08H
SHIFT:
RRC A
JNC CALC
INC R1
DJNZ R0,SHIFT
CALC: ;换算显示码
MOV DPTR,#LEDSEG
MOV A,R1
MOVC A,@A+DPTR
MOV KEYVAL,A
SJMP KEYWAIT
NOKEY:
SJMP KEYEXIT
KEYWAIT:
MOV DPTR,#P8155B ;等待键释放
MOVX A,@DPTR
CJNE A,#0FFH,KEYWAIT
KEYEXIT:RET
;---------------------------------------------------------
DELAY: MOV R0,#0H ;延时20MS子程序
DELAY1:
MOV R1,#27H
DJNZ R1,$
DJNZ R0,DELAY1
RET
;---------------------------------------------------------
;LED显示常数表
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F
;---------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -