液晶顯示源程序代碼及相關(guān)注釋
**************************************************
*yj.c
*連線圖:
* DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.5
* DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.6
* DB2---DPROT.2 DB6---DPROT.6 E--------------P2.7
* DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可調(diào)電阻到GND*
*80C51的晶振頻率為12MHz
*液晶顯示程序
***************************************************/
#include "reg51.h"
#include
#include
#define DPORT P0
#define uchar unsigned char
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
uchar Xpos; //列方向地址指針
uchar Ypos; //行方向地址指針
#define NoDisp 0
#define NoCur 1
#define CurNoFlash 2
#define CurFlash 3
/*延時(shí)程序
由Delay參數(shù)確定延遲時(shí)間
*/
void LcdWcn(uchar);
void LcdWc(uchar);
void WriteChar(uchar);
void LcdPos();
void LcdWd(uchar);
void LcdWdn(uchar);
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
/*光標(biāo)設(shè)置命令
Cur 為設(shè)定光標(biāo)參數(shù)
*/
void SetCur(uchar Cur)
{ switch(Cur)
{ case 0x0:
{ LcdWc(0x08); //關(guān)顯示
break;
}
case 0x1:
{ LcdWc(0x0c); //開(kāi)顯示但無(wú)光標(biāo)
break;
}
case 0x2:
{ LcdWc(0x0e); //開(kāi)顯示有光標(biāo)但不閃爍
break;
}
case 0x3:
{ LcdWc(0x0f); //開(kāi)顯示有光標(biāo)且閃爍
break;
}
default: break;
}
}
/*清屏命令
*/
void ClrLcd()
{ LcdWc(0x01);
}
/*在指定的行與列顯示
*/
void WriteChar(uchar c)
{ LcdPos();
LcdWd(c);
}
/*正常讀寫(xiě)操作之前檢測(cè)LCD控制器
*/
void WaitIdle()
{ uchar tmp;
DPORT=0xff;
RS=0;
RW=1;
E=1;
_nop_();
for(;;)
{ tmp=DPORT;
tmp&=0x80;
if(tmp==0)
break;
}
E=0;
}
/*不檢測(cè)忙的寫(xiě)字符子程序
*/
void LcdWdn(uchar c)
{
RS=1;
RW=0;
DPORT=c; //寫(xiě)入待寫(xiě)字符
E=1;
_nop_();
E=0;
}
/*帶忙檢測(cè)的寫(xiě)字符子程序
*/
void LcdWd(uchar c)
{ WaitIdle();
LcdWdn(c);
}
/*檢測(cè)忙信號(hào)的送控制字子程序*/
void LcdWcn(uchar c)
{ RS=0;
RW=0;
DPORT=c;
E=1;
_nop_();
E=0;
}
/*檢測(cè)忙信號(hào)的送控制字子程序*/
void LcdWc(uchar c)
{ WaitIdle();
LcdWcn(c);
}
void LcdPos()
{ uchar tmp;
Xpos&=0x0f; //16xx型液晶的范圍是0~15
Ypos&=0x01; //Y的范圍是0~1
tmp=Xpos;
if(Ypos==1)
{ tmp+=0x40;
}
tmp|=0x80;
LcdWc(tmp);
}
/*LCD的復(fù)位程序
*/
void RstLcd()
{ mDelay(15); //延時(shí)15ms
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
LcdWc(0x38);
LcdWc(0x08);
LcdWc(0x01);
LcdWc(0x06);
LcdWc(0x0c);
}
void WriteString(char s[])
{ uchar pS=0;
for(;;)
{ WriteChar(s[pS]);
pS++;
if(s[pS]==0)
break;
if(++Xpos>=15) //每行最多顯示16個(gè)字符
break;
}
}
void main()
{ uchar s1[]="Hellow World!";
RstLcd(); //復(fù)位LCD
ClrLcd();
SetCur(CurFlash); //光標(biāo)顯示且閃爍
Xpos=2;
Ypos=1;
WriteString(s1);
for(;;)
{;}
}