📄 51doule.asm
字号:
SDA BIT P1.0
CLK BIT P1.1
KDKEY BIT P1.2 ;定义键盘检测位
FRIT EQU P1 ;定义P1口
DBUF0 DATA 40H ;显示缓冲区首址
DBUF1 DATA 41H
DBUF2 DATA 42H
DBUF3 DATA 43H
DBUF4 DATA 44H
BUF EQU 45H ;存放中间变量
LENTH EQU 05H ;显示缓冲区长度
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
MOV SP,#60H
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
MOV TMOD,#20H ;设置T1为方式2
MOV TH1,#0FDH ;设置波特率为9600
MOV TL1,#0FDH
MOV SCON,#50H ;设置串口位方式1
MOV PCON,#00H
SETB TR1
UP:
ACALL DISPLAY
JB RI,URXD
SETB KDKEY
MOV A,#00H
ACALL TXDBYTE
JB KDKEY,UP
ACALL KEY
UTXD:
MOV A,R1
MOV SBUF,A
WAIT: JBC TI,UP
AJMP WAIT
AJMP UP
URXD: MOV A,SBUF
RXDRET:
MOV 40H,A
MOV 41H,A
MOV 42H,A
MOV 43H,A
MOV 44H,A
CLR RI
AJMP UP
TXDBYTE:
PUSH PSW
PUSH ACC
MOV R3,#08H
TXDUP: RLC A
MOV SDA,C
CLR CLK
SETB CLK
DJNZ R3,TXDUP
POP ACC
POP PSW
RET
KEY:
SETB KDKEY
MOV R1,#00H ;赋初值
MOV A,#0FEH ;是,则判断其键值
KEYZHI: ACALL TXDBYTE ;是此键吗?
JNB KDKEY,KEYRET ;是,则保存退出
RL A ;否则检测下一个键
INC R1
CJNE A,#7FH,KEYZHI ;检测完了吗?
KEYRET:
MOV FRIT,#0FFH
RET
DISPLAY:
MOV R2, #7FH ;给位码初值
MOV R0, #DBUF0 ;给显示缓冲区首值
ZCQ: MOV A, @R0
LCALL TAB ;查表取段码
ACALL TXDBYTE ;送段码输出
MOV BUF, FRIT
ANL BUF, #07H
MOV A, R2 ;保证不影响其它位送位码
ORL A, BUF
MOV FRIT, A
LCALL DELAY ;调延时子程序
MOV FRIT,#0FFH
INC R0
MOV A, R2
RR A
MOV R2, A
CJNE R0, #45H, ZCQ;5位显示完吗?
MOV R0, #40H
MOV R2, #7FH
MOV FRIT, #0FFH
RET
;延时子程序
DELAY: MOV R7, #50H ;12M时钟下延时1MS
DELAY0: MOV R6, #10H
DELAY1: DJNZ R6, DELAY1
DJNZ R7, DELAY0
RET
;查表子程序
TAB: INC A ;基地址加一
MOVC A, @A+PC ;查段码表,取其相应的段码
RET
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,80H,090H,088H,083H,0c6H,0a1H,86H,8eH,0bfH,89H,8CH
;(0-9 A-F)共阳段码表
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -