📄 ddisp.asm
字号:
;该程序实现在六个数码管上显示123456,显示停留5秒钟
;然后以0.5秒为间隔闪动5次,不断循环。
;显示方式为动态显示
LED1 EQU 8000H ;数码管段驱动器的地址
LED2 EQU 9000H ;数码管位驱动器的地址
BUFFER EQU 30H ;显示缓冲区首地址
FLASH BIT 00H ;闪烁标志
ORG 0
LJMP START
ORG 0BH
LJMP DISP
ORG 30H
START: MOV SP,#60H
MOV TMOD,#01H ;设T0为方式1
MOV TH0,#0D8H ;10ms定时初值
MOV TL0,#0F0H
SETB ET0 ;允许T0中断
SETB EA ;开CPU总中断
SETB TR0 ;启动T0计数
SETB FLASH ;使显示常亮
MOV R0,#BUFFER
MOV R2,#6 ;显示缓冲区单元数
MOV A,#1
LOOP1: MOV @R0,A ;给显示缓冲区赋值
INC A
INC R0
DJNZ R2,LOOP1
LOOP: LCALL DELAY5S ;延时5秒钟
MOV R3,#10 ;闪烁10次
LL1: LCALL DELAY ;延时0.5秒
CPL FLASH ;闪烁标志取反实现显示的闪烁
DJNZ R3,LL1
SETB FLASH ;闪烁标志置1,实现显示常亮
SJMP LOOP
;T0中断服务程序,实现每10ms一次的定时动态显示功能
;当FLASH标志为1时,将显示缓冲区的16进制数显示出来
;当FLASH标志为0时,熄灭所有显示器
;使用寄存器为A、R0-R6和DPTR
DISP: PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
SETB RS0 ;选择1区工作寄存器
CLR RS1
CLR TR0 ;停止T0计数
MOV TH0,#0D8H ;10ms定时初值
MOV TL0,#0F0H
SETB TR0 ;启动T0计数
MOV R0,#BUFFER
MOV R1,#0FEH ;位码初值
MOV R2,#6 ;一共有6个数码管
MOV DPTR,#LED1 ;送数码管段驱动器地址
MOV R3,DPH ;存段驱动器地址
MOV R4,DPL
MOV DPTR,#LED2 ;送数码管位驱动器地址
MOV R5,DPH ;存位驱动器地址
MOV R6,DPL
JNB FLASH,DISP2 ;若闪烁标志为0,则转移
DISP1: MOV A,@R0 ;取要显示数据
MOV DPTR,#TAB ;指向显示段码的码表
MOVC A,@A+DPTR ;查表将需要显示的数据变换为显示段码
MOV DPH,R3 ;恢复段驱动器地址
MOV DPL,R4
MOVX @DPTR,A ;段码送数码管段驱动器
MOV A,R1 ;取显示位码
MOV DPH,R5 ;恢复位驱动器地址
MOV DPL,R6
MOVX @DPTR,A ;点亮一个数码管
RL A ;指向下一位数码管
MOV R1,A ;存位码
INC R0 ;指向下一个要显示的数据
LCALL D1MS ;点亮数码管1ms
DJNZ R2,DISP1 ;没有显示完则继续
DISP3: POP DPL
POP DPH
POP ACC
POP PSW
RETI
DISP2: MOV DPH,R5 ;恢复位驱动器地址
MOV DPL,R6
MOV A,#0FFH
MOVX @DPTR,A ;熄灭数码管
SJMP DISP3
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
;延时1ms子程序
;使用寄存器R7
D1MS: MOV R7,#250
D1MS1: NOP
NOP
DJNZ R7,D1MS1
RET
;延时0.5秒子程序
;使用寄存器:R5、R6和R7
DELAY: MOV R5,#2 ;延时0.5秒子程序
D1: MOV R6,#250
D2: MOV R7,#250
D3: NOP
NOP
DJNZ R7,D3
DJNZ R6,D2
DJNZ R5,D1
RET
;延时5秒子程序
;使用寄存器:R4
DELAY5S:MOV R4,#10 ;延时5秒子程序
DD1: LCALL DELAY
DJNZ R4,DD1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -