1、LCD1602引脚说明
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。主要技术参数如下:
由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因如此,它不能很好的显示图片。外形如下图:
1602液晶引脚图功能如下:
- 3引脚 VL :液晶显示偏压信号。用来调整显示的黑点和不显示黑点之间的对比度,调整合适的对比度,可以使显示更加清晰。
- 4引脚 RS :数据命令选择端。用来判断接收到的是命令还是数据。高电平的时候是数据;低电平的时候是命令。
- 5引脚 R/W :读写功能选择端。通过这个引脚判断是给液晶写入数据(命令)还是读取液晶内部的数据(命令)。液晶本身具有RAM,所以送给液晶的命令或者数据首先保存在液晶的缓存里,然后再写到内部的寄存器或者RAM中,这个过程需要一定的时间,所以在读写操作之前,需要先读一下液晶的当前状态,如果是在忙,就需要继续等待,如果不忙,可以进行读写数据。读状态常用,读液晶内的数据并不常用。
- 6引脚 E :使能信号。读状态(数据)时,高电平有效;写状态(数据)时,高脉冲有效。
2、LCD1602的读写时序介绍
(1)RAM地址映射图
1602液晶内部带了80个字节的显示RAM,用来存储发送的数据,结构图如下:
每一行有40个字节地址,但只能显示前16个字节,后面的地址主要为显示移动字幕设置。1602字符液晶是显示字符的,与ASCII字符表对应。比如给地址0x00写入97(十进制)。液晶的最左上方小块就会显示一个字母a。液晶内部有一个数据指针,它指向哪里,我们写的数据就被送到哪个地址里面。
(2)状态字说明
液晶内部有一个状态字字节,通过读取这个状态字的内容来了解1602液晶的内部情况,如下:
每次进行读写操作之前都要进行读写检测,最高位为1,则表示液晶正忙,不可以进行读写操作,如果是0,则可以进行读写。低7位代表当前数据指针的位置。
(3)1602液晶读写时序
- 读状态:
RS = L,R/W = H , E = H
对应代码如下:
LCD1602_DB = 0xFF;//读外部状态前,保证自己是高电平
LCD1602_RS = 0;//低电平,接收的是命令
LCD1602_RW = 1;//高电平,读取液晶内部数据
do{
LCD1602_E = 1;//高电平,使能端有效
sta = LCD1602_DB;//读取状态字
LCD1602_E = 0;//读完撤销功能,防止液晶输出干扰P0总线
}while(sta & 0x80);
//bit7 = 1表示液晶正忙,重复检测直到其等于0
LCD1602_E = 1;
注意:①单片机读外部状态前,必须保证自己是高电平 ②读状态之前,要先检测液晶是否处于忙状态,只有bit7 = 0时,才能进行读写状态(数据)。 ③读写完后,要通过语句 LCD1602_E = 0 释放P0总线,以免干扰其他外设。
- 读数据:(不常用,不做解释)
RS = H,R/W = H , E = H
- 写指令:
RS = L,R/W = L ,D0~D7 = 指令码, E = 高脉冲
写指令之前,E引脚是低电平。通过前三句准备好数据之后,E使能引脚从低电平到高电平变化,然后E引脚再从高电平到低电平变化,出现一个下降沿,并且检测到 RS = L,R/W = L,就立刻读取D0~D7的数据,完成单片机写1602指令过程。
- 写数据:(类似于写指令)
RS = H,R/W = L ,D0~D7 = 数据, E = 高脉冲
(4)读写时序图
- 读操作时序图:
- 写操作时序图:
- 时序参数:
3、1602液晶的指令介绍
(1)显示模式设置(固定的0x38)
(2)显示开/关以及光标设置指令
(3)清屏指令(固定0x01)
写入0x01表示数据指针清零,所有的显示都请零;写入0x02仅仅是数据指针清零,显示不清零。
(4)RAM地址设置指令
该指令码的最高位为1,低7位为RAM的地址。
4、简单实例
以普中科技开发板为例,原理图如下:
实验现象:两行分别显示 Less interests . More interest.
首先进行位说明:
#define Lcd1602_DB P0
sbit Lcd1602_RW = P2^5; //读写控制端
sbit Lcd1602_RS = P2^6; //数据命令选择端
sbit Lcd1602_E = P2^7; // 使能信号
接着要说一下用到的函数:
void LcdWaitReady();//读状态
void LcdWriteCmd(u8 cmd);//写命令
void LcdWriteDat(u8 dat);//写数据
void LcdSetCursor(u8 x,u8 y);//设置RAM地址,(x,y)为坐标
void InitLcd1602();//液晶初始化
void LcdShowStr(u8 x,u8 y,u8 *str);//显示字符串,(x,y)为坐标
完整代码如下:
#include"reg52.h"
#define Lcd1602_DB P0
sbit Lcd1602_RW = P2^5; //读写控制端
sbit Lcd1602_RS = P2^6; //数据命令选择端
sbit Lcd1602_E = P2^7; // 使能信号
typedef unsigned char u8;
typedef unsigned int u16;
void InitLcd1602();
void LcdShowStr(u8 x,u8 y,u8 *str);
void main()
{
u8 str1[] = "Less interests"; //定义字符串
u8 str2[] = "More interest";
InitLcd1602();
LcdShowStr(0,0,str1);
LcdShowStr(0,1,str2);
while (1);
}
//读状态,忙位检测
void LcdWaitReady()
{
u8 sta;
Lcd1602_DB = 0xFF;//单片机读之前,必须保证内部是高电平
Lcd1602_RW = 1;//读
Lcd1602_RS = 0;//状态
do{
Lcd1602_E = 1; //使能信号有效
sta = Lcd1602_DB; //读取状态字
Lcd1602_E = 0; //使能信号无效,释放P0总线
} while(sta & 0x80); //bit7表示液晶正忙,重复检测直到其为0
}
//写指令,cmd为待写入命令值
void LcdWriteCmd(u8 cmd)
{
LcdWaitReady();
Lcd1602_RW = 0; //写
Lcd1602_RS = 0; //指令
Lcd1602_DB = cmd;
Lcd1602_E = 1; //使能信号E = 高脉冲
Lcd1602_E = 0;
}
//写数据
void LcdWriteDat(u8 dat)
{
LcdWaitReady();
Lcd1602_RW = 0; //写
Lcd1602_RS = 1; //数据
Lcd1602_DB = dat;
Lcd1602_E = 1; //使能信号E = 高脉冲
Lcd1602_E = 0;
}
//初始化1602液晶
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2显示,5*7矩阵,8位数据接口
LcdWriteCmd(0x0C); //显示器开,光标关闭
LcdWriteCmd(0x06); //文字不动,地址加1
LcdWriteCmd(0x01); //清屏
}
//设置显示RAM起始地址,即光标位置,(x,y)为对应屏幕上的字符坐标
void LcdSetCursor(u8 x,u8 y)
{
u8 addr;
if(y == 0) //由输入的屏幕坐标计算显示RAM的地址
addr = 0x00 + x; //第一行字符地址从0x00开始
else
addr = 0x40 + x; // 第二行字符地址从0x40开始
LcdWriteCmd(addr|0x80); //设置RAM地址
}
//在液晶上显示字符串,(x,y)为对应屏幕上的起始坐标,str为字符串指针
void LcdShowStr(u8 x,u8 y,u8 *str)
{
LcdSetCursor(x,y); //设置初始地址
while(*str != '\0') //连续写入字符串数据,直到检测都结束符
{
LcdWriteDat(*str++); //先取str指向的数据,然后str自加1
}
}
前一篇: 单片机学习(7)——UART串口通信