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条回答
xiaobendan
2020-01-22 20:28
从你的scan_tab来看,你的显示的那行是高电平,意思是这个点阵是共阳极,显示数据应该是低亮高灭的了?
那么你在关显示的时候,怎么输出的是两个0x00呢?
还有关显示怎么放在最后呢?
试试看这样,先关显示,就是传送两个0XFF,然后传送scan_tab,然后再传送显示数据,然后再延时,再循环,看看是什么效果

一周热门 更多>