主题:[讨论]关于数码管显示问题!!!!急急急!!!!!
小牛斑斑
[专家分:1210] 发布于 2008-10-07 10:09:00
display:
mov r0,#dbuf
mov r1,#temp
mov r2,#6
mov dptr,#segtab
dp00:
mov a,@r0
movc a,@a+dptr
mov @r1,a
inc r1
inc r0
djnz r2,dp00
disp0:
mov r0,#temp ;在数码管上显示出温度
mov r1,#6
mov r2,#01h
dp01:
mov a,@r0
cjne r2,#02h,next
orl a,#80h
next:cjne r2,#10h,next1
orl a,#80h
next1:
cpl a
mov p0,a
mov a,r2
mov p1,a
lcall delay750ms ;//这里有个延迟程序(问题所在)
mov a,r2
rl a
mov r2,a
inc r0
djnz r1,dp01
ret
segtab:
db 3fh,06h,5bh,4fh,66h
db 6dh,7dh,07h,7fh,6fh
当我延迟1ms的时候在仿真时可以正常显示,但是当延迟750ms时就不能显示了(好像处于死机状态),这是为什么呢??和什么有关系
还有我在Proteus上仿真成功,但把程序下载到到单片机上时就不能显示,原因是什么呢??
急急急~~~~~~~~~~~
谢谢各位
回复列表 (共6个回复)
沙发
cnhanxiao [专家分:450] 发布于 2008-10-07 13:22:00
动态刷新方式显示?没硬件线路,而且程序实在不好读。延时不是定时器延时吧?
感觉是否需要开关一下显示——动态刷屏需要开关的,不然会造成不显示的。
给你一段我写的,仅供参考。程序是利用串口中断把接收的两字节数字,用4个
LED数码管显示出来。显示部分代码如下,注意体会开关显示及延时。不精确的
延时,没必要用定时器。还有,也别调用子程序。
;显示四字符
delay EQU 18h
;关显示
MOV P0,#00h
MOV P2,#00h
;初始化要显示的BCD码
MOV R6,#88h
MOV R7,#88h
;初始化串行通讯方式
MOV PCON,#80h
MOV SCON,#0D8h
SETB ES
SETB EA ;开中断,中断服务程序开始接收数据
;
;R6、R7:中断程序存放的要显示的BCD码(R6中为高位,R7中为低位);
MOV DPTR,#tab ;DPTR指向字型码表
_scan:
MOV A,R6 ;取高位BCD码数据
SWAP A
ANL A,#0Fh ;取高4位值
MOVC A,@A+DPTR ;译码
MOV P2,A ;送显示码
MOV P0,#10000000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
;
MOV A,R6 ;取高位BCD码数据
NOP
ANL A,#0Fh ;取低4位值
MOVC A,@A+DPTR ;译码
MOV P2,A ;送显示码
MOV P0,#01000000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
;
MOV A,R7 ;取低位BCD码数据
SWAP A
ANL A,#0Fh ;取高4位值
MOVC A,@A+DPTR ;译码
MOV P2,A ;送显示码
MOV P0,#00100000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
;
MOV A,R7 ;取低位BCD码数据
NOP
ANL A,#0Fh ;取低4位值
MOVC A,@A+DPTR ;译码
MOV P2,A ;送显示码
MOV P0,#00010000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
;
SJMP _scan
tab: DB 0FCh,060h,0DAh,0F2h,066h,0B6h,0BEh,0E0h,0FEh,0F6h
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
你很幸福啊,还有仿真机可用。俺都是直接上单片机,好在测试技巧多,呵呵。
[b][color=008080][size=4]问题解决没解决,都给个回复,不然以后就没人理会你了:)[/size][/color][/b]
板凳
小牛斑斑 [专家分:1210] 发布于 2008-10-09 08:45:00
我是不明白,我的电路有问题,可以显示了。但对于第一个问题还是不懂
3 楼
小牛斑斑 [专家分:1210] 发布于 2008-10-09 09:19:00
MOV P0,#00100000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
;
MOV A,R7 ;取低位BCD码数据
NOP
ANL A,#0Fh ;取低4位值
MOVC A,@A+DPTR ;译码
MOV P2,A ;送显示码
MOV P0,#00010000b ;开显示
MOV R3,#delay
DJNZ R3,$ ;延时
MOV P0,#00000000b ;关显示
为什么要用开显示,关显示呢???
4 楼
cnhanxiao [专家分:450] 发布于 2008-10-09 09:55:00
动态刷屏,要保证每个字符都有一定的显示时间,利用LED发光滞留和人的眼睛的视觉暂留,完成LED显示(调整延时保证亮度)。其实电视、电脑显示器(包括液晶)都是这个道理。
仿真只是程序通过。实际情况下首先电路一定要正确,还要保证晶振起振、单片机真的复位等,然后才能观察程序是否正确。
还有,用最小化原则测试,比如程序直接“单片机+显示”这样测试,暂时抛弃程序中其他部分程序。显示是观察单片机系统的眼睛,先要能看见才好继续的:)
ds18b20我没用过,呵呵,精度如何?价位?
5 楼
小牛斑斑 [专家分:1210] 发布于 2008-10-09 10:17:00
我的显示程序通过,但把程序拟合到一块就不行了,真郁闷
6 楼
cnhanxiao [专家分:450] 发布于 2008-10-09 10:29:00
谢谢加分!
对可编程芯片编程,一定要耐心+耐心+耐心。把资料彻底吃透,有时还要合拍。
祝你好运!
我来回复