模块2 STM32程序开发-项目2 STM32 基础应用-任务5 OLED液晶显示
基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网
任务5 OLED液晶显示
一、任务描述
本任务基于STM32F103C8T6最小系统板,使用0.96 寸 IIC 接口 OLED 液晶屏实现字符、汉字与数据显示。采用PB8 作为 SCL、PB9 作为 SDA的软件 I2C 方式驱动 OLED 模块,通过PCtoLCD2002 软件获取汉字字模,实现中文、英文、数据的屏幕显示。掌握 STM32 软件 I2C 驱动、OLED 显示、汉字取模等综合开发能力。
二、任务目标
1. 知识目标
1)理解 0.96 寸 IIC OLED(SSD1306)的显示原理与通信方式。
2)掌握软件 I2C 与硬件 I2C 的区别。
3)掌握PB8/PB9 作为普通 GPIO 模拟 I2C 时序的工作原理。
4)掌握 PCtoLCD2002 汉字取模方式与字模使用方法。
5)理解 OLED 清屏、显示、刷新机制。
2. 能力目标
1)能够完成 OLED 硬件接线:VCC→3.3V、GND、SCL→PB8、SDA→PB9。
2)能够在不启用硬件 I2C 外设的情况下,使用软件 I2C 驱动 OLED。
3)能够使用 PCtoLCD2002 生成汉字字模并加入工程。
4)能够实现 OLED 清屏、显示字符串、显示汉字、动态数据刷新。
3. 素质目标
1)养成 “先驱动、再显示、后调试” 的嵌入式开发流程。
2)提升软件模拟通信、字模制作、显示排版、问题排查能力。
3)培养严谨规范的显示界面设计习惯。
三、任务重难点
1. 任务重点
1)软件 I2C 驱动 OLED(SCL=PB8,SDA=PB9)。
2)无需在 CubeMX 中开启硬件 I2C,仅用普通 GPIO 即可通信。
3)PCtoLCD2002 取模:阴码、逐行式、顺向、16×16。
4)OLED 初始化、清屏、显示字符串、显示汉字。
5)多内容排版与稳定显示。
2. 任务难点
1)理解软件 I2C 模拟时序原理。
2)汉字字模格式错误导致显示乱码。
3)OLED 显存机制与显示位置控制。
4)避免显示闪烁、花屏、不亮等问题。
四、知识准备
1. 0.96 寸 IIC OLED 模块介绍
0.96 寸 IIC OLED 模块,如图1所示,屏幕分辨率为 128*64 像素,白蓝双色显示,驱动芯片为 SSD1306,使用 IIC接口,用于显示字符、图片等信息。

图1 0.96 寸 IIC OLED 模块
驱动芯片:SSD1306
分辨率:128×64
通信方式:I2C
供电:3.3V
特点:自发光、高对比度、无需背光
2.软件 I2C 核心知识(重点:为什么不用配置 CubeMX 也能驱动)
本任务使用 软件模拟 I2C(Bit-Banging),而不是硬件 I2C 外设。 这就是 PB8、PB9 没有在 CubeMX 中配置 I2C,却能驱动 OLED 的根本原因。
(1)软件 I2C 原理
不使用 STM32 内部硬件 I2C 控制器。
直接将 PB8、PB9 配置为普通 GPIO。
通过代码手动控制引脚拉高拉低,模拟 I2C 的 SCL、SDA 时序。
与硬件 I2C 无关,因此 CubeMX 中 I2C2 即使 Disable 也不影响。
- GPIO 配置(软件 I2C 必须)
__HAL_RCC_GPIOB_CLK_ENABLE();
//SCL -> PB8
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 开漏输出
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// SDA -> PB9
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
(3)为什么 I2C2 是 Disable 也能用?
STM32F103C8T6 的 硬件 I2C2 只能使用 PB10、PB11。
本任务使用 PB8、PB9,不属于任何硬件 I2C 的默认引脚。
因此 CubeMX 中 I2C2 永远是 Disable,但软件 I2C 不受任何影响。
软件 I2C 可以使用任意 GPIO,不需要对应硬件 I2C 端口。
3.软件 I2C 与硬件 I2C 区别
硬件 I2C:需要 CubeMX 配置,固定引脚,速度快,时序稳定。
软件 I2C:无需 CubeMX 配置,任意引脚都能用,适合 OLED 这类低速设备。
软件 I2C 与硬件 I2C 区别见表1。
表1 软件 I2C 与硬件 I2C 区别
| 对比项 | 硬件 I2C(CubeMX 配置) | 软件 I2C(代码模拟) |
| 依赖 | STM32 的硬件 I2C 外设 | 通用 GPIO 引脚 |
| CubeMX 配置 | 必须启用对应外设 | 无需配置,代码里初始化 GPIO 即可 |
| 引脚限制 | 必须用特定的 SCL/SDA 引脚(如 PB10/PB11) | 任意 GPIO 引脚都可以(如 PB8/PB9) |
| 速度 | 由硬件自动生成时序,速度快、稳定 | 靠代码延时,速度慢,容易受系统影响 |
| 使用场景 | 高速、稳定的多设备通信 | 低速、GPIO 资源紧张,或硬件 I2C 被占用时 |
4. PCtoLCD2002 取字模知识
PCtoLCD2002是一款专门用于在LCD及其他显示设备上高效呈现数字图像和文本的取模工具。该软件支持多种中文编码系统,包括GB2312、GBK、BIG5等,并允许用户自定义字符集。此外,它能够处理常见图像格式并提供丰富的参数设置选项,以适应不同的显示需求。PCtoLCD2002简化了嵌入式系统和小屏幕设备上的内容显示,是开发和设计者在屏幕显示方面的一个重要工具。
取模模式:汉字模式。
格式:阴码、列行式、逆向、16×16。
输出:C51格式。
每个汉字占用32 字节(16×16)。
PCtoLCD2002软件配置如图2所示。

