1. OLED驱动芯片概述:SSD1306/SH1106芯片介绍、OLED显示原理、像素与页寻址模式
做嵌入式显示这么多年,我接触最多的就是 SSD1306 和 SH1106 这两颗芯片。说实话,市面上绝大多数 0.96 寸、1.3 寸的单色 OLED 模块,背后都是它们在干活。你买到的模块,要么是 SSD1306,要么是 SH1106,几乎没有例外。
这一章我们先搞清楚它们是什么、怎么工作的。后面写驱动时才不会懵。
1.1 两颗主流驱动芯片:SSD1306 与 SH1106
这两颗芯片都是单色 OLED 驱动控制器,支持 128×64 像素分辨率。但它们不是完全一样的。
| 对比项 | SSD1306 | SH1106 |
|---|---|---|
| 内部 RAM | 128×64 位(1KB) | 132×64 位(约 1.1KB) |
| 页模式 | 8 页,每页 128 列 | 8 页,每页 132 列 |
| 通信接口 | SPI / I²C / 并行 | SPI / I²C / 并行 |
| 兼容性 | 最广泛,Arduino 生态标配 | 与 SSD1306 指令集基本兼容 |
| 常见坑 | 列地址偏移需手动处理 | 列地址从 2 开始,显示会偏 2 列 |
1.2 OLED 显示原理:为什么它不需要背光?
OLED 的全称是 Organic Light Emitting Diode,有机发光二极管。每个像素就是一个微型 LED,通电自己发光。
这和 LCD 完全不同。LCD 靠背光透过液晶层显示,所以黑底时背光依然亮着,功耗降不下来。OLED 显示黑色时像素完全熄灭,不耗电。你想想看,这对电池供电的设备有多友好。
单色 OLED 每个像素只有两种状态:亮或不亮。驱动芯片通过控制每个像素的电流通断来显示内容。说白了,就是一张位图,1 代表亮,0 代表灭。
1.3 像素与页寻址模式:你必须搞懂的内存映射
这是新手最容易晕的地方。我刚开始也绕了很久。
SSD1306 内部有一块 128×64 位的 SRAM,对应屏幕上的 128 列 × 64 行像素。但芯片不是按「行」来组织数据的,而是按「页」。
什么是页?
芯片把 64 行分成 8 组,每组 8 行,称为一页。所以:
- 页数 = 64 ÷ 8 = 8 页(Page 0 ~ Page 7)
- 每页宽度 = 128 列(Column 0 ~ Column 127)
- 每页高度 = 8 行
当你往某一页的某一列写一个字节时,这个字节的 8 个 bit 就对应这一列从上到下的 8 个像素。bit0 是最上面一行,bit7 是最下面一行。
三种寻址模式对比:
| 模式 | 列地址行为 | 页地址行为 | 适用场景 |
|---|---|---|---|
| 页寻址模式 | 列递增,到 127 后回 0 | 不变,需手动改 | 逐页刷新,最常用 |
| 水平寻址模式 | 列递增,到 127 后页 +1 | 自动递增 | 全屏刷新 |
| 垂直寻址模式 | 页递增,到 7 后列 +1 | 自动递增 | 竖屏滚动 |
我个人习惯用页寻址模式。虽然要手动管理页地址,但控制更灵活,适合做局部刷新。
1.4 帧缓冲的概念:为什么需要它?
帧缓冲就是一块内存区域,用来保存屏幕当前应该显示的内容。你在内存里画图,然后一次性刷到 OLED 上。
为什么不能直接写屏幕?因为 OLED 的刷新速度有限,而且频繁写屏幕会占用大量 SPI/I²C 带宽。更关键的是,如果你一边写屏幕一边修改数据,会出现撕裂——上半屏是旧内容,下半屏是新内容。
帧缓冲的典型大小:128 × 64 ÷ 8 = 1024 字节。刚好 1KB。
1.5 知识结构图:本章核心脉络
下面这张图帮你理清 SSD1306/SH1106 的知识体系。建议保存下来,后面写代码时对照着看。
1.6 本章小结
这一章我们覆盖了三个核心知识点:
- 芯片选型: SSD1306 和 SH1106 基本兼容,但 SH1106 有 2 列偏移,驱动时要处理。
- 显示原理: OLED 像素自发光,无背光,省电且对比度高。
- 页寻址模式: 8 页 × 128 列,每列 1 字节对应 8 个像素。页地址不会自动翻页,必须手动切换。