此次编程参考了《[color=rgba(0, 0, 0, 0.75)]LCD1602芯片的使用——简单易懂》文章的代码,并在此基础上加上了判断LCD1602“忙”状态的代码,解决了第二行无法显示的结果,这个的原因是由于开发板单片机的速度比控制1602的单片机速度快,导致有些字符1602还未来得及读取,造成了没有显示第二行的现象。
#include <reg51.h>
#include <string.h>
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P1^2;
unsigned char info_1[]=" ou xue bing"; // LCD1602第一行字符
unsigned char info_2[]=" wantin"; // LCD1602第二行字符
/* 延时 */
void delay(int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<200;j++);
}
}
void ready() //判断LCD1602是否处于“忙“的状态
{
unsigned int sta;
P0 = 0XFF;
RS = 0;
RW = 1;
do
{
EN=1;
sta=P0; //读取DB的状态
EN=0;
}while(sta&0x80); //0x80为10000000;用按位与判断最后一位是否为0,0的时候跳出循环
}
/* LCD1602 */
void LCD1602_WriteCMD(unsigned char cmd) //写入命令
{
ready(); // 判断LCD1602是否为“忙”状态
P0=cmd; // 将命令送入LCD1602
RS=0; // 命令选择端
RW=0; // 写选择端
EN=1; // LCD1602使能信号
EN=0;
delay(10); // 延时,使命令有充足时间读入
}
/* LCD1602写入一字节的数据,Data为待写入的数据*/
void LCD1602_WriteDATA(unsigned char Data)
{
ready(); // 判断LCD1602是否为“忙”状态
P0=Data; // 将数据送入LCD1602
RS=1; // 数据选择端
RW=0; // 写选择端
EN=1; // 使能信号
EN=0;
delay(10);// 延时,使数据有充足时间读入
}
/* 初始化LCD1602*/
void LCD1602_Initi()
{
LCD1602_WriteCMD(0x38); // 16*2显示,5*7点阵,8位数据接口
LCD1602_WriteCMD(0x0F); // 显示器打开,光标打开,如果是0xC0,光标关闭
LCD1602_WriteCMD(0x06); // 文字不动,地址加一(这里的地址加一不是很理解,请路过的大神解释一下,感谢)
LCD1602_WriteCMD(0x01); // 清屏
}
void main()
{
int i;
LCD1602_Initi();
LCD1602_WriteCMD(0x80); // 0x80为第一行第一格的地址
for(i=0;i<strlen(info_1);i++)
{
LCD1602_WriteDATA(info_1); // 输入第一行的字符
}
LCD1602_WriteCMD(0xc3); // 0xc3为第二行第四个的地址,0xc0为第二行第一格的地址
for(i=0;i<strlen(info_2);i++)
{
LCD1602_WriteDATA(info_2); // 输入第二行的字符
}
while(1);
}
|