图2 PCtoLCD2002软件配置
5.OLED 核心驱动函数
OLED_Init(); // 初始化(软件I2C)
OLED_Clear(); // 清屏
OLED_ShowString(); // 显示字符串
OLED_ShowChinese();// 显示汉字
OLED_Refresh(); // 刷新屏幕
五、硬件连接
0.96 寸 IIC OLED 模块与主控STM32F103C8T6的引脚连接如表2所示。
表2 OLED 模块与主控STM32F103C8T6的引脚连接
| 编号 | 0.96寸_IIC_OLED模块 | 主控STM32F103C8T6 |
| 1 | VCC | 3V3 |
| 2 | GND | GND |
| 3 | SCL | PB8 |
| 4 | SDA | PB9 |
硬件连接电路图如图3所示。

图3 硬件连接电路图
六、任务实现
任务 5.1 添加 OLED 驱动
1.将oled.c文件放到hardware/src目录下。
2.将oled.h、oled_Font.h文件放到hardware/inc目录下。
3.在项目中添加oled.c文件。
4.将PCtoLCD2002 生成的汉字字模存入字模数组(见OLED_Font.h文件)。
任务 5.2 修改 main.c 代码
1.添加OLED驱动头文件
/* USER CODE BEGIN Includes */
//OLED驱动
#include "oled.h"
#include "oled_font.h"
/* USER CODE END Includes */
2.OLED驱动初始化
/* USER CODE BEGIN 2 */
OLED_Init(); //OLED驱动初始化
printf("任务5 OLED 液晶显示\r\n");
/* USER CODE END 2 */
3.OLED屏显示信息
在/* USER CODE BEGIN 3 */后添加如下代码:
// ============= 4. OLED 【0.2秒刷新一次】不闪屏 =================
// 第1行:温度
OLED_ShowChinese(1,1, CHN_WEN);
OLED_ShowChinese(1,2, CHN_DU);
OLED_ShowChinese(1,3, CHN_MH);
OLED_ShowChinese(1,6, CHN_SS); // ℃
// 第2行:湿度
OLED_ShowChinese(2,1, CHN_SHI);
OLED_ShowChinese(2,2, CHN_DU);
OLED_ShowChinese(2,3, CHN_MH);
OLED_ShowChinese(2,6, CHN_BF); // %
// 第3行:光照
OLED_ShowChinese(3,1, CHN_GUANG);
OLED_ShowChinese(3,2, CHN_ZHAO);
OLED_ShowChinese(3,3, CHN_MH);
// 第4行:知物学苑
OLED_ShowChinese(4,3, CHN_Z);
OLED_ShowChinese(4,4, CHN_W);
OLED_ShowChinese(4,5, CHN_X);
OLED_ShowChinese(4,6, CHN_Y);
if(HAL_GetTick() - oled_timer >= 200) // 200ms 刷新一次
{
oled_timer = HAL_GetTick();
if(temp!=0)
OLED_ShowNum(1,6, temp, 2);
if(humi!=0)
OLED_ShowNum(2,6, humi, 2);
if(Value_GY30()!=0)
OLED_ShowNum(3,6,light,4); // 光照一般 0-65535,用4位
}
任务 5.3 编译、下载、查看结果
1.点击编译按钮
,编译程序。
2.点击下载按钮
,下载程序。
3.打开串口调试助手,按stm32f103c8t6主控板上的复位键,在串口调试助手中输出打印信息,如图4所示。同时可以在OLED屏上看到显示的信息,如图5所示。

图4输出打印信息

图5 OLED屏显示信息
更多推荐
所有评论(0)