### 4.3.13 I2C LCD1602模块

#### 4.3.13.1 简介

本教程将为您详细介绍I2C LCD1602模块的使用方法和应用技巧，该显示屏采用PCF8574T驱动芯片，背光 (蓝色背景和白色背光)。教程内容包括I2C LCD1602模块的工作原理、引脚功能、电路连接方法以及如何通过微控制器（如ESP32）控制显示内容。您将学习如何编写代码来使I2C LCD1602模块显示数字、字母等。无论您是电子初学者还是有经验的开发者，本教程都将帮助您掌握I2C LCD1602模块的应用，为您的项目增添清晰、生动的视觉显示功能。

#### 4.3.13.2 元件知识

![Img](../media/lcd.png)

LCD1602显示屏：显示屏有LCD 1602液晶显示屏和I2C LCD1602模块。但是我们在这个项目中使用的是一个I2C LCD1602模块。LCD 1602显示屏可以显示16列2行字符。它能够显示数字、字母、符号、ASCII码等。如下所示是一个单色LCD1602显示屏（在工作时需要占用控制板的7个IO口）及其电路引脚图：

![Img](../media/lcd-1.png)

I2C LCD1602模块集成了I2C接口，连接的串行输入&并行输出给LCD1602显示屏模块。这使得我们只要使用4条线路就可以来操作LCD1602。

![Img](../media/lcd-2.png)

本模块使用的IC芯片为PCF8574T (PCF8574AT)，其默认I2C地址为0x27(0x3F)。

在I2C LCD1602模块的背面有一个**金属电位器**。你可以用一字螺丝刀转动电位器来调整对比度。         

![Img](../media/lcd-3.png)

⚠️ **请注意：** 当你旋转电位器时，屏幕将变得更亮或更暗，适当的角度将使字体更清晰。

**原理图：**

![Img](../media/lcd-5.png)

**参数：**

- 显示像素：16 * 2 字符
- 芯片工作电压：4.5 ~ 5.5V
- 工作电流：2.0mA (5.0V)
- 模块最佳工作电压：5.0V
- I2C 地址：0x27
- 背光 (蓝色背景和白色背光)
- 背后的接线引脚分别为GND、VCC、SDA、SCL（SDA和SCL分别为IIC通讯的数据线和时钟线）。

**I2C 地址：**

默认地址基本上是 0x27，在少数情况下可能是 0x3F。

以默认地址 0x27 为例，可以通过短接 A0/A1/A2 焊盘来修改设备地址; 在默认状态下，A0/A1/A2 为 1，如果焊盘短路，则 A0/A1/A2 为 0。

![Img](../media/lcd-6.png)

**对比度：**

背面的电位器用于调整对比度（最亮的白色和最暗的黑色之间的亮度比）。

电位器 ：用于调整对比度（显示文本的清晰度），对比度在顺时针方向上增加，在逆时针方向上减少。

![Img](../media/lcd-7.png)

**I2C串行通信：**

I2C通信协议是Inter-Integrated Circuit（IIC）的缩写，也叫作两线制或TWI（Two-Wire Interface），是一种通用的主从式的两线总线通信协议，它是由Philips Semiconductor公司开发的（现在被美国NXP半导体公司收购）。

其最大的优点是只需要两根线就可以完成数据的传输，对于系统线路的繁琐也减少了很多，这种总线可以并行联结127个节点，并且支持多主机，从机一般不需要外接电源，因为I2C总线可以把电源传输到从机。如下图：

![Img](../media/cou75.png)

I2C总线的数据传输采用8位数据传输的方式，通常一个字节的数据传输是由9个时钟信号组成，8个时钟信号传输数据，最后一个时钟信号用于传输结束的标志。同时，I2C总线也支持多字节的数据传输，不断重复上述过程，即可完成多字节的数据传输。

I2C协议的基本组成部分包括以下内容：

- 起始信号：在发送数据之前，发送方必须发送起始信号，以告知接收方，要发送数据了。

- 地址码：地址码用于告知接收方，要发送的数据是给谁的。

- 数据：数据按照位传输，每次传输一个字节的数据。

- 停止信号：发送完数据后，发送方必须发送停止信号，以告知接收方，数据发送完毕。

