本人做了一款led点阵32x32的,扫描方式是逐行扫描,那么在代码实现静态文字或者文字上下移没什么难点,静态显示无非就是开一个显存把文字数据写进显存然后扫描就完了,上下移也就多了一步字节推挤写一个用定时器数据推挤,推挤显存中的数据一个字节一个字节跟可以完美实现上下移,到了左右移那么问题来了由于pcb设计扫描结构为逐行扫描,上下移可以推入整个字节达到目的,左右移总不能直接移一个字节吧8个点显然不行,所以怎么将字节左移到高位通过算法接入下一个字节的低位呢,办法我是有的但是有点太笨了所以来请教大神们,如下代码。typedef unsigned char u8;
typedef unsigned int u16;
sbit SDI = P6^0;
sbit CLK = P6^1;
sbit LE = P6^2;
u8 xdata Byte[4];
u8 xdata Byte_cache[4];
void Delay_ms(u16 l) //@30.000MHz 1ms
{
unsigned char i, j;
u16 h;
for(h=0;h<l;h++)
{
_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
}
void HC595_Init()
{
SDI = 0;
CLK = 0;
LE = 0;
}
void HC595_Write_Data(u16 op)
{
u16 i,k;
for(i=0;i<8;i++)
{
CLK=0;
SDI=op&0x80;
CLK=1;
op<<=1;
}
}
/*0000 0000 0001 */
void main()
{
u8 ii;
HC595_Init();
while(1)
{
Byte[1]=0x00;Byte[2]=0x00;Byte[3]=0x00,Byte[4]=0x01;
for(ii=0;ii<32;ii++)
{
if((Byte[1]&0x80)==128){Byte_cache[1]=0x01;} else{Byte_cache[1]=0x00;} //如果字节高位等于1那么字节缓存等于1
Byte[1]=Byte[1]+Byte_cache[2]; //下一个字节加上上一个字节的缓存
if((Byte[2]&0x80)==128){Byte_cache[2]=0x01;} else{Byte_cache[2]=0x00;}
Byte[2]=Byte[2]+Byte_cache[3];
if((Byte[3]&0x80)==128){Byte_cache[3]=0x01;} else{Byte_cache[3]=0x00;}
Byte[3]=Byte[3]+Byte_cache[4];
HC595_Write_Data(Byte[1]);
HC595_Write_Data(Byte[2]);
HC595_Write_Data(Byte[3]);
HC595_Write_Data(Byte[4]);
LE =1;
_nop_();
LE =0;
Delay_ms(100);
Byte[1]<<=1;
Byte[2]<<=1;
Byte[3]<<=1;
Byte[4]<<=1;
}
}
}
这组代码可以实现字节的按位推挤这是组测试代码跑的流水灯刚好达到了的目的左移,稍加修改放进点阵移屏代码也就实现了左移了,但是代码中可以看到我给了每一个字节都加了字节缓存位有没有什么办法去掉这些缓存位,毕竟32x32的点阵后续还要级联那么xdata属实有点太大了一块屏加上字节缓存就是256字节每加一块就会翻倍,虽然主控是stc8h8k容量完全够了,或者有大佬知道其他逐行扫描左移代码执行效率高的方法。谢谢各位了
|