595级联出现数据数据分界线(错位)求解

2020-01-22 12:01发布

如题,做了个595两级级联,结果就悲剧了。不管是行扫描还是列扫描都会出现5958位的分界。搞不清楚是硬件问题还是软件问题。特来求救~~

连接方式就是你懂的方式,16×16单 {MOD}点阵,两片一组级联,分别做行列信号。选了行扫描595输出2003驱动,扫描信号为高。

图片如下: 3.jpg (564.2 KB, 下载次数: 0) 下载附件 2014-10-23 18:29 上传

/*-----------------------------------------------*/
#include<reg52.h>   
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

void delay5us(void);
void delay_nms(uchar);
void SendByte(uchar);
void Send_2Byte(uchar,uchar);
void SendSeg_Byte(uchar);
void SendSeg_2Byte(uchar,uchar);

sbit h_ser  =P0^0;
sbit h_sclk =P0^1;
sbit h_lclk =P0^2;

sbit l_ser  =P0^3;
sbit l_sclk =P0^4;
sbit l_lclk =P0^5;

      uchar data_tab[32]={0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0x06,0x18,0x00,0x18,0x18,0x18,0x38,0x18,
0xF8,0x1F,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00};
          uchar scan_tab[32]={0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
                                          0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};


//------------------------------------------------
main()
{
    uchar i;

        while(1)
        {
                 for(i=0;i<16;i++)
                         {
                          Send_2Byte(scan_tab[i*2-1],scan_tab[i*2]);                //扫描信号
                         delay_nms(1);
                          SendSeg_2Byte(data_tab[i*2-1],data_tab[i*2]);        //数据输出
                         delay_nms(1);
                         SendSeg_2Byte(0x00,0x00);           //关显示
                         }
        }

}
////////////////////////////////////////////////////////////
void SendByte(uchar dat)
{   
   uchar i;
        
   for(i=0;i<8;i++)
        {
         h_sclk=0;
         h_ser=dat&0x80;
         dat<<=1;
         h_sclk=1;
         }
}
////////////////////////////////////////////////////////////
void Send_2Byte(uchar dat1,uchar dat2)
{
        SendByte(dat1);
        SendByte(dat2);

        h_lclk=0;
        _nop_();
        h_lclk=1;
}
////////////////////////////////////////////////////////////
void SendSeg_Byte(uchar dat)
{
   uchar i;
   for(i=0;i<8;i++)
                   {
                 l_sclk=0;
                 l_ser=dat&0x80;
                 dat<<=1;
                 l_sclk=1;
                }
}
////////////////////////////////////////////////////////////
void SendSeg_2Byte(uchar dat1,uchar dat2)
{
SendSeg_Byte(dat1);
SendSeg_Byte(dat2);
l_lclk=0;
_nop_();
l_lclk=1;
}
////////////////////////////////////////////////////////////
void delay5us(void)   
{
    _nop_();  //if Keil,require use intrins.h
    _nop_();  //if Keil,require use intrins.h
}
////////////////////////////////////////////////////////////
void delay_nms(uchar t)
{
    uchar a,b,c;
    for(c=t;c>0;c--)
     for(b=102;b>0;b--)
      for(a=3;a>0;a--);
}
////////////////////////////////////////////////////////////

PS:请无视我的金牌会员,我其实是金牌菜鸟,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
yklstudent
1楼-- · 2020-01-24 00:18
595网上找人家现成的代码比较下看看,估计就能发现问题所在了
xiaobendan
2楼-- · 2020-01-24 02:26
我用别的取模软件,无论怎么设定,都得不到和你一样的数据,还是看看你的数据是不是对吧
dz20062008
3楼-- · 2020-01-24 04:01
 精彩回答 2  元偷偷看……
applex
4楼-- · 2020-01-24 07:46
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图片看,应该有LED被重复点亮了。亮度所以较高。
dz20062008
5楼-- · 2020-01-24 07:51
applex 发表于 2014-10-27 16:53
仔细看手册,然后按照把595输出端当成并口来看待。1),确保595输出正确,2),确保按照点阵规则输出,从图 ...

的确是被重复点亮了,是我指针弄错了,已经弄好了。

一周热门 更多>