首先,来看一下,LCD1602的几个功能引脚
E=P2^7; //使能,1-数据有效
RW=P2^5;//0-写,1-读
RS=P2^6;//0-指令,1-数据
接下来,是读操作时序
接下来,是写时序
下面是LCD1602相关的指令
那么接下来,就开始进入写代码环节
首先,我们需要写一个读忙信号函数,这个函数是比较重要,如果不读忙信号,就只能通过延时来滤除处理时间,不然,会出现一些乱码或者接收不到数据的问题
void Read_Busy()
{
uint8_t busy;
LCD1602_DATAPINS=0xff;
LCD1602_RS=0;
LCD1602_RW=1;
do
{LCD1602_E=1;
busy=LCD1602_DATAPINS;
LCD1602_E=0;
}while(busy & 0x80);
}
接下来就可以按照,时序图,写出写函数了
void LCD1602_Write_Com(uint8_t command)
{
Read_Busy();
LCD1602_RW=0;//写
LCD1602_RS=0;//指令
LCD1602_DATAPINS=command;
LCD1602_E=1; //使能
_nop_();
LCD1602_E=0;
_nop_();
}
读函数
void LCD1602_Write_Data(uint8_t DataPort)
{
Read_Busy();
LCD1602_RW=0;//写
LCD1602_RS=1;//数据
LCD1602_DATAPINS=DataPort;
LCD1602_E=1; //使能
_nop_();
LCD1602_E=0;
_nop_();
}
到这里,写函数和度函数就写完了,在写函数和读函数的开头都执行了度忙信号函数,可以避免上一个指令还没执行完就执行下一个程序的问题
接下来是1602的初始化函数
void LCD1602_Init()
{
LCD1602_Write_Com(0x38);//2行,5*7
LCD1602_Write_Com(0x06);//AC+1
LCD1602_Write_Com(0x0f);//开光标,显示闪烁
LCD1602_Write_Com(0x01);//清屏
}
接下来我们要在1602上显示我们所需要的东西,还需要写上坐标,第一行的首坐标为0x80,第二行的首坐标为0x40,因此,需要在第二行第一个显示的坐标为0x80+0x40
下面,我们写一个坐标函数
void LCD1602_SetCursor(uint8_t Line,uint8_t Column)
{
//第一行
if(Line==1)
{
LCD1602_Write_Com(0x80|(Column-1));
}
else if(Line==2) //第二行
{
LCD1602_Write_Com(0x80|(Column-1+0x40));
}
}
最后,我们写一下主函数,并显示一个字符
void main()
{
LCD1602_Init();//初始化
LCD1602_SetCursor(2,5);//二行五列
LCD1602_Write_Data('$');//写数据函数
while(1)
{
}
}
到此,程序就写完了,接下来,我们看一下实验现象
最后在LCD1602的第二行,第五列,显示了个"$",欢迎讨论。