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 列
我的经验: 如果你用 SH1106 但按 SSD1306 的驱动写,显示内容会整体右移 2 列。我曾经在这个问题上折腾了一下午,最后发现是数据手册里写的列起始地址不同。嗯,看手册要仔细。

1.2 OLED 显示原理:为什么它不需要背光?

OLED 的全称是 Organic Light Emitting Diode,有机发光二极管。每个像素就是一个微型 LED,通电自己发光。

这和 LCD 完全不同。LCD 靠背光透过液晶层显示,所以黑底时背光依然亮着,功耗降不下来。OLED 显示黑色时像素完全熄灭,不耗电。你想想看,这对电池供电的设备有多友好。

单色 OLED 每个像素只有两种状态:亮或不亮。驱动芯片通过控制每个像素的电流通断来显示内容。说白了,就是一张位图,1 代表亮,0 代表灭。

核心概念: 单色 OLED = 像素矩阵 + 驱动芯片 + 无背光。每个像素独立发光,黑色就是关断。

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 是最下面一行。

注意: 页寻址模式下,写数据是自动列递增的。写完第 0 列,列地址自动加 1。但页地址不会自动翻页!你需要手动切换页地址。我曾经见过有人写满一页后继续写,结果数据全写到同一页的后面去了,屏幕只显示一条横线。

三种寻址模式对比:

模式 列地址行为 页地址行为 适用场景
页寻址模式 列递增,到 127 后回 0 不变,需手动改 逐页刷新,最常用
水平寻址模式 列递增,到 127 后页 +1 自动递增 全屏刷新
垂直寻址模式 页递增,到 7 后列 +1 自动递增 竖屏滚动

我个人习惯用页寻址模式。虽然要手动管理页地址,但控制更灵活,适合做局部刷新。

1.4 帧缓冲的概念:为什么需要它?

帧缓冲就是一块内存区域,用来保存屏幕当前应该显示的内容。你在内存里画图,然后一次性刷到 OLED 上。

为什么不能直接写屏幕?因为 OLED 的刷新速度有限,而且频繁写屏幕会占用大量 SPI/I²C 带宽。更关键的是,如果你一边写屏幕一边修改数据,会出现撕裂——上半屏是旧内容,下半屏是新内容。

帧缓冲的典型大小:128 × 64 ÷ 8 = 1024 字节。刚好 1KB。

我的建议: 即使你的 MCU 内存紧张,也尽量保留帧缓冲。没有帧缓冲的驱动,显示效果会差很多。我在一个 STM8 项目上试过直接写屏,结果刷新时屏幕一直在闪,后来加了 1KB 的缓冲就稳了。

1.5 知识结构图:本章核心脉络

下面这张图帮你理清 SSD1306/SH1106 的知识体系。建议保存下来,后面写代码时对照着看。

OLED驱动芯片知识结构图 OLED驱动芯片知识结构 OLED驱动芯片 芯片类型 显示原理 寻址模式 帧缓冲 SSD1306 SH1106 像素自发光 无背光 页寻址 水平寻址 1KB 内存 核心要点 页寻址是基础,帧缓冲是关键,芯片差异在列偏移

1.6 本章小结

这一章我们覆盖了三个核心知识点:

  • 芯片选型: SSD1306 和 SH1106 基本兼容,但 SH1106 有 2 列偏移,驱动时要处理。
  • 显示原理: OLED 像素自发光,无背光,省电且对比度高。
  • 页寻址模式: 8 页 × 128 列,每列 1 字节对应 8 个像素。页地址不会自动翻页,必须手动切换。
记住一句话: 写 OLED 就是往帧缓冲里填数据,然后通过 SPI/I²C 把缓冲刷到芯片的页里。后面所有章节都围绕这个核心展开。