
#define uchar unsigned char
#define uint unsigned int
sbit LCD_E=P3^5; //定义接口
sbit LCD_RW=P3^6;
sbit LCD_RS=P3^7;
#define LCD_Data P1 //数据接口
uchar up[]={"IvU,hupeixian"};
uchar code down[]={"_by fu "}
/*************************延时函数*****************************/
void Delay_ms(uint time)
{
uint i,j;
for(i = 0;i < time;i ++)
for(j = 0;j < 930;j ++);
}
/**********************检测状态************************************/
uchar LCD_ReadStatus(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
while (LCD_Data & 0x80); //检测忙信号
return(LCD_Data);
}
/************************写数据***********************************/
void LCD_WriteData(uchar WDLCD)
{
LCD_ReadStatus();//检测忙
LCD_Data = WDLCD
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;//若晶振速度太高可以在这后加小的延时
LCD_E = 1;//延时
LCD_E = 0;
}
/************************写指令********************************/
void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC)
LCD_ReadStatus(); //根据需要检测忙
LCD_Data = WCLCD;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
/*****************初始化***********************************/
void LCD_Init(void)
{
LCD_Data = 0;
LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
Delay_ms(5);
LCD_WriteCommand(0x38,0);
Delay5Ms();
LCD_WriteCommand(0x38,0);
Delay_ms(5);
LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号
LCD_WriteCommand(0x08,1); //关闭显示
LCD_WriteCommand(0x01,1); //显示清屏
LCD_WriteCommand(0x06,1); // 显示光标移动设置
LCD_WriteCommand(0x0C,1); // 显示开及光标设置
}
/***********************显示一个字符********************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF; //X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码
LCD_WriteData(DData);
}
/************************显示一串字符*******************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
/******************************************************************/
void main(void)
{
Delay_ms(400); //启动等待,等LCD讲入工作状态
LCD_Init(); //LCD初始化
Delay_ms(5); //延时片刻(可不要)
DisplayListChar(0, 1, up);
DisplayListChar(6, 0, down);
LCD_Data=0xff;
while(1);
}
