/***************************************
LCD OCMC2X16A驱动模块
****************************************/
#include<reg52.h>
#define uchar unsigned char
#define LCD
#define LCD_DB P1 //LCD数据线pin7~14
sbit LCD_WR=P3^1; //读写控制线pin5
sbit LCD_RS=P3^2; //数据指令控制线pin4
sbit LCD_E=P3^0; //使能端pin6
//查忙函数
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函数
/*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;
}*/
//写指令函数
void w_com(char com)
{
busy();
LCD_RS=0;
LCD_WR=0;
LCD_DB=com;
LCD_E=1;
LCD_E=0;
LCD_DB=0XFF;
}
//写数据函数
void w_dat(uchar dat)
{ busy();
LCD_RS=1;
LCD_WR=0;
LCD_DB=dat;
LCD_E=1;
LCD_E=0;
LCD_DB=0XFF;
}
//定位函数
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.正负号
};
uchar i;
w_com(0x48); //设置CGRAM地址
for(i=0;i<sizeof(ch);i++)
{
w_dat(ch);
}
w_com(0x80);
}
//初始化函数
void LCD_init(void)
{
unsigned i;
for(i=0;i<2000;i++);
w_com(0x38); //8位数据总线,2行显示模式,5*7点阵
def_char(); //自定义字符
w_com(0x06); //AC自动加1,显示不移位
w_com(0x0c); //开显示,不显示光标
w_com(0x01);
LCD_gotoxy(0,2);
LCD_puts("OCM2X16A LCD.");
for(i=0;i<50000;i++);
w_com(0x01); //清屏
}
用户1478803 2008-3-29 11:52