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

一、总览

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脚;

先看看长啥样:
在这里插入图片描述

二、管脚介绍

在这里插入图片描述

LCD1602一共有16个管脚,分别是VSS, VDD, V0(VL), RS, RW(R/W), E, D0, D1, D2, D3, D4, D5, D6, D7, A(BLA), K(BLK)。

各引脚功能如下:

引脚号引脚名称功能电源连接
1VSS电源地(接地)0V
2VDD电源正极5V
3V0液晶显示偏压(调节对比度),高电平时对比度最弱,低电平时对比度最高,可以通过外接电位器调整对比度0V
4RS数据/命令选择(选择写入命令还是数据),高电平时选择数据寄存器、低电平时选择指令寄存器/
5R/W读/写选择(选择读出还是写入)*0V
6E使能信号 (ENABLE),由高电平跳变为低电平时,液晶模块读入并执行命令/
7D0低位双向数据传输线/
8D1低位双向数据传输/
9D2低位双向数据传输/
10D3低位双向数据传输/
11D4高位双向数据传输/
12D5高位双向数据传输/
13D6高位双向数据传输/
14D7高位双向数据传输/
15A背光源正极5V
16K背光源负极0V

*注:通常情况在简单使用中无需向LCD中写入数据,此时只需将R/W管脚一直置于0V即可。

三、时序图

3.1 写操作时序

在这里插入图片描述

3.2 读操作时序

在这里插入图片描述

3.3 时序时间参数

在这里插入图片描述

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

4.1 前期准备

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

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

4.2 写入命令

命令(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)

4.3 写入数据

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

——字模库

在这里插入图片描述
该表 行是低四位,列是高四位。想要显示哪个字符,只需查表,换算为十六进制,写入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液晶工作原理详解及例程代码

  • 28
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
您可以按照以下步骤来实现基于STM32Mbed平台使用四角按键控制LCD显示屏切换: 1. 首先,您需要连接好STM32和LCD显示屏,并且在Mbed平台上导入相关的库文件,例如涉及到LCD显示屏的库文件等。 2. 接下来,您需要编写代码来处理四个角落按键的输入。您可以选择使用中断处理程序或轮询方式来检测按键状态。在检测到按键按下时,您可以执行相应的操作,例如切换不同的LCD显示屏。 3. 在切换LCD显示屏时,您需要先将当前的显示屏关闭,然后打开需要切换到的显示屏。这可以通过控制LCD显示屏的GPIO口来实现。 4. 最后,您需要在Mbed平台上编写一个循环程序来不断检测四个角落按键的状态,并且根据按键状态来切换不同的LCD显示屏。 下面是一个简单的代码示例: ```c++ #include "mbed.h" #include "LCD.h" // 定义涉及到的引脚 DigitalIn up(A0); DigitalIn down(A1); DigitalIn left(A2); DigitalIn right(A3); // 定义LCD显示屏对象 LCD lcd(p5, p6, p7, p8, p25, p24); // 定义两个不同的LCD显示屏 LCD_Driver lcd1(16, 2, &lcd); LCD_Driver lcd2(20, 4, &lcd); int main() { // 初始化涉及到的引脚 up.mode(PullUp); down.mode(PullUp); left.mode(PullUp); right.mode(PullUp); // 初始化LCD显示屏 lcd1.init(); lcd2.init(); // 默认显示第一个LCD显示屏 lcd1.show(); while (1) { // 检测四个角落按键的状态 if (!up) { // 切换到第一个LCD显示屏 lcd2.hide(); lcd1.show(); } else if (!down) { // 切换到第二个LCD显示屏 lcd1.hide(); lcd2.show(); } else if (!left) { // 执行其他操作 // ... } else if (!right) { // 执行其他操作 // ... } } } ``` 需要注意的是,上述代码只是一个简单的示例,实际应用中可能需要根据实际情况进行修改和优化。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值