/***************************************
LCD OCMC2X16A驅(qū)動模塊
****************************************/
#include<reg52.h>
#define uchar unsigned char
#define LCD
#define LCD_DB P1 //LCD數(shù)據(jù)線pin7~14
sbit LCD_WR=P3^1; //讀寫控制線pin5
sbit LCD_RS=P3^2; //數(shù)據(jù)指令控制線pin4
sbit LCD_E=P3^0; //使能端pin6
//查忙函數(shù)
void busy(void)
{
LCD_RS=0;
LCD_WR=1;
LCD_E=1;
LCD_E=1;
LCD_E=1;
#ifdef LCD
while(LCD_DB&0x80);
#endif
LCD_E=0;
}
//讀AC函數(shù)
/*uchar rd_ac(void)
{
uchar ac;
LCD_RS=0;
LCD_WR=1;
LCD_E=1;
LCD_E=1;
LCD_E=1;
ac=LCD_DB&0x7f;
LCD_E=0;
return ac;
}*/
//寫指令函數(shù)
void w_com(char com)
{
busy();
LCD_RS=0;
LCD_WR=0;
LCD_DB=com;
LCD_E=1;
LCD_E=0;
LCD_DB=0XFF;
}
//寫數(shù)據(jù)函數(shù)
void w_dat(uchar dat)
{ busy();
LCD_RS=1;
LCD_WR=0;
LCD_DB=dat;
LCD_E=1;
LCD_E=0;
LCD_DB=0XFF;
}
//定位函數(shù)
void LCD_gotoxy(char x,char y)
{ uchar code line[]={0x80,0xc0}; //行首地址
w_com(line[x]+y);
}
//顯示一個字符串
void LCD_puts(char *s)
{
while(*s!='\0')
{
w_dat(*s++);
}
}
//自定義字符
void def_char(void)
{ uchar code ch[]=
{
0x00,0x0E,0x11,0x11,0x11,0x0A,0x1B,0x00, //1.歐姆符號
0x00,0x04,0x04,0x1F,0x04,0x04,0x1F,0x00 //2.正負(fù)號
};
uchar i;
w_com(0x48); //設(shè)置CGRAM地址
for(i=0;i<sizeof(ch);i++)
{
w_dat(ch[i]);
}
w_com(0x80);
}
//初始化函數(shù)
void LCD_init(void)
{
unsigned i;
for(i=0;i<2000;i++);
w_com(0x38); //8位數(shù)據(jù)總線,2行顯示模式,5*7點陣
def_char(); //自定義字符
w_com(0x06); //AC自動加1,顯示不移位
w_com(0x0c); //開顯示,不顯示光標(biāo)
w_com(0x01);
LCD_gotoxy(0,2);
LCD_puts("OCM2X16A LCD.");
for(i=0;i<50000;i++);
w_com(0x01); //清屏
}