|
本人做了一款led點(diǎn)陣32x32的,掃描方式是逐行掃描,那么在代碼實(shí)現(xiàn)靜態(tài)文字或者文字上下移沒什么難點(diǎn),靜態(tài)顯示無非就是開一個(gè)顯存把文字?jǐn)?shù)據(jù)寫進(jìn)顯存然后掃描就完了,上下移也就多了一步字節(jié)推擠寫一個(gè)用定時(shí)器數(shù)據(jù)推擠,推擠顯存中的數(shù)據(jù)一個(gè)字節(jié)一個(gè)字節(jié)跟可以完美實(shí)現(xiàn)上下移,到了左右移那么問題來了由于pcb設(shè)計(jì)掃描結(jié)構(gòu)為逐行掃描,上下移可以推入整個(gè)字節(jié)達(dá)到目的,左右移總不能直接移一個(gè)字節(jié)吧8個(gè)點(diǎn)顯然不行,所以怎么將字節(jié)左移到高位通過算法接入下一個(gè)字節(jié)的低位呢,辦法我是有的但是有點(diǎn)太笨了所以來請(qǐng)教大神們,如下代碼。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;} //如果字節(jié)高位等于1那么字節(jié)緩存等于1
Byte[1]=Byte[1]+Byte_cache[2]; //下一個(gè)字節(jié)加上上一個(gè)字節(jié)的緩存
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;
}
}
}
這組代碼可以實(shí)現(xiàn)字節(jié)的按位推擠這是組測試代碼跑的流水燈剛好達(dá)到了的目的左移,稍加修改放進(jìn)點(diǎn)陣移屏代碼也就實(shí)現(xiàn)了左移了,但是代碼中可以看到我給了每一個(gè)字節(jié)都加了字節(jié)緩存位有沒有什么辦法去掉這些緩存位,畢竟32x32的點(diǎn)陣后續(xù)還要級(jí)聯(lián)那么xdata屬實(shí)有點(diǎn)太大了一塊屏加上字節(jié)緩存就是256字節(jié)每加一塊就會(huì)翻倍,雖然主控是stc8h8k容量完全夠了,或者有大佬知道其他逐行掃描左移代碼執(zhí)行效率高的方法。謝謝各位了
|
|