一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3082|回复: 26
收起左侧

请教74HC595多片级联数据溢出的问题

[复制链接]
发表于 2017-7-17 09:49 | 显示全部楼层 |阅读模式
一块P10的LED点阵屏,由16块74HC595驱动列线,驱动程序如下。
//数据串行输入(列显控制)
//入口参数:数据数组
void SerialPut(u8 dat)
{
        u16 m;
        for(m=0;m<8;m++)
        {
             if(dat & 0x80) R=1;        //数据线         
             else R=0;
                dat=dat<<1;  //数据移位                               
             CLK=0;
                delay_us(2);      
             CLK=1;                   //产生时钟                    
        }
}

//行显控制
//入口参数:扫描行数
//入口参数0/1/2/3 代表行扫描13,9,5,1/14,10,6,2/15,11,7,3/16,12,8,4的1/4行
void Scan(u8 temp)
{       
        EN=1;                                   //使能          
        STB=1;                 
           ALine=0x01 & temp;                         
           BLine=0x01 &(temp>>1);
        STB=0;                                   
}

void test(void)
{
        Scan(0);                //点亮第1/5/9/13行
        SerialPut(0xfc);            //点亮列线两个灯               
}

显示效果

显示效果

然而,实际的显示效果却是这样的,按道理应该是整个屏最右端一列的第1/5/9/13行点亮两个灯,而左边却多出了三列,像是74HC595级联后的移位数据一直从第9脚往下一级移位。单屏情况如此,三块屏级联的情况下也是如此,请大侠们指点。

74HC595

74HC595

一级74hc595数据大于8位时将从第一级的9脚往下一级的14脚送出。

发表于 2017-7-17 10:28 | 显示全部楼层
本帖最后由 snoopy8008 于 2017-7-17 12:13 编辑

“一级74hc595数据大于8位时将从第一级的9脚往下一级的14脚送出。”
↑这个理解应该是错的。
“74HC595级联后的移位数据一直从第9脚往下一级移位”
↑这个理解应该是对的。


任何时候,14脚每吃入1bit,9脚就要拉出1bit。

看下真值表
http://baike.baidu.com/link?url=_Hswap0sv6QaVhvgEG1p_NY8qC4p4loriYm1eAIb1DBZfK3g9eanYo5rLkShbhyTMmoIKuMGR-m4E4_tDdWgMq


 楼主| 发表于 2017-7-17 12:25 | 显示全部楼层
snoopy8008 发表于 2017-7-17 10:28
“一级74hc595数据大于8位时将从第一级的9脚往下一级的14脚送出。”
↑这个理解应该是错的。
“74HC595级 ...

这样子的话就是不管数据长度的大小,都会从595的9脚一直流出,被挤出去的数据显示出来就乱了。

1

1

只显示数字“8”的情况下,最右侧的显示是正确的,左边三个的显示就乱了。
那这样需要怎么控制字体在屏上的显示位置而不被错乱的字体覆盖掉……


发表于 2017-7-17 12:54 | 显示全部楼层
leozzd 发表于 2017-7-17 12:25
这样子的话就是不管数据长度的大小,都会从595的9脚一直流出,被挤出去的数据显示出来就乱了。
只显示数 ...

数据不会被挤乱啊,这样显示不好确定是硬件还是软件问题。
把SerialPut里面的延时改长一些,应该可以看到每移一列的现象吧?试试看。
有电路图吗?

 楼主| 发表于 2017-7-17 13:55 | 显示全部楼层
snoopy8008 发表于 2017-7-17 12:54
数据不会被挤乱啊,这样显示不好确定是硬件还是软件问题。
把SerialPut里面的延时改长一些,应该可以看 ...

我把延时调到10个毫秒,看到的效果就是从右往左,大概的轮廓就是每个字体往下陷一行显示。这个应该是和程序有关系,因为我试过控制卡,能正常显示,接线方式一样。

