16*32像素的LED显示屏(P10)级联无**显,应该怎么操作越屏轮显?

2019-07-21 00:31发布

1、手头上有几块P10的led显示屏,单块屏是16*32像素,在一块屏上能实现静态显示两个汉字,和滚动向左显示一句话。2、现在想级联多两块形成三块拼实现滚动显示,出现只有最右边(和单片连接)在滚动显示,最左边(最后一位移位寄存器)和中间的屏却和最右边的同步显示,且显示字体部分出现错位。

3、三块屏拼接能也能静态显示一句话。
以下是显示驱动代码,求各路大神会诊,看看是哪里出现问题,感激不尽!
//串口输入
void SerialPut(unsigned char dat)
{
    u16 m;
        for(m=0;m<8;m++)
        {
             if(dat & 0x80) R=1;
             else R=0;
             CLK=0;        
             CLK=1;                                 
        delay_us(4);
        CLK=0;
        delay_us(4);
                dat=dat<<1;
        }
}
//行显控制
void Scan(unsigned char temp)
{
        STB=1;                 
    STB=0;
        EN=1;
           ALine=0x01 & temp;
           BLine=0x01 &(temp>>1);
}
//静态显示函数
void Display(unsigned char *table,u8 addr)                  
{
    u16 i,j,k;
        for(k=0;k<4;k++)                //显示的四行
    {   
        for(j=0;j<addr;j++)         //低位显示第几个字
        {
             for(i=0;i<2;i++)       //显示1、2列
            {
                                SerialPut(table[j*32+3*8+2*k+i]);
                     SerialPut(table[j*32+2*8+2*k+i]);
                     SerialPut(table[j*32+1*8+2*k+i]);
                     SerialPut(table[j*32+0*8+2*k+i]);
                 }
        }       
    Scan(k);
    }
}
//动态轮显函数(单块板)       
void RollLeftShow(unsigned char *table)                          
{                                                                                                       
   u16 i,j,l,k,add,shan_1,shun;
   u32 buf_0,buf_1,buf_2,buf_3;
   u32 roll[16]={0};
   for(shun=0;shun<17;shun++)                                           //显示字体(数组)个数-3
   {
                for(add=0;add<16;add++)                                          //只知道这里是显示地址,但不怎么改都不行
                 {
                         for(shan_1=0;shan_1<20;shan_1++)          //控制滚动时长
                        {
                                for(k=0;k<16;k++)                 //显示16行
                                {           
                                                roll[k]=table[shun*32+2*k];                                                  //第1个字的数组第1位
                                                roll[k]=(roll[k]<<8)+table[shun*32+2*k+1];                  //第1个字的数组第2位
                                                roll[k]=(roll[k]<<8)+table[(shun+1)*32+2*k];          //第2个字的数组第1位
                                                roll[k]=(roll[k]<<8)+table[(shun+1)*32+2*k+1];    //第2个字的数组第2位
                                                buf_0=roll[k];                                                                
                                                buf[0*32+2*k]=(buf_0>>(24-add))&0xff;               
                                                buf_1=(buf_0<<8)+table[(shun+2)*32+2*k];       
                                                buf[0*32+2*k+1]=(buf_1>>(24-add))&0xff;               
                                                buf_2=(buf_1<<8)+table[(shun+2)*32+2*k+1];       
                                                buf[1*32+2*k]=(buf_2>>(24-add))&0xff;               
                                                buf_3=(buf_2<<8)+table[(shun+3)*32+2*k];                                          
                                                buf[1*32+2*k+1]=(buf_3>>(24-add))&0xff;                                
                                }                               
                                for(l=0;l<4;l++)              //显示的四行
                                {   
                                for(j=0;j<2;j++)          //显示3、4列
                                {
                                     for(i=0;i<2;i++)      //显示1、2列
                                     {
                                                         SerialPut(buf[j*32+3*8+2*l+i]);
                                         SerialPut(buf[j*32+2*8+2*l+i]);
                                         SerialPut(buf[j*32+1*8+2*l+i]);
                                         SerialPut(buf[j*32+0*8+2*l+i]);
                                          }
                                }       
                                Scan(l);
                                }
                        }
                }                  
        }
}


有一个应该是左移显示函数,但不对路。有个x变量没有赋值,却在参与运算。
void RollLeft(unsigned char *table,uint8_t Px)
{       
   uint16_t i,j,l,k,add,shan_1,x;                     //这个x……
   uint32_t        buf_0,buf_1,buf_2,buf_3;
   uint32_t roll[16]={0};
   for(add=0;add<32;add++)
          {
             for(shan_1=0;shan_1<100;shan_1++)
          {
           for(k=0;k<16;k++)                  
            {   
                 if(add>=16)
                        {
                                roll[k]=table[(x+1)*32+2*k];                         //没赋值却参与运算……
                                roll[k]=(roll[k]<<8)+table[(x+1)*32+2*k+1];
                                roll[k]=(roll[k]<<8)+table[x*32+2*k];
                                roll[k]=(roll[k]<<8)+table[x*32+2*k+1];
                                buf_0=roll[k];
                                buf[0*32+2*k]=(buf_0>>(24-add%16))&0xff;
                                buf_1=(buf_0<<8)+table[(x+1)*32+2*k];
                                buf[0*32+2*k+1]=(buf_1>>(24-add%16))&0xff;
                                buf_2=(buf_1<<8)+table[(x+1)*32+2*k+1];
                                buf[1*32+2*k]=(buf_2>>(24-add%16))&0xff;
                                buf_3=(buf_2<<8)+table[x*32+2*k];
                                buf[1*32+2*k+1]=(buf_3>>(24-add%16))&0xff;
                        }
                        else
                        {     
                            roll[k]=table[x*32+2*k];
                                roll[k]=(roll[k]<<8)+table[x*32+2*k+1];
                                roll[k]=(roll[k]<<8)+table[(x+1)*32+2*k];
                                roll[k]=(roll[k]<<8)+table[(x+1)*32+2*k+1];
                                buf_0=roll[k];
                                buf[0*32+2*k]=(buf_0>>(24-add))&0xff;
                                buf_1=(buf_0<<8)+table[x*32+2*k];
                                buf[0*32+2*k+1]=(buf_1>>(24-add))&0xff;
                                buf_2=(buf_1<<8)+table[x*32+2*k+1];
                                buf[1*32+2*k]=(buf_2>>(24-add))&0xff;
                                buf_3=(buf_2<<8)+table[(x+1)*32+2*k];
                                buf[1*32+2*k+1]=(buf_3>>(24-add))&0xff;
                        }          
            }
                for(l=0;l<4;l++)                  //显示的四行
            {   
                for(j=0;j<2;j++)          //显示3、4列
                {
                     for(i=0;i<2;i++)      // 显示1、2列
                    {
                         SerialPut(buf[j*32+3*8+2*l+i],Px);
                         SerialPut(buf[j*32+2*8+2*l+i],Px);
                         SerialPut(buf[j*32+1*8+2*l+i],Px);
                         SerialPut(buf[j*32+0*8+2*l+i],Px);
                         }
                }       
            Scan(l,Px);
           }
          }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。