Arduino提供了一个名为Wire.h的I2C协议集成库，可以通过调用其函数实现I2C通信，从而实现与I2C/TWI设备的通信。

具体库介绍参考官网链接：
[https://www.arduino.cc/reference/en/language/functions/communication/wire/](https://www.arduino.cc/reference/en/language/functions/communication/wire/)

#### 4.3.13.3 接线图

- **I2C LCD1602模块连接到 BUS I2C(SDA连接(SDA:IO21)、SCL连接(SCL:IO22)**

⚠️ **特别注意：智慧农场已经组装好了，这里不需要把I2C LCD1602模块拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![Img](../media/couj72.png)

#### 4.3.13.4 实验代码

⚠️ **特别注意：** 上传代码前要添加库文件，库文件存放在`Arduino_库文件`文件夹中名为`LiquidCrystal_I2C.zip`。

代码文件在`Arduino_代码`文件夹中，代码文件为`4_3_13_LCD1602`，如下图所示：

![Img](../media/couj015.png)

鼠标双击`4_3_13_LCD1602.ino`即可在Arduino IDE中打开。

```c++
/*
 * 文件名 : LCD1602
 * 功能   : LCD1602显示字符串等
 * 编译IDE：ARDUINO 2.3.6
 * 作者   : https://www.keyesrobot.cn/
*/

#include <LiquidCrystal_I2C.h>

//初始化LCD1602，其中0x27为I2C地址
//I2C接口:SDA引脚接SDA(IO21), SCL引脚接SCL(IO22)
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  //LCD初始化
  lcd.init();
  // 打开/关闭（可选）背光
  lcd.backlight();
  //lcd.noBacklight();

  //设置位置
  lcd.setCursor(0, 0);
  //显示
  lcd.print("HELLO WORLD 0");
  lcd.setCursor(0, 1);
  lcd.print("HELLO WORLD 1");

  //清空显示
  // lcd.clear();
}

void loop() {

}
```
#### 4.3.13.5 实验结果

按照接线图接好线，外接电源，选择好正确的开发板板型（ESP32 Dev Module）和 适当的串口端口（COMxx），然后单击按钮![Img](../media/cou0.png)上传代码。上传代码成功后，I2C LCD1602模块的显示屏会打开背光，并显示两行文字 “**HELLO WORLD 0**” 和 “**HELLO WORLD 1**”.  

![Img](../media/cou78.png)

⚠️ **注意：** 如果代码和接线正确，但 LCD 仍然无法显示任何内容，则可以调整背面的电位器以增加对比度。

#### 4.3.13.6 代码说明

（1）. 通过调用库`LiquidCrystal_I2C.h`，您可以轻松驱动 LCD 1602。
 
```c++                  
#include <LiquidCrystal_I2C.h>
```
库功能：

- 创建`LiquidCrystal_I2C`类，该类表示连接到开发板的特定 LCD 1602。

   - LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows)

     - `lcd_Addr`：LCD 1602 的地址默认为 0x27。

     -  `lcd_cols`：LCD 1602有 16 列。

     -  `lcd_rows`：LCD 1602 有 2 行。

（2）. 初始化 LCD 1602。

```c++
lcd.init()
```

（3）. 打开（可选）背光灯。

```c++
lcd.backlight()
```

（4）. 关闭（可选）背光。

```c++
lcd.noBacklight()
```

（5）. 打开 LCD 1602 显示屏。

```c++
lcd.display()
```

（6）. 快速关闭 LCD 1602 显示屏。

```c++
lcd.nodisplay()
```

（7）. 清除显示，将光标位置设置为零。

```c++
lcd.clear()
```

（8）. 将光标位置设置为 X行、X列。

```c++
lcd.setCursor(uint8_t col,uint8_t row)
```

（9）. 将文本打印到 LCD 1602 显示屏上。

```c++
lcd.print(data,BASE)
```
- `data`：要打印的数据（char、byte、int、long 或 string）。

- `BASE` (可选)：打印数字的底数。

   - `BIN`: 对于二进制 （以 2 为底数）

   - `DEC`: 对于十进制（以 10 为底数）

   - `OCT`: 对于八进制（以 8 为底数）

   - `HEX`: 对于十六进制（以 16 为底数）。
