/**等待液晶准备好***/
void LcdWaitReady()
{
uint8 sta; //定义一个变量用于存放状态字
LCD1602_DB=0xff; //读取之前先置1
LCD1602_RS=0; //数据/命令(H/L)
LCD1602_RW=1; //读/写(H/L)
do
{
LCD1602_E=1; //使能位置1
sta=LCD1602_DB; //读取状态字
LCD1602_E=0; //使能位清零
}while(sta&0x80); //BIT7等于1表示液晶正忙,重复检测直到其等于0为止
}
/***向液晶写入一字节的命令,cmd-待写入的命令值***/
void LcdWriteCmd(uint8 cmd)
{
LcdWaitReady(); //查询是否忙,忙的话继续等待,不忙的话往下进行
LCD1602_RS=0; //数据/命令(H/L)
LCD1602_RW=0; //读/写(H/L)
LCD1602_DB=cmd; //把待写入的命令字节赋给1602数据口
LCD1602_E=1; //使能位置1
LCD1602_E=0; //使能位清零,目的是产生一个高脉冲,在下降沿的时候会把命令写入
}
/* 向 LCD1602 液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(uint8 dat)
{
LcdWaitReady(); //查询是否忙,忙的话继续等待,不忙的话往下进行
LCD1602_RS=1; //数据/命令(H/L)
LCD1602_RW=0; //读/写(H/L)
LCD1602_DB=dat; //把待写入的数据字节赋给1602数据口
LCD1602_E=1; //使能位置1
LCD1602_E=0; //使能位清零,目的是产生一个高脉冲,在下降沿的时候会把命令写入
}
/***设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标***/
void LcdSetCursor(uint8 x,uint8 y)
{
uint8 addr; //由输入的屏幕坐标计算显示RAM的地址
if(y==0)
addr=0x00+x; //第一行字符地址从0x00开始
else
addr=0x40+x; //第二行字符地址从0x40开始
LcdWriteCmd(addr|0x80); //设置RAM地址
}
/***在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针***/
void LcdSetStr(uint8 x,uint8 y,uint8 *str)
{
LcdSetCursor(x,y); //设置起始地址
while(*str!='\0')
{
LcdWriteDat(*str++); //先取str指向的数据,然后str自加1
}
}
/***初始化1602液晶***/
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2显示,5*7点阵,8位数据口
LcdWriteCmd(0x0c); //显示器开,光标关闭
LcdWriteCmd(0x06); //文字不动,地址自加1
LcdWriteCmd(0x01); //清屏
}
+++++++++++++++++++++++++++++++
主函数里面:
InitLcd1602(); //初始化1602
LcdWriteCmd(0x01); //清屏
LcdSetStr(0,0,"SF:ABCDEFGHIJKLMN");
LcdSetStr(0,1,"1234567890abcdefg");
实际情况显示:上面显示内容中,S显示成c,abcdef显示成QRSTUV,其他显示都对的。
谢谢帮助
|