#include <AT89x51.H> unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。 unsigned char yid,h; //yid为移动计数器,h为行段计数器 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); //调整数据 void rxd_data(void); //左移发送数据 void out_rxd(unsigned char *d); //分屏、上移发送数据 char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*/ /* 龙图开发网: http://www.longtoo.com */ /***********主程序******************/ void main(void) { unsigned char ee; SCON=0;P1=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); //调用单屏显示 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++) //每次要发送8个汉字的2个字节,发送8次 { aa=(xx*8+jj)*32+ii; out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。 out_rxd(&hanzi[aa-1]); //从串口输出第1个字的第1字节。 } for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次 { aa=(xx*8+jj)*32+ii; out_rxd(&hanzi[aa+16]); //从串口输出第1个字的第17字节。 out_rxd(&hanzi[aa+15]); //从串口输出第1个字的第18字节 } 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为移动的时候一个汉字的扫描显示次数 xianshi(); //调用单屏显示 while(zimo<=1450) {while(yid<16) //数据移位。 {for(i=0;i<d;i++) //移动速度 {for(h=0;h<8;h++) //8行扫描 { in_data(); //调整数据 rxd_data(); //串口发送数据 P2=sw[h]; //送段码 P1=0xff; //锁存为高,595锁存信号 P1=0; } } yid++; //移动一步 } yid=0;zimo=zimo+32; //后移一个字, } zimo=0; } /*************分屏显示的数据发送************/ void out_rxd(unsigned char *d) /*从串口发送数据*/ { SBUF=*d; while(!TI); //等待发送完毕 TI=0; } /*******左移显示读取数据 并调整**************/ 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]; } } /**********左移显示的数据调整发送***************/ void rxd_data(void) //串行发送数据 {unsigned char inc,s,tempyid,temp; if(yid<8) inc=0; else inc=1; for(s=0+inc;s<16+inc;s++) //发送数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF>>tempyid)|(BUFF[s+1]<<(8-tempyid)); SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。 while(!TI);TI=0; //等待发送中断 } for(s=0+inc;s<16+inc;s++) //发送8字节数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF2>>tempyid)|(BUFF2[s+1]<<(8-tempyid)); SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。 while(!TI);TI=0; //等待发送中断 } } unsigned char code hanzi[]={/*自己的汉字编码请放在这里*/}; |