51单片机——LCD1602
1、1602液晶读写时序
(1)、读状况
RS=L,R/W=H,E=H。(判别忙结束后开释总线)
(2)、读数据
RS=H,R/W=H,E=H。
(3)、写指令
RS=L,R/W=L,D0~D7=指令码,E=高脉冲
(4)、写数据
RS=H,R/W=L,D0~D7=数据,E=高脉冲
2、液晶显现驱动文件
#include
#define LCD1602_DB P0
sbit LCD1602_RS = P1 ^ 0;
sbit LCD1602_RW = P1 ^ 1;
sbit LCD1602_E = P1 ^ 5;
/* 等候液晶准备好 */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_E = 1;
sta = LCD1602_DB; //读取状况字
LCD1602_E = 0;
}
while (sta & 0x80); //bit7等于1表明液晶正忙,重复检测直到其等于0停止
}
/* 向LCD1602液晶写入一字节指令,cmd-待写入指令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 设置显现RAM开始地址,亦即光标方位,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //由输入的屏幕坐标核算显现RAM的地址
{
addr = 0x00 + x; //榜首行字符地址从0x00开始
}
else
{
addr = 0x40 + x; //第二行字符地址从0x40开始
}
LcdWriteCmd(addr | 0x80); //设置RAM地址
}
/* 在液晶上显现字符串,(x,y)-对应屏幕上的开始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //设置开始地址
while (*str != ‘\0’) //接连写入字符串数据,直到检测到结束符
{
LcdWriteDat(*str++);
}
}
/* 初始化1602液晶 */
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2显现,5*7点阵,8位数据接口
LcdWriteCmd(0x0C); //显现器开,光标封闭
LcdWriteCmd(0x06); //文字不动,地址主动+1
LcdWriteCmd(0x01); //清屏
}