📄 aaa.asm
字号:
ORG 00H
LJMP START
START:MOV SP,#60H
MOV SCON,#50H ;设置串行口工作方式为方式1
MOV TMOD,#20H ;设置波特率为2400
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
ST: MOV R4,#06H ;设置数码管地址为31H到35H
MOV R0,#30H
CLEAR:MOV @R0,#00H ;数码管初始显示为0
INC R0
DJNZ R4,CLEAR
SCAN0:MOV R3,#0F7H ;设置扫描初始值(令P13=0)
SCAN: JBC RI,UART ;判断RI=1?是,接收中断,跳转到接收子程序
CALL DISP ;否则,则调用显示
MOV R1,#00H
SCAN1:MOV A,R3 ;扫描值存入累加器中
MOV P1,A ;将扫描送到P1口
MOV A,P1
MOV R4,A ;将P1口数据存入R4,以备比较使用
SETB C ;置位进位
MOV R5,#04H ;扫描四列
L1: RLC A ;带进位左移一位,扫描下一列
JNC KEYIN ;C=0?是,扫描完毕跳到KEYIN
INC R1 ;取码指针加1
DJNZ R5,L1 ;实现列的扫描
MOV A,R3 ;重新赋值
SETB C ;置位进位C
RRC A ;带进位右移一位
MOV R3,A
JC SCAN1 ;扫描行
LJMP SCAN0
KEYIN:MOV R7,#10
D2: MOV R6,#248 ;延时
DJNZ R6,$
DJNZ R7,D2
D3: MOV A,P1 ;判断按键是否松开
XRL A,R4
JZ D3
MOV A,R1
MOV DPTR,#TABLE ;到TABLE中取值
MOVC A,@A+DPTR
ADD A,#30H ;转换成ASCII码
MOV SBUF,A ;送至PC机
SUBB A,#30H ;还原为数字
MOV R7,A ;将送出的数据,在数码管上显示
LCALL L4
LJMP SCAN0
UART: MOV A,SBUF ;接收子程序
SUBB A,#30H
MOV R7,A
CALL L4
CLR RI
LJMP SCAN
L4: MOV A,R7 ;不是,则为数字建
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)
LCALL DISP ;调用显示子程序
RET
DISP: MOV A,35H
ADD A,#50H ;D6数据值加上74LS138扫描值
MOV P0,A ;显示D6
LCALL DELAY1 ;扫描延时
MOV A,34H
ADD A,#40H ;D5数据值加上74LS138扫描值
MOV P0,A ;显示D5
LCALL DELAY1 ;扫描延时
MOV A,33H
ADD A,#30H ;D4数据值加上74LS138扫描值
MOV P0,A ;显示D4
LCALL DELAY1 ;扫描延时
MOV A,32H
ADD A,#20H ;D3数据值加上74LS138扫描值
MOV P0,A ;显示D3
LCALL DELAY1 ;扫描延时
MOV A,31H
ADD A,#10H ;D2数据值加上74LS138扫描值
MOV P0,A ;显示D2
LCALL DELAY1 ;扫描延时
MOV A,30H
ADD A,#00H ;D1数据值加上74LS138扫描值
MOV P0,A ;显示D1
LCALL DELAY1 ;扫描延时
RET
DELAY1: MOV R7,#06 ;显示器扫描时间
D11: MOV R6,#10
DJNZ R6,$
DJNZ R7,D11
RET
TABLE:DB 01H,02H,03H,04H ;定义外部键盘的值
DB 05H,06H,07H,08H
DB 09H,0AH,0BH,0CH
DB 0DH,0EH,0FH,00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -