基于STM32驱动OLED12864单色屏幕的详细教程(含原理解析)
一、前言
OLED(Organic Light Emitting Diode)显示屏因其自发光、对比度高、功耗低等优点,在嵌入式系统中得到了广泛应用。本文将基于STM32微控制器,介绍如何驱动常见的OLED 128x64 单色屏幕,采用I2C或SPI接口方式进行通信,并从驱动原理、硬件连接、代码实现、注意事项等方面展开详细讲解,旨在为初学者和嵌入式开发者提供一套完整的开发思路。
注意:本文所有内容均为原创整理,未引用或复制受版权保护的库或内容。示例代码基于公开协议实现。
二、OLED12864 简介
OLED12864是指显示分辨率为128列x64行的OLED显示屏,常见为0.96英寸或1.3英寸单色屏幕,通常使用SSD1306控制芯片。支持的通信接口包括:
- I2C(两线:SCL/SDA)
- SPI(四线或三线:SCLK/MOSI/CS/DC/RST)
主要参数:
- 分辨率:128x64 像素
- 工作电压:3.3V 或 5V(需确认模块是否带有电平转换)
- 控制芯片:SSD1306 或 SH1106
- 通信接口:I2C / SPI
- 显示颜色:单色(通常为白色、蓝色或黄色)
SSD1306控制器特点:
- 内置显示RAM(GDDRAM)
- 显存容量:128x64 位(=1024字节)
- 可进行页寻址(每页8行,共8页)
- 支持水平和垂直寻址模式
三、原理解析
1. OLED显示原理
OLED 屏幕每一个像素都是一个独立的自发光单元,通过控制每个像素的亮灭来显示图像。对于单色OLED,像素要么点亮(1),要么熄灭(0)。
OLED 12864屏幕内部有一个128x64的显示缓存(GDDRAM),我们需要通过通信接口将想显示的像素图案写入该缓存区。
2. SSD1306内存映射
SSD1306 内部显示缓存是按页(page)划分的,每页包含8行,共8页。
每页包含128列 × 8行(共8字节)
页0 → 行0~7
页1 → 行8~15
...
页7 → 行56~63
也就是说,一个字节代表一列上的8个像素行的数据,从下到上(最低位对应最低行)。
3. 通信协议原理
I2C 通信:
- 地址:通常为 0x3C 或 0x78(实际取决于模块)
- 控制字节:
- 0x00:表示接下来的数据是命令
- 0x40:表示接下来的数据是数据
SPI 通信:
- 通常需要以下引脚:
- CS:片选
- DC:数据/命令选择
- SCL/SCLK:时钟
- SDA/MOSI:数据
- RST:复位
四、硬件连接(以I2C为例)
| OLED引脚 | STM32引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地 |
| SCL | PB6 | I2C 时钟 |
| SDA | PB7 | I2C 数据 |
说明:具体I2C引脚取决于你的STM32型号,可以使用STM32CubeMX进行配置。
五、STM32驱动OLED(I2C)代码实现
1. 初始化I2C
使用STM32CubeMX配置I2C接口为主机模式,设置时钟频率为400kHz。
在 main.c 中初始化:
extern I2C_HandleTypeDef hi2c1;
#define OLED_ADDR 0x78 // 或0x3C << 1
2. OLED 基本函数
void OLED_WriteCommand(uint8_t cmd) {
uint8_t data[2] = {
0x00, cmd};
HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDR, data, 2, HAL_MAX_DELAY);
}
void OLED_WriteData(uint8_t data_byte) {

&spm=1001.2101.3001.5002&articleId=149049266&d=1&t=3&u=6fe96a83aa2741b0b60743c635476c73)
1万+

被折叠的 条评论
为什么被折叠?



