打印

74HC595驱动数码管之诡异问题

[复制链接]
5983|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 chenyu988 于 2012-10-8 19:39 编辑

A B C三相,每相3个数码管,显示百十个位,用3个595级联驱动3个数码管,共9个595,现在的问题是,上电应该显示000,但A相的个位a段不亮,g段亮,或者a、g两段来回晃动,分析原因是595级联,干扰信号被放大,导致显示错位。在级联输出端加47pF电容后,现在正常了!但不明白为什么B C两相的个位显示正常,就A相的个位不
正常?mcu先显示A相,第一个数码管是百位,与第二个数码管级联,第三个数码管级联输出端是悬空的。 不是所有的A相都不正常,只是很少一部分(显示不正常的大部分是售后回来的)。显示不正常的可能换个595就显示正常了!

相关帖子

沙发
8980| | 2012-10-8 15:41 | 只看该作者
说实话,没看懂

使用特权

评论回复
板凳
chenyu988|  楼主 | 2012-10-8 15:56 | 只看该作者
2# 8980
不是吧,没说明白?

使用特权

评论回复
地板
gx_huang| | 2012-10-8 18:15 | 只看该作者
起码要告诉我们,哪个是百位,哪个是个位。
如果就A相有问题,应该还是布线和原理图的问题。
比如电源有没有加滤波电容,地线是否足够粗。

使用特权

评论回复
5
rossi_lao| | 2012-10-8 18:33 | 只看该作者
布线情况,mcu先进A相那组的595还是先进C相那组595??
说真的,我也没看懂。

使用特权

评论回复
6
ocon| | 2012-10-8 18:49 | 只看该作者
软件BUG,时序没配合好。

使用特权

评论回复
7
chenyu988|  楼主 | 2012-10-8 19:24 | 只看该作者
5# rossi_lao
mcu是先显示A相

使用特权

评论回复
8
谈的元| | 2012-10-8 19:32 | 只看该作者
的确是时序,电容仅仅是微调了时序

使用特权

评论回复
9
chenyu988|  楼主 | 2012-10-8 19:34 | 只看该作者
6# ocon
不是所有的都有这个现象

使用特权

评论回复
10
chenyu988|  楼主 | 2012-10-8 19:36 | 只看该作者
之前以为是595的问题,后来发现不是, 坏的重新烧程序调试后(程序未变)又好了

使用特权

评论回复
11
chenyu988|  楼主 | 2012-10-8 19:38 | 只看该作者
4# gx_huang
ABC共用一个VCC,已加滤波电容,至于地线够不够粗我再确认一下

使用特权

评论回复
12
airwill| | 2012-10-8 22:15 | 只看该作者
在输出端加电容不是好办法.
提高串行信号的稳定性是个重要点.
另外, 我分析时序下来, 感觉接连时用 9 脚连 14脚会稳定些.
另外, 12 脚的控制时序也会引起错位问题, 要关注一下.

使用特权

评论回复
13
ocon| | 2012-10-8 23:39 | 只看该作者
这个程序在16M指令周期下没有问题,段和位都是用595驱动的:
//刷新位显digs和段显segs
void write_to_led(char digs_cache,char segs_cache)
{
    write_to_595(digs_cache);//位显
    write_to_595(segs_cache);//段显
    STR=1;                  //刷新595输出脚
    STR=0;
}
//将数据写入74HC595
void write_to_595(char cache)
{
    int i;
    CLK=0;
    STR=0;
    for(i=8;i>0;--i){
        if(cache&0x01){
            DOUT=1;    //右移一位,将最低位输出到DOUT
        }else{
            DOUT=0;
        }
        cache=cache>>1;
        CLK=1;
        CLK=0;
    }
}

使用特权

评论回复
14
chenyu988|  楼主 | 2012-10-9 08:28 | 只看该作者
12# airwill
您说的9脚接14是什么?第一片595的级联输出端本来就接了第二片595的串行数据输入端的

使用特权

评论回复
15
chenyu988|  楼主 | 2012-10-9 08:30 | 只看该作者
13# ocon
显示这块我是这样的
void HC595_Sendata_A(uint x) //HC595驱动数码管显示
{               //将显示数据送入HC595内部移位寄存器中
    uint tx=x;
    uchar i;
    for(i=0;i<8;i++)       //循环移入8位数据
    {        
  if((tx<<i)&0x80) S1=1;               
  else S1=0;     
        SR1=0;      
  nop;      //空指令相当于很短的延时
  SR1=1;               //上升沿发生移位
    }
}
void display_A(uint x)      //数码管显示程序
{
    digit[2]=getcode(x/100);   //百位
    digit[1]=getcode((x%100)/10);  //十位
    digit[0]=getcode((x%100)%10);  //个位
    HC595_Sendata_A(digit[0]);   //从个位开始送24位数据
    HC595_Sendata_A(digit[1]);
    HC595_Sendata_A(digit[2]+(0x80*ia1)); //带小数点
    R1=0;       //上升沿将数据送到数据存储寄存器
    nop;               
    R1=1;
}

使用特权

评论回复
16
chenyu988|  楼主 | 2012-10-9 08:32 | 只看该作者
我想问的是为什么只有A相有问题,而B C相却没有出现问题呢?
是跟布线有关吗?

使用特权

评论回复
17
coody| | 2012-10-9 09:36 | 只看该作者
74HC595,在LED屏上用过过百万片,一般都是8片或16片串联,甚至更多,没发现不稳定的。

使用特权

评论回复
18
szseo668| | 2012-10-9 10:10 | 只看该作者
8片或16片串联。搞个并联的话就完蛋了,

使用特权

评论回复
19
wfl102824| | 2012-10-9 10:44 | 只看该作者
本帖最后由 wfl102824 于 2012-10-9 11:29 编辑

:)

使用特权

评论回复
20
HORSE7812| | 2012-10-9 11:06 | 只看该作者
mark

使用特权

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

本版积分规则

47

主题

1108

帖子

14

粉丝