基于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 也不影响。

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

图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屏显示信息

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