

#include "reg52.h"
#include <intrins.h>
#define bufferdata P0
sbit E = P2^7;
sbit RS = P2^6;
sbit RW = P2^5;
/* 读时序 */
void Check_Busy(void)
{
char cmd = 0x80;
bufferdata = 0x80;
while(cmd & 0x80)
{
RS = 0;
RW = 1;
E = 0;
_nop_();
E = 1;
_nop_();
_nop_();
cmd = bufferdata;
E = 0;
_nop_();
}
}
/* 写数据时序 */
void Write_data_Fuc(char datacmd)
{
Check_Busy();
RS = 1;
RW = 0;
E = 0;
_nop_();
bufferdata = datacmd;
_nop_();
E = 1;
_nop_();
_nop_();
E = 0;
_nop_();
}
/* 写指令时序 */
void Write_cmd_Fuc(char cmd)
{
Check_Busy();
RS = 0;
RW = 0;
E = 0;
_nop_();
bufferdata = cmd;
_nop_();
E = 1;
_nop_();
_nop_();
E = 0;
_nop_();
}
/* 控制LCD 16列2行显示屏 */
void LCD1602_Showline(char row,char col,char *string)
{
switch(row)
{
case 1:
Write_cmd_Fuc(0x80 + col);
while(*string)
{
Write_data_Fuc(*string);
string++;
}
break;
case 2:
Write_cmd_Fuc(0x80 + 0x40 + col);
while(*string)
{
Write_data_Fuc(*string);
string++;
}
break;
}
}
void Delay15ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 27;
j = 226;
do
{
while (--j);
} while (--i);
}
void Delay5ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
/* LCD1602初始化 */
void LCD1602_Init(void)
{
//(1)延时 15ms
Delay15ms();
//(2)写指令 38H(不检测忙信号)
Write_cmd_Fuc(0x38);
//(3)延时 5ms
Delay5ms();
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
Write_cmd_Fuc(0x38);
//(6)写指令 08H:显示关闭
Write_cmd_Fuc(0x08);
//(7)写指令 01H:显示清屏
Write_cmd_Fuc(0x01);
//(8)写指令 06H:显示光标移动设置
Write_cmd_Fuc(0x06);
//(9)写指令 0CH:显示开及光标设置
Write_cmd_Fuc(0x0C);
}
/* 主函数 */
void main(void)
{
LCD1602_Init();
LCD1602_Showline(1,0, "520 happy" );
LCD1602_Showline(2,0, "I love you" );
while(1)
{
}
}