📄 aa.asm
字号:
ORG 00H
START: MOV R4,#06H ;清除30h-35h的地址,让数码管
MOV R0,#30H 初始显示全部为0
CLEAR: MOV @R0,#00H
INC R0
DJNZ R4,CLEAR
L1: MOV R3,#0F7H ;扫描初值(p13=0)
MOV R1,#00H ;取码指针
L2: MOV A,R3 ;开始扫描
MOV P1,A ;将扫描值输出至p1
MOV A,P1 ;读入p1值,判断是否有键按下
MOV R4,A ;存入R4,判断是否有键放开
SETB C ;c=1
MOV R5,#04H ;扫描p14-p17
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 ;右移扫描值,扫描下一行(p13-p10)
MOV R3,A ; 存回扫描寄存器
JC L2 ;从c=1?是,则p10尚未扫描到
JMP L1 ;c=0则4行已扫描完毕
KEYIN: MOV R7,#60 ;消除抖动
D2: MOV R6,#248
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P1 ;读入p1值
XRL A,R4 ;与上次读入值作比较
JZ D3 ;acc=0则相等,则表示按钮未放
MOV A,R1 ;按键已放开,取码指针载入累加器
MOV DPTR,#TABLE ;数据指针指到TALBLE
MOVC A,@A+DPTR ;至TALBLE取码
XCH A,30H ; 现按键值存入(30H)
XCH A,31H ;旧(30H)值存入(31H)
XCH A,32H ;旧(31H)值存入(32H)
XCH A,33H ;旧(32H)值存入(33H)
XCH A,34H ;旧(33H)值存入(34H)
XCH A,35H ;旧(34H)值存入(35H)
CALL DISP ;调用显示子程序
JMP L1 ;开始重新的扫描
DISP: MOV A,35H
ADD A,#50H ;D6数据值加上74LS138扫描值
MOV P0,A ;显示D6(靠近单片机第一个数码管)
CALL DELAY ;扫描延时
MOV A,34H
ADD A,#40H ;D5数据值加上74LS138扫描值
MOV P0,A ;显示D5
CALL DELAY ;扫描延时
MOV A,33H
ADD A,#30H ;D4数据值加上74LS138扫描值
MOV P0,A ;显示D4
CALL DELAY ;扫描延时
MOV A,32H
ADD A,#20H ;D3数据值加上74LS138扫描值
MOV P0,A ;显示D3
CALL DELAY ;扫描延时
MOV A,31H
ADD A,#10H ;D2数据值加上74LS138扫描值
MOV P0,A ;显示D2
CALL DELAY ;扫描延时
MOV A,30H
ADD A,#00H ;D1数据值加上74LS138扫描值
MOV P0,A ;显示D1
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 + -