一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)

索引

  • 一、总览
    • 1.1 简介
    • 1.2 LCD1602主要参数
  • 二、管脚介绍
  • 三、时序图
    • 3.1 写操作时序
    • 3.2 读操作时序
    • 3.3 时序时间参数
  • 四、命令与数据(以使用4位数据模式为例)
    • 4.1 前期准备
    • 4.2 写入命令
      • ——命令表
    • 4.3 写入数据
      • ——字模库
  • 五、模块化编程(以使用4位数据模式为例)
    • 5.1 基础函数
      • 5.1.1 触发发送函数【void toggle_enable()】
      • 5.1.2 检测忙函数【void LCD_Check_Busy()】
    • 5.2 封装使用函数
      • 5.2.1 写入命令函数【void display_to_COM(char value)】
      • 5.2.2 写入数据函数【void display_to_LCD(char value)】
      • 5.2.3 初始化函数【void LCD_init()】
    • 5.3 头文件 LCD.h
  • 六、参考资料

一、总览

1.1 简介

LCD (Liquid Crystal Display) 液晶显示屏是一种广泛使用的一种字符型液晶显示模块。其中型号1602表示每行显示16个字符、一共2行。LCD1602相比于OLED最大的好处就是不用使用SPI或I2C等任何通信协议,而是由mbed直接将命令传给LCD从而实现控制。

1.2 LCD1602主要参数

LCD1602主要参数如下:

  • 显示字符:16×2个字符;
  • 工作电压:4.5 ~ 5V;
  • 工作电流:2.0mA;
  • 工作温度:-20°C~70°C;
  • 模块最佳工作电压:5.0V;
  • 单个字符尺寸:2.95mm×4.35mm(Width×Height);
  • 引脚:16脚;

先看看长啥样:
一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第1张图片

二、管脚介绍

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第2张图片

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即可。

三、时序图

3.1 写操作时序

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第3张图片

3.2 读操作时序

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第4张图片

3.3 时序时间参数

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第5张图片

四、命令与数据(以使用4位数据模式为例)

4.1 前期准备

首先我们要搞清楚LCD1602的接受命令的原理:每当使能引脚(E)发生一个跳变(高电平变为低电平)时,便会接受一条命令或数据。

这里我们需要弄清楚其两种工作模式:4位数据模式与8位数据模式。4位数据模式使用D4 ~ D7,每次传输 4bits;8位数据模式使用D0 ~ D7,每次传输 8bits。一条命令或数据通常占8bits,所以在4位数据模式下,传输一条命令需要传输两次,即总共需要两次跳变。相比之下,4位数据模式,最大的好处便是可以省下4个引脚 (毕竟有些单片机引脚真的太少啦 !)

4.2 写入命令

命令(command)指通过一系列二进制数据来调整LCD相关参数及配置其基本显示模式。常见的包括清屏、设置数据模式、控制光标开关、光标闪烁、控制屏幕显示等。根据以上所说,我们知道每一条命令都是8位比特。

所有命令控制如下:

——命令表

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第6张图片
其中(1)~(6)是主要需要设置的,其余不需要操作。在4位数据模式下
例:如果我们需要写入数据后画面不动;显示开、光标关、闪烁关;光标右移,4位数据模式、两行显示、5*7点阵;我们就需要写入如下命令(D0~D7):

(3):0000 0110(0x6)
(4):0000 1100(0x0c)
(5):0001 0100(0x14)
(6):0010 1000(0x28)

4.3 写入数据

同命令一样,每一个数据(字符)也是通过8比特告知LCD的。LCD遵循的标准为ASCII,同时也可以通过下图查阅:

——字模库

一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)_第7张图片
该表 行是低四位,列是高四位。想要显示哪个字符,只需查表,换算为十六进制,写入LCD1602即可。使用4位数据模式时,先向LCD写入高四位(upper 4 bits),再写入低四位(lower 4 bits)。

五、模块化编程(以使用4位数据模式为例)

5.1 基础函数

5.1.1 触发发送函数【void toggle_enable()】

不论命令还是数据,我们在向 LCD 发送时都需要使能引脚有一个高电平向低电平的跳变。

DigitalOut E(?);	// 使能信号

void toggle_enable()
{
    E = 1;	//拉到高电平
    thread_sleep_for(10);	// 保持 10ms
    E = 0;	//拉到低电平
    thread_sleep_for(10);	// 保持 10ms
}

5.1.2 检测忙函数【void LCD_Check_Busy()】

先解释一下为什么需要这个函数:单片机和 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不忙,可以进行后面的操作
}

5.2 封装使用函数

5.2.1 写入命令函数【void display_to_COM(char value)】

写入命令函数主要用于发送命令 value 中的内容;

void display_to_COM(char value)
{
    RS = 0;	// 设置为低电平来写命令
    RW = 0;	// 设置为写
    data = (value) >> 4;	// 数值右移4位,发送高四位
    toggle_enable();		// 发送
	data = (value);			// 数值跟0x0F相与,发送低四位
    toggle_enable();		// 发送
}

5.2.2 写入数据函数【void display_to_LCD(char value)】

写入命令函数主要用于发送数据 value 中的内容;

void display_to_LCD(char value)
{
    RS = 1;	// 设置为高电平来写数据
    RW = 0;	// 设置为写
    E = 0;
    data = (value) >> 4;	// 数值右移4位,发送高四位
    toggle_enable();		// 发送
	data = (value);			// 数值跟0x0F相与,发送低四位
    toggle_enable();		// 发送
}

5.2.3 初始化函数【void LCD_init()】

在 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);	// 清屏
}

5.3 头文件 LCD.h

在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液晶工作原理详解及例程代码

你可能感兴趣的:(stm32,单片机,嵌入式硬件)