STM32嵌入式开发中OLED显示屏驱动详解
2025-09-25 来源:cnblogs
在嵌入式开发领域,OLED(有机发光二极管)显示屏凭借其自发光、高对比度、视角广、厚度薄等优势,成为众多项目中显示模块的热门选择。本文将详细介绍如何在 STM32 微控制器上驱动 OLED 显示屏,涵盖原理、硬件连接、代码实现以及调试技巧,助力开发者快速上手。
一、OLED 显示屏原理概述
OLED 显示屏主要分为 PMOLED(被动矩阵 OLED)和 AMOLED(主动矩阵 OLED),在嵌入式开发中常用的是 PMOLED。其核心原理基于有机材料在电场作用下自发光,每个像素点可独立控制发光,无需背光源。常见的 OLED 显示屏采用 I²C 或 SPI 通信协议与微控制器进行数据传输,本文以 I²C 协议为例展开讲解,该协议只需两根线(SDA 数据线和 SCL 时钟线)即可完成数据通信,节省硬件资源且便于布线。
二、硬件连接
1. 硬件准备
STM32 微控制器:本文以 STM32F103 系列为例,读者可根据实际项目需求选择其他型号。
OLED 显示屏:选用 0.96 寸 I²C 接口的 OLED 显示屏,分辨率为 128×64。
开发板:可使用官方开发板或自制开发板。
其他:杜邦线若干、电源等。
打开 STM32CubeMX,选择对应的 STM32 芯片型号。
配置 RCC 时钟,使能 HSE(高速外部时钟)。
配置 I²C 外设,选择 I²C1(根据实际连接引脚选择),设置模式为 I²C 模式,时钟频率可设置为 100kHz(标准模式)。
生成初始化代码,选择对应的开发环境(如 Keil MDK)。
2. 连接方式
将 OLED 显示屏与 STM32 微控制器通过杜邦线进行连接,具体连接关系如下:
OLED 引脚 | STM32 引脚 | 说明 |
VCC | 3.3V | 电源正极 |
GND | GND | 电源负极 |
SDA | PB7 | I²C 数据线 |
SCL | PB6 | I²C 时钟线 |


三、代码实现
1. 配置 STM32 的 I²C 外设
在 STM32CubeMX 中进行配置:
2. 编写 OLED 驱动代码
在生成的工程中,创建oled.c和oled.h文件用于存放 OLED 驱动代码。
(1)初始化函数
TypeScript
复制
void OLED_Init(void)
{
// 复位OLED
OLED_RST_Clr();
HAL_Delay(100);
OLED_RST_Set();
HAL_Delay(100);
// 发送初始化命令
OLED_WR_Byte(0xAE, OLED_CMD); // 关闭显示
OLED_WR_Byte(0x00, OLED_CMD); // 设置低列地址
OLED_WR_Byte(0x10, OLED_CMD); // 设置高列地址
OLED_WR_Byte(0x40, OLED_CMD); // 设置起始行地址
OLED_WR_Byte(0x81, OLED_CMD); // 设置对比度控制
OLED_WR_Byte(0xCF, OLED_CMD);
OLED_WR_Byte(0xA1, OLED_CMD); // 设置段重定义
OLED_WR_Byte(0xA6, OLED_CMD); // 设置正常显示
OLED_WR_Byte(0xA8, OLED_CMD); // 设置多路复用率
OLED_WR_Byte(0x3F, OLED_CMD);
OLED_WR_Byte(0xC8, OLED_CMD); // 设置COM输出扫描方向
OLED_WR_Byte(0xD3, OLED_CMD); // 设置显示偏移
OLED_WR_Byte(0x00, OLED_CMD);
OLED_WR_Byte(0xD5, OLED_CMD); // 设置显示时钟分频比/振荡器频率
OLED_WR_Byte(0x80, OLED_CMD);
OLED_WR_Byte(0xD9, OLED_CMD); // 设置预充电周期
OLED_WR_Byte(0xF1, OLED_CMD);
OLED_WR_Byte(0xDA, OLED_CMD); // 设置COM引脚硬件配置
OLED_WR_Byte(0x12, OLED_CMD);
OLED_WR_Byte(0xDB, OLED_CMD); // 设置VCOMH电压等级
OLED_WR_Byte(0x40, OLED_CMD);
OLED_WR_Byte(0x8D, OLED_CMD); // 设置电荷泵使能
OLED_WR_Byte(0x14, OLED_CMD);
OLED_WR_Byte(0xAF, OLED_CMD); // 开启显示
}
(2)写数据和命令函数
TypeScript
复制
void OLED_WR_Byte(uint8_t dat, uint8_t cmd)
{
I2C_HandleTypeDef hi2c1 = OLED_I2C; // 假设OLED_I2C为I²C句柄
uint8_t data[2];
data[0] = cmd? 0x40 : 0x00;
data[1] = dat;
HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDRESS, data, 2, 1000);
}
(3)清屏函数
TypeScript
复制
void OLED_Clear(void)
{
uint8_t i, n;
for (i = 0; i < 8; i++)
{
OLED_WR_Byte(0xb0 + i, OLED_CMD);
OLED_WR_Byte(0x00, OLED_CMD);
OLED_WR_Byte(0x10, OLED_CMD);
for (n = 0; n < 128; n++)
OLED_WR_Byte(0x00, OLED_DATA);
}
}
(4)显示字符和字符串函数
TypeScript
复制
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)
{
// 实现字符显示逻辑,此处省略具体代码
}
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *p, uint8_t Char_Size)
{
while (*p!= '




