打印

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

[复制链接]
3158|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
soler_z|  楼主 | 2009-9-5 19:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天用实验版做个动态数码管显示的小实验,发现显示有问题,debug跟实际差别很大。
大家帮忙看看吧,谢谢了。。。
/*********************************************************
P2.6接段选锁存器74LS573 LE脚,锁存器Q0~7接8个数码管的a~f
P2.7接位选锁存器74LS573 LE脚,锁存器Q0~7接各个数码管的共阴极
P0口接两个锁存器D0~7。
-----------------------------
我想让它动态显示数值8个2,程序烧写进去之后,发现只有最后一个
数码管显示2,其他都不显示,大家帮忙看看。问题出现在哪?
**********************************************************/
#include <REG52.H>
#include <intrins.h>
sbit D_SEG = P2^6;
sbit D_BIT = P2^7;
static unsigned char LED = 0x7f;

void main(void)
{
        unsigned char i;
        while(1)
        {
                for(i = 0; i<9; i++)
                {
                        LED = _crol_(LED, 1); //位选左移一位
                        D_BIT = 1;         //位选锁存器锁存
                        P0 = LED;         //选择8个数码管中的一个
                        D_BIT = 0;         //位选锁存器输出
                        D_SEG = 1;          //段选锁存器锁存
                        P0 = 0X5B;          //输出段码显示
                        D_SEG = 0;          //段选锁存器输出
                        delay(500);         //延时
                       
                }               
        }
}
//发现段选和位选锁存器D_BIT        ,D_SEG 先置1只会显示最后一个数码管,先置0会显示三个数码管
//延时程序双层for循环

相关帖子

沙发
李冬发| | 2009-9-5 20:31 | 只看该作者
用时钟中断来显示吧

使用特权

评论回复
板凳
jt4117| | 2009-9-5 20:40 | 只看该作者
dsa

使用特权

评论回复
地板
soler_z|  楼主 | 2009-9-5 21:46 | 只看该作者
嗯,利用中断的话很简单就搞定了,但是我只是有点不明白为啥上面的代码同样也是利用延时而显示结果就是不一样。

使用特权

评论回复
5
程序匠人| | 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;          //段选锁存器锁存
                    

                }               

        }

}

使用特权

评论回复
6
nenozyp| | 2009-9-6 10:04 | 只看该作者
本帖最后由 nenozyp 于 2009-9-6 10:09 编辑

个人估计LZ是锁存器理解有点问题。源程序中位选后置0,就是说位选随着段的数据变化的,P0最后都设置成0x5B了,就是再加上延迟;这时位选都是0x5B,有可能显示后一位了。
  至于正确的方法,匠人已经给出了程序。动态扫描进行位选择时候,最好把数据段关闭防止干扰,这是他程序后面加的东西。

使用特权

评论回复
7
程序匠人| | 2009-9-7 20:37 | 只看该作者
楼主,匠人回你的贴已经超过24小时了。也许你已经忘记了这个贴,而匠人却还记挂。

不管问题是否解决,你都应该回应一下。匠人不求你的感谢和回报,只求你一个有始有终的态度。

使用特权

评论回复
8
xwj| | 2009-9-7 20:42 | 只看该作者
LZ,你可要对匠人负责啊,
做人要有始有终,更不要辜负了匠人JJ对你的挂念啊~~~
;P

使用特权

评论回复
9
zyok| | 2009-9-7 20:54 | 只看该作者
;P;P

使用特权

评论回复
10
ningling_21| | 2009-9-7 22:39 | 只看该作者
也许是忘记了......

使用特权

评论回复
11
dudongdao| | 2009-9-8 08:08 | 只看该作者
人肉搜索,找出来给匠人赔礼道歉~

使用特权

评论回复
12
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那最好是右循环

使用特权

评论回复
13
OUCHANGHUA| | 2010-8-4 16:24 | 只看该作者
:)支持

使用特权

评论回复
14
sccky| | 2010-8-5 11:29 | 只看该作者
支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