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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
现在还发现一个问题:汉字是两个字节,而数字和字符是一个字节的,显示乱套了,显示缩小上移了,求一个显示数字字符的函数。
一周热门 更多>