I2C LCD1602 HAL库
时间: 2025-05-14 10:51:04 浏览: 16
### 关于I2C LCD1602与HAL库的相关资料及示例代码
#### 驱动实现概述
LCD1602 是一种常见的字符型液晶显示器,通过 I2C 接口连接到 STM32 微控制器可以显著减少所需的 GPIO 数量。STM32 的 HAL 库提供了丰富的接口函数来简化 I2C 总线的操作[^2]。为了驱动 LCD1602,通常会使用一个带有 I2C 接口的适配模块(如 PCF8574 或类似的扩展芯片),该模块作为从设备挂载在 I2C 总线上。
以下是基于 HAL 库的 I2C LCD1602 示例代码及其说明:
---
#### 初始化 I2C 外设
首先需要初始化 STM32 的 I2C 外设。可以通过 CubeMX 工具自动生成基础代码,或者手动编写如下配置:
```c
// 定义 I2C 地址和句柄
#define LCD_ADDRESS 0x27 // 根据实际硬件设置调整地址
I2C_HandleTypeDef hi2c1;
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 设置时钟频率为 100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler(); // 错误处理函数
}
}
```
此部分代码用于初始化 I2C1 外设,并将其配置为主模式,通信速度为 100 kHz[^3]。
---
#### 编写通用 I2C 发送函数
定义一个发送单字节数据至指定地址的通用函数:
```c
void I2C_SendByte(uint8_t address, uint8_t reg, uint8_t data)
{
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(&hi2c1, address, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
if (status != HAL_OK)
{
Error_Handler();
}
}
```
`HAL_I2C_Mem_Write()` 函数用于向特定内存位置写入数据,适用于带寄存器映射的设备。
---
#### LCD 控制命令集
LCD1602 支持一系列控制指令,例如清屏、光标移动、显示开关等。这些指令可以直接通过 I2C 转发给 LCD 模块。以下是一些常用命令:
| 命令 | 描述 |
|------|------|
| `0x01` | 清屏 |
| `0x0C` | 显示开,光标关闭 |
| `0x06` | 文本右移 |
---
#### 实现 LCD 初期化函数
初始化 LCD 并设置基本参数:
```c
void LCD_Init(void)
{
delay_ms(50); // 上电延时
I2C_SendByte(LCD_ADDRESS, 0x00, 0x38); // 功能设置:8位数据长度,2行显示,5x7点阵
delay_ms(5);
I2C_SendByte(LCD_ADDRESS, 0x00, 0x0C); // 开启显示,关闭光标
delay_ms(5);
I2C_SendByte(LCD_ADDRESS, 0x00, 0x06); // 自增地址计数器,文字不滚动
delay_ms(5);
I2C_SendByte(LCD_ADDRESS, 0x00, 0x01); // 清屏
delay_ms(5);
}
```
以上代码完成了 LCD 的初始配置,包括显示模式、光标状态以及屏幕清除操作[^1]。
---
#### 字符打印函数
提供一个简单的字符串打印功能:
```c
void LCD_Print(char *str)
{
while (*str)
{
I2C_SendByte(LCD_ADDRESS, 0x40, *(str++)); // 将字符写入 DDRAM
}
}
void LCD_SetCursor(uint8_t row, uint8_t col)
{
uint8_t addr;
switch(row){
case 0: addr = 0x00 + col; break;
case 1: addr = 0x40 + col; break;
default: return;
}
I2C_SendByte(LCD_ADDRESS, 0x00, 0x80 | addr); // 设置 DDRAM 地址指针
}
```
`LCD_Print()` 函数逐个将字符串中的字符发送到 LCD;而 `LCD_SetCursor()` 则允许定位光标的位置以便分多行显示内容。
---
#### 测试程序
最后,在主循环中调用上述函数测试 LCD 是否正常工作:
```c
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_I2C1_Init();
LCD_Init();
LCD_SetCursor(0, 0);
LCD_Print("Hello World");
LCD_SetCursor(1, 0);
LCD_Print("STM32-I2C");
while (1)
{
HAL_Delay(1000); // 主循环延迟一秒
}
}
```
运行后,屏幕上应依次显示两行文本:“Hello World” 和 “STM32-I2C”。
---
###
阅读全文
相关推荐


















