#include
unsigned int zimo,xx=0; //zimo是字模計數(shù)器,xx為分屏顯示的時候的字數(shù)。
unsigned char yid,h; //yid為移動計數(shù)器,h為行段計數(shù)器
unsigned char code hanzi[]; //漢字字模
unsigned char BUFF[18],BUFF2[18]; //左移顯示的緩存
void qing(void); void xianshi(void);
void fen(void); void zuo(void);
void in_data(void); //調(diào)整數(shù)據(jù)
void rxd_data(void); //左移發(fā)送數(shù)據(jù)
void out_rxd(unsigned char *d); //分屏、上移發(fā)送數(shù)據(jù)
char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段碼*/
/***********主程序******************/
void main(void)
{ unsigned char ee;
SCON=01=0;yid=0;zimo=0;
while(1)
{ fen(); //分屏顯示
for(ee=30;ee>0;ee--)//清屏幕3秒
{qing();}
zuo(); //左移顯示
for(ee=30;ee>0;ee--)
{qing();}
}
}
/**********清屏幕*******************/
void qing (void)
{ unsigned char zz,xx=0x0ff;
for (zz=33;zz>0;zz--)
{out_rxd(&xx);}
P1=0xff; P1=0; //鎖存為高,74HC595鎖存信號
P2=0; //清74LS138的使能端
}
/**********分屏顯示***********/
void fen(void)
{ do{ xianshi(); }while(xx++<=5); //調(diào)用單屏顯示
xx=0;
}
/************單屏顯示*************/
void xianshi(void)
{ unsigned char ii,jj;
unsigned int kk,aa;
for (kk=500;kk>0;kk--) //每屏顯示500次
{for(ii=1;ii<16;ii+=2) //每個漢字分8行掃描
{ for (jj=0;jj<8;jj++) //每次要發(fā)送8個漢字的2個字節(jié),發(fā)送8次
{ aa=(xx*8+jj)*32+ii;
out_rxd(&hanzi[aa]); //從串口輸出第1個字的第1字節(jié)。
out_rxd(&hanzi[aa-1]); //從串口輸出第1個字的第1字節(jié)。
}
for (jj=0;jj<8;jj++) //每次要發(fā)送8個漢字的2個字節(jié),發(fā)送8次
{ aa=(xx*8+jj)*32+ii;
out_rxd(&hanzi[aa+16]); //從串口輸出第1個字的第17字節(jié)。
out_rxd(&hanzi[aa+15]); //從串口輸出第1個字的第18字節(jié)
}
P2=0x0ff;
P1=0xff; P1=0; //鎖存為高,74HC595鎖存信號
P2=sw[h]; //輸出行信號
h++; //行加一
if(h==8)h=0;
}
}
}
/***************左移顯示************/
void zuo(void)
{ unsigned char i,d=5; //d為移動的時候一個漢字的掃描顯示次數(shù)
xianshi(); //調(diào)用單屏顯示
while(zimo<=1450)
{while(yid<16) //數(shù)據(jù)移位。
{for(i=0;i
{ in_data(); //調(diào)整數(shù)據(jù)
rxd_data(); //串口發(fā)送數(shù)據(jù)
P2=sw[h]; //送段碼
P1=0xff; //鎖存為高,595鎖存信號
P1=0;
}
}
yid++; //移動一步
}
yid=0;zimo=zimo+32; //后移一個字,
}
zimo=0;
}
/*************分屏顯示的數(shù)據(jù)發(fā)送************/
void out_rxd(unsigned char *d) /*從串口發(fā)送數(shù)據(jù)*/
{ SBUF=*d; while(!TI); //等待發(fā)送完畢
TI=0;
}
/*******左移顯示讀取數(shù)據(jù) 并調(diào)整**************/
void in_data(void)
{ char s,w; unsigned int qqq;
for(s=8;s>=0;s--)
{ w=s+s;
qqq=zimo+h+h+s*32;
BUFF[w+1]=hanzi[qqq];
BUFF[w]=hanzi[qqq+1];
BUFF2[w+1]=hanzi[qqq+16];
BUFF2[w]=hanzi[qqq+17];
}
}
/**********左移顯示的數(shù)據(jù)調(diào)整發(fā)送***************/
void rxd_data(void) //串行發(fā)送數(shù)據(jù)
{unsigned char inc,s,tempyid,temp;
if(yid<8) inc=0;
else inc=1;
for(s=0+inc;s<16+inc;s++) //發(fā)送數(shù)據(jù)
{ if(yid<8) tempyid=yid;
else tempyid=yid-8;
temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));
SBUF=temp; //把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。
while(!TI);TI=0; //等待發(fā)送中斷
}
for(s=0+inc;s<16+inc;s++) //發(fā)送8字節(jié)數(shù)據(jù)
{ if(yid<8) tempyid=yid;
else tempyid=yid-8;
temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid));
SBUF=temp; //把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。
while(!TI);TI=0; //等待發(fā)送中斷
}
}
更多相關(guān): AV集成
©版權(quán)所有。未經(jīng)許可,不得轉(zhuǎn)載。