回 帖 发 新 帖 刷新版面

主题:[讨论]关于数码管显示问题!!!!急急急!!!!!

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个回复)

沙发

动态刷新方式显示?没硬件线路,而且程序实在不好读。延时不是定时器延时吧?
感觉是否需要开关一下显示——动态刷屏需要开关的,不然会造成不显示的。

给你一段我写的,仅供参考。程序是利用串口中断把接收的两字节数字,用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]

板凳

我是不明白,我的电路有问题,可以显示了。但对于第一个问题还是不懂

3 楼

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 楼

动态刷屏,要保证每个字符都有一定的显示时间,利用LED发光滞留和人的眼睛的视觉暂留,完成LED显示(调整延时保证亮度)。其实电视、电脑显示器(包括液晶)都是这个道理。

仿真只是程序通过。实际情况下首先电路一定要正确,还要保证晶振起振、单片机真的复位等,然后才能观察程序是否正确。

还有,用最小化原则测试,比如程序直接“单片机+显示”这样测试,暂时抛弃程序中其他部分程序。显示是观察单片机系统的眼睛,先要能看见才好继续的:)

ds18b20我没用过,呵呵,精度如何?价位?

5 楼

我的显示程序通过,但把程序拟合到一块就不行了,真郁闷

6 楼

谢谢加分!

对可编程芯片编程,一定要耐心+耐心+耐心。把资料彻底吃透,有时还要合拍。

祝你好运!

我来回复

您尚未登录,请登录后再回复。点此登录或注册