LCD1602数据手册简图
读命令—当前状态是否处于“忙”
unsigned char LCD_readbusy()
{
unsigned char temp;
RS = 0;
RW = 1;
EN = 0;
P2 = 0xff;
/*拉高IO口才不会影响数据线上的数据。
原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,
而低电平一般不可能被高电平拉高。*/
EN = 1;
temp = P2;
//读取当前LCD1602的状态
delay(5);
EN = 0;
return(temp & 0x80);
//最高位为1表示禁止读写,为0表示允许读写
}
写数据和写命令,关于延时可以看时序图,一般51单片机是微秒操作
时序图中是纳秒级别,所以某些延时可以相对取消
----------------------tips-------------------
#include<intrins.h> //其中有nop函数的定义
/*对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当
汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率
算出延时时间,对于12M晶振,延时1uS。*/
_nop_();//函数
void LCD_write_dat(unsigned char dat) //写数据
{
while(LCD_readbusy());
RS = 1;
RW = 0;
EN = 0;
P2 = dat;
EN = 1;
delay(5);
EN = 0;
}
void LCD_write_cmd(unsigned char cmd) //写命令
{
while(LCD_readbusy());
RS = 0;
RW = 0;
EN = 0;
P2 = cmd;
EN = 1;
delay(5);
EN = 0;
}
初始化LCD1602,可以看4指令说明中的初始化设置(再上图中)
常见命令在下图中
void LCD_init()
{
EN = 0;
LCD_write_cmd(0x38);
LCD_write_cmd(0x0c);
LCD_write_cmd(0x06);
LCD_write_cmd(0x01);
}
将display函数作为独立函数再放入main函数中可以让main函数更简明
在学习过程中尽量向行业规范和后续使用进行有利操作。
void display_1()
{
unsigned char i = 0;
LCD_write_cmd(0x80);
delay(5);
while(str[i] != '\0')
{
LCD_write_dat(str[i]);
/*这附近可以使用指针更加简洁,不过我没整明白,后续来补充
如果有大佬知晓,愿详闻之*/
delay(5);
i++;
}
}
LCD1602还有很多待补充坑:CGRAM编写,滚动显示等