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:请无视我的金牌会员,我其实是金牌菜鸟,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
dz20062008
2020-01-23 05:48
本帖最后由 dz20062008 于 2014-10-24 04:01 编辑
xiaobendan 发表于 2014-10-23 19:49
从你的scan_tab来看,你的显示的那行是高电平,意思是这个点阵是共阳极,显示数据应该是低亮高灭的了?
那 ...



我试过了,还是出现错行。不管我换行扫还是列扫都会出现8与8之间错行。而且慢扫面观察到扫描也有分界的问题。我的扫描那部分加了2003反相的。所以扫描数据为高亮,实际输出为低扫描。帖子上面的图像不光只有上下错行,在中间还出现了丢失部分的问题。                       


                         Send_2Byte(0x00,0x00);                //关扫描
                          SendSeg_2Byte(0x00,0x00);        //数据输出为灭


                         Send_2Byte(scan_tab[i*2-1],scan_tab[i*2]);
                          SendSeg_2Byte(data_tab[i*2-1],data_tab[i*2]);        //数据输出

                         delay_nms(1);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
感觉是调用的数据有问题,就是找不出来那里问题。这是我验证我的想法的代码。输出左右跳动的竖线,再输出左右跳动的横线,变换的很整齐,没出现上面的问题。

代码如下:
                          Send_2Byte(0xff,0xff);                //扫描信号                                //没有调用数组的数据,输出左右跳动的竖线正常
                          SendSeg_2Byte(0x55,0x55);        //数据输出为灭
                         delay_nms(155);

                          Send_2Byte(0xff,0xff);                //扫描信号
                          SendSeg_2Byte(0xaa,0xaa);        //数据输出为灭
                         delay_nms(155);
////////////////////////////////////////////////////////////////////////////
                          Send_2Byte(0x55,0x55);                //扫描信号                                //没有调用数组的数据,输出上下跳动的横线正常
                          SendSeg_2Byte(0xff,0xff);        //数据输出为灭
                         delay_nms(155);

                          Send_2Byte(0xaa,0xaa);                //扫描信号
                          SendSeg_2Byte(0xff,0xff);        //数据输出为灭
                         delay_nms(155);

一周热门 更多>