LCD1602介绍

LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
显示容量:16×2个字符,每个字符为5*7点阵

LCD1602背面的两个黑色的块是芯片,是自带扫描功能的,只需将字符传给LCD1602,芯片便会自己扫描显示

引脚及说明

引脚功能
VSS
VDD电源正极(4.5~5.5V)
VO对比度调节电压
RS数据/指令选择,1为数据,0为指令
RW读/写选择,1为读,0为写
E使能,1为数据有效,下降沿执行命令
D0~D7数据输入/输出
A背光灯电源正极
K背光灯电源负极

开发板原理图上的LCD1602模块

可以看到,8位的数据都接到了单片机的P0口,控制位EN、RS、WR分别接到了P2.7、P2.6、P2.5口,后续编写代码时,初始化这几个引脚即可

逻辑框图

编写代码往DDRAM中写入指令或者数据,写入指令则设置LCD显示的相关参数,写入数据,比如想显示一个字符A,则LCD1602会根据字符A的ASCII码值去本身自带的字模库中找对应的字符,并将其显示在屏幕上

注意:数据显示区有40 * 2 = 80个区,但屏幕才只有16 * 2 = 32个显示区,超过屏幕的数据显示区部分可以通过移位或者写入滚动指令来进行显示

存储器结构

后续编写代码就是往这个数据显示区写入指令或者数据

要显示某个字符,例如A,将A上面的4位地址放到左边地址的高4位中,就组成了一个8位的地址,写入对应的十六进制就可以显示该字符

这字模库的字符位置是与ASCII码表一致的,所以可以参照ASCII码表的十六进制来显示不同的字符

时序结构

写操作时序图

根据时序图,可以写出LCD写入一个字节的函数

/**  * @brief LCD1602写数据  * @param 要写入的数据  * @retval无  */void LCD_WriteData(unsigned char Data){LCD_RS = 1;//就这里与写指令的不同,写数据时RS是置1LCD_WR = 0;LCD_DATAPORT = Data;LCD_EN = 1;//EN使能,表示数据有效,将数据发送到LCD的显示芯片中Delay1ms(100);LCD_EN = 0;Delay1ms(100);}

读操作时序图

读取LCD的数据比较少用,并且这次实验也没有用到

LCD1602指令集

往LCD中写入这些指令则可以设置相关功能

检测忙信号

数据手册中在LCD初始化说明处指出每次读/写数据操作都要检测忙信息,所以上图指令9就是根据读BF的值判断是否处于忙状态,这就要去读LCD的值,用到了读数据时序,根据读时序编写一个检测忙的函数

(实验现象说明不用检测忙信号也可以正常显示字符,但按照手册来检测会比较严谨)

/**  * @brief LCD1602检测忙信号,使用到读时序  * @param 无  * @retval无  */void Check_Busy(){unsigned char temp = 0x80;LCD_DATAPORT = 0x80;/*变量初始化时让其处于忙状态,进入while循环,如果一直忙,则BF位一直为1,while成死循环,如果BF=0,则不忙,退出while循环,执行后续程序*/while(temp & 0x80)//0x1000 0000检测BF位{LCD_RS = 0;//根据指令9,RS = 0LCD_WR = 1;//根据指令9,RW = 1LCD_EN = 0;Delay1ms(10);LCD_EN = 1;Delay1ms(10);temp = LCD_DATAPORT;//根据读数据时序图,在EN为高电平时读取数据LCD_EN = 0;Delay1ms(10);}}

LCD1602操作流程

初始化:

初始化要写的参数在手册上已经给出了,只要按照手册来即可

​ 发送指令0x38 //八位数据接口,两行显示,5*7点阵
​ 发送指令0x0C //显示开,光标关,闪烁关
​ 发送指令0x06 //数据读写操作后,光标自动加一,画面不动
​ 发送指令0x01 //清屏

显示字符:

​ 发送指令0x80|AC //设置光标位置,是指令集中DDRAM的地址设置,最高位置1才是进行DDRAM地址设置,剩下的位写要写入数 据的地址
​ 发送数据 //发送要显示的字符数据
​ 发送数据 //发送要显示的字符数据

编写代码显示字符、字符串、十进制、十六进制、二进制可看这篇文章:https://blog.csdn.net/weixin_46251230/article/details/125116531