LCD控制时序:
LCD的初始化过程如下:
第一行显示"Welcome";第二行显示="Happy day";若要显示其他字符,请直接往数组 LCMLineOne[16]和LCMLineTwo[16]填充相应的代码。仿真图(仿真是在Proteus7.4SP3下仿真通过)
源程序: #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define busy 0x80 #define DataIO P0 sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^7; uchar data LCDLineOne[16]="Welcome"; //第一行显示的数据 uchar data LCDLineTwo[16]="Happy day"; //第二行要显示的数据 void Delayms(uchar ms) //ms级别的延时 { uchar i,j; for(i=0;i<ms;i++) for(j=0;j<57;j++) ; } void delay12(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void Fbusy() { uchar LCDStatus; do { DataIO=0xff; RS=0;RW=1; E=1; LCDStatus=DataIO; E=0; LCDStatus=(LCDStatus&busy); } while(LCDStatus!=0); } //写指令寄存器 void LCDWriteC(uchar COMData) { Fbusy(); RS=0;RW=0; DataIO=COMData; E=1; E=0; } //读指令寄存器 uchar LCDReadC() {uchar LCDStatus; Fbusy(); RS=0;RW=1; E=1; LCDStatus=DataIO; E=0; return(LCDStatus); } //读数据寄存器 uchar LCDReadD(uchar addr) {uchar LCDStatus; Fbusy(); LCDWriteC(0x80+addr); RS=1;RW=1;E=0; E=1; E=0; LCDStatus=DataIO; return(LCDStatus); } //写数据寄存器带地址 void LCDWriteDAdd(uchar addr,uchar LCDData) { Fbusy(); LCDWriteC(0x80+addr); RS=1;RW=0; DataIO=LCDData; E=1; E=0; } //写数据寄存器无地址 void LCDWriteD(uchar LCDData) { Fbusy(); RS=1;RW=0; DataIO=LCDData; E=1; E=0; } //初始化 void LCDInit(void) { Delayms(15); RS=0;RW=0; DataIO=0x38; E=1; E=0; Delayms(5); DataIO=0x38; E=1; E=0; Delayms(5); DataIO=0x38; E=1; E=0; Delayms(5); LCDWriteC(0x38); LCDWriteC(0x08); LCDWriteC(0x01); LCDWriteC(0x06); LCDWriteC(0x0c); } main() { uchar i; LCDInit(); DataIO=0xff; while(1) { LCDWriteC(0x80); //第一行DDRAM地址 for(i=0;i<16;i++) LCDWriteD(LCDLineOne[i]); LCDWriteC(0x80+0x40); //第二行DDRAM地址 for(i=0;i<16;i++) LCDWriteD(LCDLineTwo[i]); } }
这是采用时序的方式,另外也可以采用总线的方式来控制(见我的另外一篇文章http://www.51hei.com/mcu/1042.html ),总的来说,采用时序的方式可以让我们更好的理解LCD的控制方法,而总线的方式则可以简化程序。