|
求教:用数码管动态显示法,编汇编程序,使6位数码管显示从000000到FFFFFF,时间间隔1s,请大佬指点一下,或者帮忙修改一下下面的程序(次程序是显示:000000-999999,辛苦修改成000000-FFFFFF)
这3张图片是实验书上的,第4张是我画的Proteus原理图(附件的程序是000000-999999显示的参考程序),但是编译好了之后用我的原理图仿真后只显示000000,有问题不知道什么原因,请指点谢谢!是不是我画的原理图哪里不对?原理图如果对的话,把上面的000000-999999的程序hex写进51单片机应该显示000000-999999才对啊,请高手指点一下我的原理图或者程序应该怎么改?(老师的要求是按照实验书上的接法)谢谢!
下面是000000-999999的参考汇编程序
ORG 0000H
LJMP MAIN
ORG 0030H ;MAINN主程序
MAIN: MOV SP, #70H ;设置堆栈SP
MOV 30H, #00H ;设置计算区(30H-32H)的初值
MOV 31H, #00H
MOV 32H, #00H
SEND: LCALL GIVE ;计算区的值送至显示缓冲区
MOV R7, #159 ;显示时间初值
SHOW: LCALL DISP ;调用显示子程序
DJNZ R7, SHOW ;显示时间到?
LCALL ADD1 ;计算区的值加1
LJMP SEND
;GIVE 送数子程序
GIVE: MOV R0, #45H ;显示缓冲区末址
MOV R1, #32H ;计算区末址
MOV R2, #03H
GETBIT: MOV A, @R1 ;计算区的值送显示缓冲区
ANL A, #0FH
MOV @R0, A
DEC R0
MOV A, @R1
ANL A, #0F0H
SWAP A
MOV @R0, A
DEC R0
DEC R1
DJNZ R2, GETBIT ;送数送完了吗?
RET
;ADD1: 加1子程序
ADD1: MOV R1, #32H ;计算区末址
MOV R2, #03H
SETB C
BCD1: CLR A
ADDC A, @R1
DA A ;调整相加结果为十进制
MOV @R1, A ;保存结果
DEC R1 ;地址指针减1
DJNZ R2, BCD1
RET
;DISP显示子程序
DISP: MOV R0, #40H ;显示缓冲区首址
MOV R2, #20H ;初始位码
MOV R3, #06H
CLOSE: CLR A ;关显示
MOV DPTR, #8002H
MOVX @DPTR, A
MOV A, @R0 ;查表得段码
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV DPTR, #8004H ;送段码
MOVX @DPTR, A
MOV DPTR, #8002H ;送位码
MOV A, R2
MOVX @DPTR, A
LCALL DELAY ;延时1毫秒
INC R0 ;显示缓冲区地址指针加1
RR A ;位码右移
MOV R2, A
DJNZ R3, CLOSE ;6位数码管显示完了吗?
RET
;DELAY 延时子程序 晶体震荡频率为12MHz时,延时约1毫秒
DELAY: MOV R4, #5
DELAY1: MOV R5, #100
DJNZ R5, $
DJNZ R4, DELAY1
RET
;TABLE 段码表对应0-F的段码
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
|
|