索引

一、总览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脚;

先看看长啥样:

二、管脚介绍

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

各引脚功能如下:

引脚号引脚名称功能电源连接1VSS电源地(接地)0V2VDD电源正极5V3V0液晶显示偏压(调节对比度),高电平时对比度最弱,低电平时对比度最高,可以通过外接电位器调整对比度0V4RS数据/命令选择(选择写入命令还是数据),高电平时选择数据寄存器、低电平时选择指令寄存器/5R/W读/写选择(选择读出还是写入)*0V6E使能信号 (ENABLE),由高电平跳变为低电平时,液晶模块读入并执行命令/7D0低位双向数据传输线/8D1低位双向数据传输/9D2低位双向数据传输/10D3低位双向数据传输/11D4高位双向数据传输/12D5高位双向数据传输/13D6高位双向数据传输/14D7高位双向数据传输/15A背光源正极5V16K背光源负极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液晶工作原理详解及例程代码

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: