51单片机 汇编程序 0000-9999

2025-02-28 04:39:58
推荐回答(1个)
回答1:

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV 70H, #0 ;显示缓冲区,你可以理解为一个数组,70H~73H
MOV 71H, #0
MOV 72H, #0
MOV 73H, #0
MOV 74H, #12H ;计数单元.
MOV 75H, #34H ;都是 BCD 码.
;-------------------------------
M_LOOP:
LCALL DISP ;调用显示子程序
JNB P3.2, JIA_YI ;P3.2为低转加1程序段
JNB P3.3, QING_L ;P3.3为低转清0程序段
AJMP M_LOOP ;转到M_LOOP从新开始
;-------------------------------
JIA_YI:
LCALL DISP ;调用显示
JB P3.2, M_LOOP ;P3.2为1转会主循环
MOV A, 75H ;75H(个位和十位)数送A
ADD A, #1 ;加1
DA A ;十进位调整
MOV 75H, A ;回送75H
MOV A, 74H ;74H(百位和千位)数送A
ADDC A, #0 ;带进位加0
DA A ;十进位调整
MOV 74H, A ;回送74H
J_L:
LCALL DISP ;调用显示
JNB P3.2, J_L ;P3.2为低转J_L
AJMP M_LOOP ;转主循环
;-------------------------------
QING_L:
LCALL DISP ;调用显示
JB P3.3, M_LOOP ;P3.3为高转主循环
MOV 74H, #0 ;千位百位清0
MOV 75H, #0 ;十位个位清0
AJMP M_LOOP ;转主循环
;-------------------------------
DISP:
MOV R0, #70H ;基址70H送R0
MOV A, 74H ;千位和百位送A
SWAP A ;高四位和低四位交换
ANL A, #0FH ;高四位清0
MOV @R0, A ;千位送70H
INC R0 ;R0加1变为71H
MOV A, 74H ;千位和百位送A
ANL A, #0FH ;屏蔽高四位
MOV @R0, A ;百位送71H
INC R0 ;R0加1变为72H
MOV A, 75H ;十位个位送A,以下处理与上面类似
SWAP A
ANL A, #0FH
MOV @R0, A
INC R0
MOV A, 75H
ANL A, #0FH
MOV @R0, A

MOV DPTR, #D_TAB ;表首地址送DPTR
MOV R2, #254 ;R2=FEH,这是位控制码
MOV R0, #70H ;基址送R0
D_LOOP:
MOV A, @R0
MOVC A, @A+DPTR
MOV P2, #255 ;消隐.
MOV P0, A ;输出段码.
MOV P2, R2 ;输出位码.
LCALL DL_1MS
MOV A, R2
RL A ;循环左移1位
MOV R2, A
INC R0
CJNE R0, #74H, D_LOOP ;四位数没显示完转D_LOOP
RET
D_TAB:
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H, 86H, 0A1H, 86H, 8EH
;-------------------------------
DL_1MS:
DJNZ R7, $
DJNZ R7, $
RET
;-------------------------------
END