打印

关于74HC164驱动数码管显示的问题

[复制链接]
17321|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tomegeo|  楼主 | 2008-3-5 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大家帮忙讨论一下:
用164驱动数码管,一个数码管接一个164,共有六个数码管,所以用了六个164,用移位的方式送数,也就是说第一个数在最后一个数码管显示,最后一个数就在第一个数码管显示,但是每次送数时都会闪烁,我想请教一下大家有没有好办法让它不会闪烁.
(所有164的时钟线接在一起,片选线接高电平,数据线用串行的接法,也就是接到单片机的只有时钟线和数据线,单片机IO口是P1.0和P1.1)呵呵,不好意思,我这里没有电路图,只能这样说明一下了,请大家见谅!谢谢!

相关帖子

沙发
hotpower| | 2008-3-5 21:36 | 只看该作者

用串口模式0很快好些

使用特权

评论回复
板凳
tomegeo|  楼主 | 2008-3-5 21:40 | 只看该作者

hotpower回得真及时呀

不过有一个问题就是,假如我要用几组模拟串口分别发送给几组数码管显示条的话,串口就不够用了,所以我觉得考虑用普通IO口做模拟串口很有必要,我也试过好多办法,可就是解决不了这个问题,郁闷呀!

使用特权

评论回复
地板
hotpower| | 2008-3-5 21:44 | 只看该作者

IO模拟没问题.要真正解决有2个方法

1.LED的电源可关断,这样在变换数据后再打开
2.每个时钟都分控

使用特权

评论回复
5
hotpower| | 2008-3-5 21:45 | 只看该作者

当然最好用595了~~~

使用特权

评论回复
6
电子尘埃| | 2008-3-5 21:47 | 只看该作者

有个芯片带锁存的.把每个数码管的值都发送完之后.

在把锁存打开.再锁好.如此循环就可以解决这个问题了呀.具体是什么型号记不得了.要到公司看下原理图才可以记得起来

使用特权

评论回复
7
tomegeo|  楼主 | 2008-3-5 21:52 | 只看该作者

谢谢hotpower的帮助

4楼: IO模拟没问题.要真正解决有2个方法 

1.LED的电源可关断,这样在变换数据后再打开
2.每个时钟都分控
 
 这两个办法我都试了,是可以,不过用第1个办法,送数时还是有点闪,不过不是很明显,但是还是能感觉得到;用第2个办法就可以不会闪,但是占用太多的IO资源,而且代码量也较多.
     我有看过别人做的同样的东西,也是用164显示的,我的接法和他们的一样,但是他们做到不会闪,所以我就纳闷呀!
     我有考虑用595,但是显示条已经做好了,要换的话又要再做板呀,呵呵,我还是穷书生,银子不经花呀.

使用特权

评论回复
8
电子尘埃| | 2008-3-5 21:59 | 只看该作者

噢噢我看的时候还在4楼怎么等我回完了就在6楼了.

哈哈,看来天不冷了,就没人睡早觉了.

使用特权

评论回复
9
tomegeo|  楼主 | 2008-3-5 22:09 | 只看该作者

re电子尘埃:哈哈,这叫速度

我在回的时候也没见到你,回完就看到你了,谢谢你的帮助!你说的那个芯片是不是就是74HC595呢?

使用特权

评论回复
10
jjg| | 2008-3-5 22:11 | 只看该作者

用I/O口模拟时送数据的速度要快。

使用特权

评论回复
11
tomegeo|  楼主 | 2008-3-5 22:21 | 只看该作者

发一段我的程序先

void clk(void)//时钟
{
    P1_0=0;
    delay(10);
    P1_0=1;
    delay(10);
}
void send (uchar da)//发送数据
{
    uchar i;
    for(i=0;i<8;i++)
    {
        P1_1=(bit)(da&0x80);
        da<<=1;
        clkc();
    }
}
void display(uchar complete)//显示
{        
         uchar i,com1;
         disc[5]=complete/100000;
         com1=complete%100000;
    disc[4]=com1/10000;
    com1=com1%10000;
    disc[3]=com1/1000;
    com1=com1%1000;
    disc[2]=com1/100;
    com1=com1%100;
    disc[1]=com1/10;
    disc[0]=com1%10;
         for(i=0;i<6;i++)
    {
           send(tab[disc]);//显示0---9
      delay(2);
     }
}

使用特权

评论回复
12
tomegeo|  楼主 | 2008-3-5 22:24 | 只看该作者

补一下延时程序

//////////////延时
void delay(uchar n)
{
    uchar i;
    for(i=n;i<=0;i--);
}

使用特权

评论回复
13
hotpower| | 2008-3-5 22:31 | 只看该作者

倒塌了~~~51这种慢牛一个延时都不要!!!

串口的模式0可以为1M,你要延时干什么???

倒塌了~~~

使用特权

评论回复
14
tomegeo|  楼主 | 2008-3-5 22:55 | 只看该作者

re

呵呵,见笑啦.
hotpower的意思是说用51模拟串口来做的话,不用延时吧?

使用特权

评论回复
15
MinPort| | 2008-3-6 08:41 | 只看该作者

模拟串口好像164就是不好用

我以为用过这种方法,51I/O模拟串口,用74HC164驱动数码管总是闪烁,后来我干脆一步到位,换用595,就解决问题了。

使用特权

评论回复
16
ayb_ice| | 2008-3-6 09:00 | 只看该作者

UART 方式0即可

使用特权

评论回复
17
xwj| | 2008-3-6 09:01 | 只看该作者

非要用164的话只能价格三极管控制LED的电源的选通了

使用特权

评论回复
18
machunshui| | 2008-3-6 09:11 | 只看该作者

74hc595,用SPI模式

先通过spi口,
把要显示的数据移位到74hc595上,
然后数据锁存到74hc595输出脚。



使用特权

评论回复
19
zhaoyu2005| | 2008-3-6 09:31 | 只看该作者

LZ应该是没有弄好

hotpower大侠说的第一种方法能解决你的问题,并且应该没有闪烁,是你没有弄好,或者刷新太快了

使用特权

评论回复
20
MinPort| | 2008-3-6 09:59 | 只看该作者

静态显示区别于动态显示

使用特权

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

本版积分规则

7

主题

65

帖子

1

粉丝