📄 键盘显示程序.txt
字号:
ORG 0000H
MOV SP,#60H ;初始化堆
MOV B,#10 ;初始化显示为“--”
MOV B,#10
LCALL SHOWX
WAITE: MOV P1,#0FH ; 令全部列线为低电平,行线全为输入线
MOV A,P1 ;读扫描结果
CJNE A,#0FH,WAITEA ;根据扫描结果判断有无键按下,
SJMP WAITE ;有,跳到WAITEA
;无,跳回WAITE,开始新一次扫描
WAITEA: LCALL DELAYTIME ;按键延时消抖
MOV P1,#0FH ;令列线全为低电平,行线全为输入线
NOV A,P1 ;度读扫描结果
CJNE A,#0FH,SCAN ;再根据扫描结果判断有无按键按下,有跳到SCAN
SJMP WAITE ;无,跳回WAITE,开始新一次扫描
SCAN: ;扫描键盘,查出键码,得出键值并显现出来
MOV R2,#0EFH ;扫描寄存单元R3初始化为:扫描第一列(低电平有效),
;行线全为输入线
MOV R3,#0 ;窜键标志寄存单元初试化为 0
FIND: MOV P1,R2 ;扫描值送P1口
MOV A,P1 ;读扫描结果(键码)
CJNE A,02H,LOAD ;是否在这一列按下键?是,跳到LOAD
RLR2: MOV A,R2 ; 否,扫描值送A
RL A ;左移一位
MOV R2,A ;送回扫描寄存单元R2
CJNE A,#0FEH,FIND ;是否所有列都已经扫描一遍?否,跳到FIND
LCALL KEY ;是,求键值并显示
SJMP WAITE ;开始新一次扫描
LOAD:INC R3 ;窜键标志寄存单元的值加1
CJNE R3,#1,WAITE ;是否窜键?是,这一次扫描作废,开始新一次扫描
MOV R4,A ;否,当前扫描结果(键码)暂存到R4
SJMP RLR2 ;跳到RLR2,开始下一列扫描
KEY:MOV R2,#0FFH ;计算键值子程序,初始化键值寄存单元
MOV DPTR,#KEYTABLE ;向DPTR加载键码表
CHAZ:INC R2 ;键值加1
MOV A,R2 ;键值送给A
MOVC A,@A+DPTR ;查出对比键码
CJNE A,#0FFH,CHA ;搜索对比键码结束?否,跳到CHA
RET ;是,最终没找出有效键值,直接返回
CHA: CJNE A,R4,CHAZ ;对比键码于当前扫描结果(键码)一致?
;否,跳到CHAZ再搜索;是,显示出来
LCALL SHOW
RET ;返回
SHOW: MOV A,R2 ;显示键值子程序
MOV B,#10
DIV AB
SHOWX:
RET
DELAYTIME: ;50ms延时子程序
MOV TMOD,#01H
HH: MOV THO,#4CH
MOV TLO,#00H
SETB TRO
CLR TFO
NB TFO,S
CLR TRO
RET
KEYTABLE: ;键码表
DB 07EH,07DH,07BH,077H
DB 0BEH,0BDH,0BBH,0B7H
DB 0DEH,0DDH,0DBH,0D7H
DB 0EEH,0EDH,0EBH,0E7H
DB 0FFH
LEDTABLE: ;LED字型码表
DB 0FCH,060H,0DAH,0F2H,066H,0B6H
DB 0BEH,0E0H,0FEH,0E6H,002H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -