news 2026/9/12 9:48:21

模块2 STM32程序开发-项目2 STM32 基础应用-任务5 OLED液晶显示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模块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接口,用于显示字符、图片等信息

图10.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 也不影响。

  1. 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所示。

图2PCtoLCD2002软件配置

5.OLED 核心驱动函数

OLED_Init(); // 初始化(软件I2C)

OLED_Clear(); // 清屏

OLED_ShowString(); // 显示字符串

OLED_ShowChinese();// 显示汉字

OLED_Refresh(); // 刷新屏幕

五、硬件连接

0.96 寸 IIC OLED 模块与主控STM32F103C8T6的引脚连接如表2所示。

表2OLED 模块与主控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屏显示信息

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 11:41:14

航天级GaN DC-DC转换器:设计、验证与辐射考核全解析

GaN(氮化镓)这几年在快充和服务器电源里已经不算新鲜词了,但“Space Qualified DC-DC Converters Leverage GaN Technology”这个说法一出来,情况就不太一样了。航天级电源意味着高可靠、抗辐射、宽温区、长寿命,这跟消…

作者头像 李华
网站建设 2026/8/30 11:05:20

AI双筒望远镜实测:识别、防抖与成像增强如何改变观察体验

AI 在双筒望远镜行业已经不是停留在纸面上的概念,而是正在变成一批能真实买到的产品。我最近集中体验了几类带 AI 功能的双筒望远镜和配套 App,最大的感受是:AI 确实改变了观察和使用方式,但它没有改变光学产品的基本逻辑——先看…

作者头像 李华
网站建设 2026/8/30 19:15:56

Linux PipeWire深度解析之pw_main_loop_get_loop调用流程与实战(八十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…

作者头像 李华
网站建设 2026/8/30 21:46:32

RL训练瓶颈在推理:独立扩展推理集群的架构与实践

先给结论:RL 的真正瓶颈是推理,不是训练 这次我们聊一个偏工程架构,而不是具体工具的主题:强化学习(RL)在 LLM 上训练时,最容易被忽略的性能瓶颈,是推理(Inference&#…

作者头像 李华
网站建设 2026/8/30 21:16:34

三年Android开发大厂面试经验分享,让你扫清Android面试障碍

怎样快速突破初级瓶颈,变身高级开发?怎样在短时间内提高自我身价,月薪提高50%?你是否是个代码高手,面试中却发挥不出来,想进阶却摸不着头脑。博主在互联网行业摸爬滚打,百面成钢。特来总结与分享…

作者头像 李华
网站建设 2026/8/30 13:52:46

【2015-01-17】GNU Readline Library编译及简单分析

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2015-01-17 | 标题:GNU Readline Library编译及简单分析 | 分类: 编程 / C && C &…

作者头像 李华