STM32嵌入式开发中OLED显示屏驱动详解
在嵌入式开发领域,OLED(有机发光二极管)显示屏凭借其自发光、高对比度、视角广、厚度薄等优势,成为众多项目中显示模块的热门选择。本文将详细介绍如何在 STM32 微控制器上驱动 OLED 显示屏,涵盖原理、硬件连接、代码实现以及调试技巧,助力开发者快速上手。
一、OLED 显示屏原理概述
OLED 显示屏主要分为 PMOLED(被动矩阵 OLED)和 AMOLED(主动矩阵 OLED),在嵌入式开发中常用的是 PMOLED。其核心原理基于有机材料在电场作用下自发光,每个像素点可独立控制发光,无需背光源。常见的 OLED 显示屏采用 I²C 或 SPI 通信协议与微控制器进行数据传输,本文以 I²C 协议为例展开讲解,该协议只需两根线(SDA 数据线和 SCL 时钟线)即可完成数据通信,节省硬件资源且便于布线。
二、硬件连接
1. 硬件准备
2. 连接方式
将 OLED 显示屏与 STM32 微控制器通过杜邦线进行连接,具体连接关系如下:
|
OLED 引脚 |
STM32 引脚 |
说明 |
|
VCC |
3.3V |
电源正极 |
|
GND |
GND |
电源负极 |
|
SDA |
PB7 |
I²C 数据线 |
|
SCL |
PB6 |
I²C 时钟线 |


三、代码实现
1. 配置 STM32 的 I²C 外设
在 STM32CubeMX 中进行配置:
- 打开 STM32CubeMX,选择对应的 STM32 芯片型号。
- 配置 RCC 时钟,使能 HSE(高速外部时钟)。
- 配置 I²C 外设,选择 I²C1(根据实际连接引脚选择),设置模式为 I²C 模式,时钟频率可设置为 100kHz(标准模式)。
- 生成初始化代码,选择对应的开发环境(如 Keil MDK)。
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!= '\0')
{
OLED_ShowChar(x, y, *p, Char_Size);
x += 8;
if (x > 120)
{
x = 0;
y += 2;
}
p++;
}
}
3. 在主函数中调用
在main.c文件中,包含oled.h头文件,并在main函数中调用初始化和显示函数:
#include "oled.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0, 0, "Hello, OLED!", 16);
while (1)
{
// 主循环逻辑
}
}
四、调试与常见问题解决
1. 调试工具
在调试过程中,可使用串口打印调试信息,或者利用 STM32 的调试器(如 ST-Link)进行单步调试,观察变量值和函数执行流程。
2. 常见问题及解决方法
通过以上步骤,我们成功实现了 STM32 对 OLED 显示屏的驱动,能够显示字符和字符串。在实际项目中,还可以进一步扩展功能,如显示图形、图片、实时数据等。希望本文能为你的嵌入式开发
作者:姚晓财