LCD (Liquid Crystal Display) 液晶显示屏是一种广泛使用的一种字符型液晶显示模块。其中型号1602表示每行显示16个字符、一共2行。LCD1602相比于OLED最大的好处就是不用使用SPI或I2C等任何通信协议,而是由mbed直接将命令传给LCD从而实现控制。
LCD1602主要参数如下:
LCD1602一共有16个管脚,分别是VSS, VDD, V0(VL), RS, RW(R/W), E, D0, D1, D2, D3, D4, D5, D6, D7, A(BLA), K(BLK)。
各引脚功能如下:
引脚号 | 引脚名称 | 功能 | 电源连接 |
---|---|---|---|
1 | VSS | 电源地(接地) | 0V |
2 | VDD | 电源正极 | 5V |
3 | V0 | 液晶显示偏压(调节对比度),高电平时对比度最弱,低电平时对比度最高,可以通过外接电位器调整对比度 | 0V |
4 | RS | 数据/命令选择(选择写入命令还是数据),高电平时选择数据寄存器、低电平时选择指令寄存器 | / |
5 | R/W | 读/写选择(选择读出还是写入) | *0V |
6 | E | 使能信号 (ENABLE),由高电平跳变为低电平时,液晶模块读入并执行命令 | / |
7 | D0 | 低位双向数据传输线 | / |
8 | D1 | 低位双向数据传输 | / |
9 | D2 | 低位双向数据传输 | / |
10 | D3 | 低位双向数据传输 | / |
11 | D4 | 高位双向数据传输 | / |
12 | D5 | 高位双向数据传输 | / |
13 | D6 | 高位双向数据传输 | / |
14 | D7 | 高位双向数据传输 | / |
15 | A | 背光源正极 | 5V |
16 | K | 背光源负极 | 0V |
*注:通常情况在简单使用中无需向LCD中写入数据,此时只需将R/W管脚一直置于0V即可。
首先我们要搞清楚LCD1602的接受命令的原理:每当使能引脚(E)发生一个跳变(高电平变为低电平)时,便会接受一条命令或数据。
这里我们需要弄清楚其两种工作模式:4位数据模式与8位数据模式。4位数据模式使用D4 ~ D7,每次传输 4bits;8位数据模式使用D0 ~ D7,每次传输 8bits。一条命令或数据通常占8bits,所以在4位数据模式下,传输一条命令需要传输两次,即总共需要两次跳变。相比之下,4位数据模式,最大的好处便是可以省下4个引脚 (毕竟有些单片机引脚真的太少啦 !)
命令(command)指通过一系列二进制数据来调整LCD相关参数及配置其基本显示模式。常见的包括清屏、设置数据模式、控制光标开关、光标闪烁、控制屏幕显示等。根据以上所说,我们知道每一条命令都是8位比特。
所有命令控制如下:
其中(1)~(6)是主要需要设置的,其余不需要操作。在4位数据模式下
例:如果我们需要写入数据后画面不动;显示开、光标关、闪烁关;光标右移,4位数据模式、两行显示、5*7点阵;我们就需要写入如下命令(D0~D7):
(3):0000 0110(0x6)
(4):0000 1100(0x0c)
(5):0001 0100(0x14)
(6):0010 1000(0x28)
同命令一样,每一个数据(字符)也是通过8比特告知LCD的。LCD遵循的标准为ASCII,同时也可以通过下图查阅:
该表 行是低四位,列是高四位。想要显示哪个字符,只需查表,换算为十六进制,写入LCD1602即可。使用4位数据模式时,先向LCD写入高四位(upper 4 bits),再写入低四位(lower 4 bits)。
不论命令还是数据,我们在向 LCD 发送时都需要使能引脚有一个高电平向低电平的跳变。
DigitalOut E(?); // 使能信号
void toggle_enable()
{
E = 1; //拉到高电平
thread_sleep_for(10); // 保持 10ms
E = 0; //拉到低电平
thread_sleep_for(10); // 保持 10ms
}
先解释一下为什么需要这个函数:单片机和 LCD1602 的工作速度存在差异,单片机速度快,所以单片机向 LCD1602 传数据时,LCD1602 可能正在处理上一次的数据,处在忙状态,为了防止数据丢失或出错,所以单片机就需要等待,待 LCD1602 处理完时在进行下一次数据的传送。
/**********************************************
LCD_Data 与 0x80 进行AND运算,判断 bit7 位状态:
若 LCD_Data 的 bit7 位是 0,则 LCD 不忙;
若 LCD_Data 的 bit7 位是 1,则 LCD 忙;
***********************************************/
DigitalOut RS(?);
DigitalOut E(?); // 使能信号
DigitalOut RW(?);
BusOut data(?, ?, ?, ?); // D4 ~ D7传输数据
void LCD_Check_Busy()
{
unsigned char temp;
data = 0xff; // 十六进制:1111 1111
RS = 0; // 0 指令
RW = 1; // 1 读
do
{
E = 1; // 拉高
temp = data; // 将 LCD 状态保存在 temp 中,用于判忙
E = 0; // 负跳变使能
} while (temp & 0x80); // 结果为 1,LCD 忙,继续循环;结果为 0,LCD不忙,可以进行后面的操作
}
写入命令函数主要用于发送命令 value 中的内容;
void display_to_COM(char value)
{
RS = 0; // 设置为低电平来写命令
RW = 0; // 设置为写
data = (value) >> 4; // 数值右移4位,发送高四位
toggle_enable(); // 发送
data = (value); // 数值跟0x0F相与,发送低四位
toggle_enable(); // 发送
}
写入命令函数主要用于发送数据 value 中的内容;
void display_to_LCD(char value)
{
RS = 1; // 设置为高电平来写数据
RW = 0; // 设置为写
E = 0;
data = (value) >> 4; // 数值右移4位,发送高四位
toggle_enable(); // 发送
data = (value); // 数值跟0x0F相与,发送低四位
toggle_enable(); // 发送
}
在 LCD1602 进行显示前,需要进行输入方式设置,显示开关设置,光标、画面移位设置,功能设置等,确定 LCD1602 的工作方式。
void LCD_init()
{
LCD_Check_Busy();
RS = 0;
E = 0;
RW = 0;
display_to_COM(0x01); // 清屏
display_to_COM(0x02); // 显示模式,光标复位
display_to_COM(0x0);
display_to_COM(0x0c); // 显示开、光标关、闪烁关(一般做带键盘输入的才加入光标,常用的计量显示不显示光标)
display_to_COM(0x28); // 4位数据模式、两行显示、5*7点阵
display_to_COM(0x0);
display_to_COM(0x01); // 清屏
}
在main.cpp中就主要使用最后三个函数,所以在头文件 LCD.h 中只需要声明这三个函数就好啦!
#ifndef LCD_H
#define LCD_H
#include "mbed.h"
void LCD_init(void);
void display_to_LCD(char value);
void display_to_COM(char value);
#endif
1、Guan_qiqi:快速掌握——LCD1602液晶显示(多组实验,附带源程序)
2、m0_46195580:STM32入坑(10)STM32驱动1602显示模块
3、Z小旋:【常用传感器】LCD1602液晶工作原理详解及例程代码