📄 44keyboard.txt
字号:
ORG 00H
START: MOV R4,#04H ;清除30H到33H的地址
MOV R0,#30H
CLEAR: MOV @R0,#00H
INC R0
DJNZ R4,CLEAR
L1: MOV R3,#0F7H ;扫描初值(P1-3=0)
MOV R1,#00H ;取码指针
L2: MOV A,R3 ;开始扫描
MOV P0,A ;将扫描值输出至P0
MOV A,P0 ;读入P1值,判断是否有按键按下?
MOV R4,A ;存入R4,以判断是否放开
SETB C ;C=1
MOV R5,#04H ;扫描P04-P07
L3: RLC A ;将按键值左移一位
JNC KEYIN ;判断C=0?有键按下则C=0,跳至KEYIN
INC R1 ;C=1则表示没有键按下,将取码指针值加1
DJNZ R5,L3 ;4列扫描完了吗?
CALL DISP ;调用显示子程序
MOV A,R3 ;扫描值载入
SETB C ;C=1
RRC A ;扫描下一行(P03-P01)
MOV R3,A ;存回扫描寄存器
JC L2 ;C=1?是则P00没有扫描到
JMP L1 ;C=0则4行已扫描完毕
KEYIN: MOV R7,#60H ;消除抖动
D2: MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P0 ;读入P0值
XRL A,R4 ;与上次读入值作比较
JZ D3 ;ACC=0则相等,表示按键未放
MOV A,R1 ;按钮已放开,取码指针载入累加器
MOV DPTR,#TABLE;数据指针指到TABLE
MOVC A,@A+DPTR ;至TABLE取码
XCH A,30H ;当前按键值存入(30H)
XCH A,31H ;旧(30H)值存入(31H)
XCH A,32H ;旧(31H)值存入(32H)
XCH A,33H ;旧(32H)值存入(33H)
CALL DISP ;调用显示子程序
JMP L1
DISP: MOV A,33H
ADD A,#30H ;D4数据值加上74LS138扫描值
MOV P1,A ;显示D4
CALL DELAY ;扫描延时
MOV A,32H
ADD A,#20H ;D3数据值加上74LS138扫描值
MOV P1,A ;显示D3
CALL DELAY ;扫描延时
MOV A,31H
ADD A,#10H ;D3数据值加上74LS138扫描值
MOV P1,A ;显示D3
CALL DELAY ;扫描延时
MOV A,30H
ADD A,#00H ;D3数据值加上74LS138扫描值
MOV P1,A ;显示D3
CALL DELAY ;扫描延时
RET
DELAY: MOV R7,#06 ;显示器扫描时间
D1: MOV R6,#248
DJNZ R6,$
DJNZ R7,D1
RET
ORG 300H
TABLE: DB 0CH,08H,04H,00H
DB 0DH,09H,05H,01H
DB 0EH,0AH,06H,02H
DB 0FH,0BH,07H,03H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -