STM32液晶屏驱动程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附录2

整个设计全部源程序:

/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。*/ #include

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行段码*/

/***********主程序******************/

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

{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[s]>>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[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid));

SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。

while(!TI);TI=0; //等待发送中断

}

}

/*************汉字编码信息*************/

相关文档
最新文档