//数据串行输入(列显控制)
//入口参数:数据数组
void SerialPut(u8 dat)
{
        u16 m;
        for(m=0;m<8;m++)
        {
             if(dat & 0x80) R=1;                 //串行数据输入
             else R=0;                               
             CLK=0;
                delay_us(2);      
             CLK=1;
                dat=dat<<1;                                 //数据左移                                     
        }
}

//行显控制
//入口参数:扫描行数
//入口参数0/1/2/3 代表行扫描13,9,5,1/14,10,6,2/15,11,7,3/16,12,8,4的1/4行
void Scan(u8 temp)
{       
        EN=1;                                   //使能                  
        STB=1;
        STB=0;                //开始移位  
           ALine=0x01 & temp;                         
           BLine=0x01 &(temp>>1);
}


void Show_Time(unsigned char i)
{
        u8 l;
        for(l=0;l<4;l++)                //循环扫描1/4行
    {          
                SerialPut(Num[3*4+l]);
                SerialPut(Num[2*4+l]);
                SerialPut(Num[1*4+l]);
                SerialPut(Num[0*4+l]);
                Scan(l);  
        }                                
}

通过传递“i”参数给Show_Time函数,能在屏的最右端显示0~9的跳动,左边3位跟着跳动,显示情况是字体残缺,是不是行列搭配出现问题,程序附上了。
电路图在附件上,这资料送给大家把~~~

16x32 P10.pdf

187.51 KB, 下载次数: 72, 下载积分: 一乐金币 -1

发表于 2017-7-17 16:59 | 显示全部楼层
我想知道你是做项目用LED点阵显示还是,自己在学习LED玩玩用的,如果是做项目花点钱,我可以帮你搞定,如果是做项目LED点阵需要FLASH保存字库,是比较麻烦的,你自己做着玩玩把汉字转换成数据放在程序里面是没有问题的,你的屏多长要求几个字,就一直显示方式吗,一屏以内居中显示,超出一屏左移显示。
发表于 2017-7-18 06:24 | 显示全部楼层
本帖最后由 snoopy8008 于 2017-7-18 06:44 编辑

这个去除微亮残影
void Scan(u8 temp)
{        
        EN=0;                   //关闭显示
        STB=1;                 //更新595输出
           ALine=0x01 & temp;
           BLine=0x01 &(temp>>1);
        STB=0;  
        EN=1;                   //使能显示           
}
发表于 2017-7-18 06:54 | 显示全部楼层
所有595的数据都传输完,再显示。
void Show_Time(unsigned char i)
{
        u8 l;
        for(l=0;l<4;l++)                //循环扫描1/4行
    {         
                SerialPut(Num[3*4+l]);
                SerialPut(Num[2*4+l]);
                SerialPut(Num[1*4+l]);
                SerialPut(Num[0*4+l]);

                SerialPut(Num[3*4+l]);
                SerialPut(Num[2*4+l]);
                SerialPut(Num[1*4+l]);
                SerialPut(Num[0*4+l]);

                SerialPut(Num[3*4+l]);
                SerialPut(Num[2*4+l]);
                SerialPut(Num[1*4+l]);
                SerialPut(Num[0*4+l]);

                SerialPut(Num[3*4+l]);
                SerialPut(Num[2*4+l]);
                SerialPut(Num[1*4+l]);
                SerialPut(Num[0*4+l]);
                Scan(l);  
        }                                 
}
发表于 2017-7-18 07:00 | 显示全部楼层
本帖最后由 snoopy8008 于 2017-7-18 07:52 编辑

原来的问题是:刷新第二行的时候,原来第1、2、3、4个595的数据被挤到第5、6、7、8个595里,结果第二行显示了第一行的数据,以此类推,除了前四个595,别的都乱码。
 楼主| 发表于 2017-7-20 10:48 | 显示全部楼层
snoopy8008 发表于 2017-7-18 06:24
这个去除微亮残影
void Scan(u8 temp)
{        

这个非常好,也顺带解决了左移后的残留,太感谢你了!

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 09:20 , Processed in 0.064020 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表