问一个简单得不能再简单的问题,数码管动态显示

[复制链接]
4738|13
 楼主| soler_z 发表于 2009-9-5 19:16 | 显示全部楼层 |阅读模式
今天用实验版做个动态数码管显示的小实验,发现显示有问题,debug跟实际差别很大。
大家帮忙看看吧,谢谢了。。。
  1. /*********************************************************
  2. P2.6接段选锁存器74LS573 LE脚,锁存器Q0~7接8个数码管的a~f
  3. P2.7接位选锁存器74LS573 LE脚,锁存器Q0~7接各个数码管的共阴极
  4. P0口接两个锁存器D0~7。
  5. -----------------------------
  6. 我想让它动态显示数值8个2,程序烧写进去之后,发现只有最后一个
  7. 数码管显示2,其他都不显示,大家帮忙看看。问题出现在哪?
  8. **********************************************************/
  9. #include <REG52.H>
  10. #include <intrins.h>
  11. sbit D_SEG = P2^6;
  12. sbit D_BIT = P2^7;
  13. static unsigned char LED = 0x7f;

  14. void main(void)
  15. {
  16.         unsigned char i;
  17.         while(1)
  18.         {
  19.                 for(i = 0; i<9; i++)
  20.                 {
  21.                         LED = _crol_(LED, 1); //位选左移一位
  22.                         D_BIT = 1;         //位选锁存器锁存
  23.                         P0 = LED;         //选择8个数码管中的一个
  24.                         D_BIT = 0;         //位选锁存器输出
  25.                         D_SEG = 1;          //段选锁存器锁存
  26.                         P0 = 0X5B;          //输出段码显示
  27.                         D_SEG = 0;          //段选锁存器输出
  28.                         delay(500);         //延时
  29.                        
  30.                 }               
  31.         }
  32. }
  33. //发现段选和位选锁存器D_BIT        ,D_SEG 先置1只会显示最后一个数码管,先置0会显示三个数码管
  34. //延时程序双层for循环

李冬发 发表于 2009-9-5 20:31 | 显示全部楼层
用时钟中断来显示吧
jt4117 发表于 2009-9-5 20:40 | 显示全部楼层
 楼主| soler_z 发表于 2009-9-5 21:46 | 显示全部楼层
嗯,利用中断的话很简单就搞定了,但是我只是有点不明白为啥上面的代码同样也是利用延时而显示结果就是不一样。
程序匠人 发表于 2009-9-6 09:07 | 显示全部楼层
试着 帮你改了一下 :

void main(void)

{

        unsigned char i;

        P0 = 0X00;          //关闭段码显示
        D_SEG = 0;          //段选锁存器输出
        D_SEG = 1;          //段选锁存器锁存
        

        while(1)

        {

                for(i = 0; i<9; i++)

                {


                        LED = _crol_(LED, 1); //位选左移一位
                        P0 = LED;         //选择8个数码管中的一个
                        D_BIT = 0;         //位选锁存器输出
                        D_BIT = 1;         //位选锁存器锁存

                        P0 = 0X5B;          //输出段码显示
                        D_SEG = 0;          //段选锁存器输出
                        D_SEG = 1;          //段选锁存器锁存
                        delay(500);         //延时

                        P0 = 0X00;          //关闭段码显示
                        D_SEG = 0;          //段选锁存器输出
                        D_SEG = 1;          //段选锁存器锁存
                    

                }               

        }

}
nenozyp 发表于 2009-9-6 10:04 | 显示全部楼层
本帖最后由 nenozyp 于 2009-9-6 10:09 编辑

个人估计LZ是锁存器理解有点问题。源程序中位选后置0,就是说位选随着段的数据变化的,P0最后都设置成0x5B了,就是再加上延迟;这时位选都是0x5B,有可能显示后一位了。
  至于正确的方法,匠人已经给出了程序。动态扫描进行位选择时候,最好把数据段关闭防止干扰,这是他程序后面加的东西。
程序匠人 发表于 2009-9-7 20:37 | 显示全部楼层
楼主,匠人回你的贴已经超过24小时了。也许你已经忘记了这个贴,而匠人却还记挂。

不管问题是否解决,你都应该回应一下。匠人不求你的感谢和回报,只求你一个有始有终的态度。
xwj 发表于 2009-9-7 20:42 | 显示全部楼层
LZ,你可要对匠人负责啊,
做人要有始有终,更不要辜负了匠人JJ对你的挂念啊~~~
;P
zyok 发表于 2009-9-7 20:54 | 显示全部楼层
ningling_21 发表于 2009-9-7 22:39 | 显示全部楼层
也许是忘记了......
dudongdao 发表于 2009-9-8 08:08 | 显示全部楼层
人肉搜索,找出来给匠人赔礼道歉~
LYXQ 发表于 2009-9-8 08:33 | 显示全部楼层
for(i = 0; i<8; i++)

                {


                        LED = _crol_(LED, 1); //位选左移一位
                        P0 = LED;         //选择8个数码管中的一个
                        D_BIT = 1;         //位选锁存器输出
                        D_BIT = 0;         //位选锁存器锁存

                        P0 = 0X5B;          //输出段码显示
                        D_SEG = 1;          //段选锁存器输出
                        D_SEG = 0;          //段选锁存器锁存
                        delay(500);         //延时

                                          

                }               
另外就是,左循环似乎初值0xfe合理些。要是0x7f那最好是右循环
OUCHANGHUA 发表于 2010-8-4 16:24 | 显示全部楼层
:)支持
sccky 发表于 2010-8-5 11:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部