I2C OLED驱动实战:SSD1306接线、初始化与调试全解析

发布时间:2026/10/20 8:02:27
I2C OLED驱动实战:SSD1306接线、初始化与调试全解析 很多人搜“l2c oled 驱动”时其实想找的就是 I2C 接口的小尺寸 OLED 屏幕驱动方案。这类屏幕在嵌入式圈子里太常见了0.96 寸、1.3 寸分辨率 128x64背面一颗 SSD1306 控制芯片对外只引出 VCC、GND、SCL、SDA 四根线。它的优点是接线少、点亮快、资料多非常适合做传感器数据显示、小型交互面板和桌面小工具。这篇文章我会从硬件接线、I2C 地址扫描、SSD1306 初始化序列、像素坐标换算、常见翻车现场一直讲到进阶玩法尽量把“l2c oled 驱动”这件事拆成可以照着抄的流程同时也把每一步背后的为什么讲清楚。适合刚接触 MCU 和嵌入式显示的新手也适合已经点过屏但想彻底搞懂驱动原理的开发者和爱好者。1. 为什么选这种方案I2C OLED 的优势与适用场景1.1 两根信号线为什么够用OLED 屏幕本身并没法直接拿几条 GPIO 去驱动它内部密密麻麻排列着 128x64 个像素点任何一个像素都要有对应的行选和列选控制。所以小尺寸 OLED 模块上都会有一颗驱动 IC常见的比如 SSD1306、SSD1315、SH1106。这颗 IC 好比是屏幕的“管家”MCU 只需要把显示数据和命令告诉它剩下怎么刷新、怎么产生内部电荷泵电压都由它处理。这样一来MCU 和 OLED 之间的通信链路就简化为一个“命令通道”而 I2C 正好是低成本、低引脚开销的通道。I2C 用两根线SCL 负责时钟SDA 负责数据。所有挂在同一条总线上的设备都共享这两根线每个设备有独立地址主控通过地址来区分找谁。你可能会担心两根线带宽够不够对于 128x64 单色屏来说整帧数据是 128x64 比特也就是 1024 字节。就算是 100kHz 的标准 I2C 速率传完整帧也只要 100ms 级别用 400kHz 的快速模式时间能降到 25ms 左右。对于显示温度、湿度、文本菜单、波形曲线这类场景完全够用。相比 SPI 接口牺牲一点刷新率换来的是省掉 CS、DC、RES 等多根控制线还能方便地和其他 I2C 传感器、时钟芯片挂在同一条总线上。1.2 I2C、SPI、并行的取舍很多人纠结选 I2C 版还是 SPI 版 OLED。我直接说结论如果你只是做数据展示、状态面板不需要高帧率动画I2C 版是综合体验最好的。SPI 版确实刷新快接口速率到 10MHz 甚至更高时整屏刷新只要几毫秒适合做小游戏或者实时波形示波器但它一般占用 4 到 6 根 GPIO尤其有些开发板引脚紧张时省下来的引脚比那点刷新速度值钱得多。还有一种老的 8080 并行接口8 根数据线加一堆控制线在线材和 GPIO 上寸土寸金现在基本只有老式彩色屏模块还保留。普通小尺寸 OLED 的 I2C 版模块通常已经把上拉电阻、电荷泵相关电路都集成好了你只需要接对四根线再写一段初始化序列就能点亮。更别说 I2C 天然支持总线挂载多个设备一个主控既能驱动 OLED又能读温湿度传感器和气压计整条总线不乱。1.3 适用场景和选型建议从实际应用来看I2C OLED 的强项在于“安静地显示信息”自制气象站显示温度湿度气压、桌面待办事项屏、路由器监控面板、智能家居中控屏、调试时打印变量状态甚至小型可穿戴设备的简单菜单都很有用。我见过有人用它在模拟项目 X 里做实时 CPU 占用率曲线还有人把它塞进机械键盘里显示按键状态效果都很不错。选型时注意几个点0.96 寸最常见128x64 分辨率1.3 寸模块部分用的是 SSD1306部分用的是 SH1106两者指令集高度相似但内部 RAM 的列偏移不一样代码不能无脑通用。如果你买到的模块屏幕上内容显示错位先怀疑是不是驱动 IC 型号认错了。购买时优先选引出排针齐全、带有 SA0 地址选择焊盘或引脚的模块因为这样你可以通过拉高或拉低 SA0 改变 I2C 地址以后想并联第二块屏时非常方便。此外模块电源注意看说明绝大多数支持 3.3V部分也兼容 5V但不清楚的情况下先用 3.3V 最稳。2. 核心细节拆解I2C 协议、SSD1306 内存模型和命令格式2.1 I2C 协议里你需要掌握的几件事I2C 协议看起来抽象实质上就是一套“对话规则”。主机先拉低 SDA 同时保持 SCL 为高表示发起开始条件然后发送 8 位数据高 7 位是从机地址最低位是读写方向0 表示写1 表示读每发送 8 位后接收方必须拉低 SDA 给出一个应答信号 ACK。如果发送地址后从机没有应答说明总线上没有这个设备或者地址写错了。地址这块特别容易犯迷糊。SSD1306 的 7 位地址由 SA0 引脚决定SA0 接低电平时地址是 0x3C接高电平时是 0x3D。很多模块默认 SA0 已固定到地所以地址为 0x3C。但有些库在写地址时需要你传入左移一位后的 8 位地址 0x78这是因为末尾加了一位读写标志。同一个物理地址在 7 位表示方式下是 0x3C在 8 位方式下是 0x78两者相差一倍很多人在这里卡了很久。速率上SSD1306 的 I2C 接口一般最高支持 400kHz标准模式 100kHz 最稳妥。接线一长、上拉电阻偏大、总线上设备增多都会导致信号沿变缓。不要一上来就把 I2C 时钟调到最高先翻车再回头降速的案例我见过太多。开漏结构还意味着 SCL 和 SDA 必须有上拉电阻一般模块板上已经焊好 4.7k 或 10k 电阻自己飞线时别漏掉这一环。2.2 SSD1306 的显存不能按二维数组来理解SSD1306 内部有一块 128x64 比特的显存每一位对应屏幕上的一个像素0 熄灭、1 点亮。但显存的组织方式不是按“第 x 行第 y 列”线性排列的而是按页划分。整块显存共 1024 字节分成 8 页每一页负责 8 行像素。第 0 页对应第 0 到第 7 行第 1 页对应第 8 到第 15 行依此类推。每一页里128 字节依序对应屏幕的 128 列每个字节的 bit0 到 bit7 控制该页内部的 8 行。这里有个生活化的类比假设屏幕是 8 层叠放的滤网每一层只有 8 行像素那么厚每层的 128 个孔就是 128 列。要控制某个点先找到它属于第几层再找到该层上的列位置最后操作对应的孔。代码如下时页号就是 y 坐标除以 8组内行号就是 y 坐标对 8 取余。SSD1306 支持多种寻址模式常见的是页寻址、水平寻址、垂直寻址。页寻址模式下写完一列后列地址自动加一到 127 后列地址回到 0但页号不会自动增加需要软件重新设置页地址。大多数初始化序列默认设置成页寻址模式简单直接适合手动刷新局部区域。水平寻址和垂直寻址模式在整屏连续刷写时更省心因为地址会按照行列顺序自动递增写完一整屏不用反复设置页和列。所以如果你打算把 1024 字节的缓冲按页顺序连续刷给屏幕页寻址模式就够了如果想要更灵活的局部刷新也可以切换寻址模式但要记得改回自己熟悉的状态。2.3 只有两类数据命令 0x00图像数据 0x40通过 I2C 访问 SSD1306 时每次写入都要先发一个控制字节。控制字节为 0x00表示接下来发送的是命令控制字节为 0x40表示接下来发送的是显存数据。这是整个 OLED 驱动里最简单也最核心的规则理解了它再看任何驱动源码都不容易懵。命令通常由一个或多个字节组成比如设置对比度命令 0x81 后面必须跟一个参数 0x00 到 0xFF设置多路复用比命令 0xA8 后面跟行数参数打开电荷泵命令 0x8D 后面跟 0x14。初始化时你得按照数据手册里的顺序把这些命令挨个发一遍少一条或者参数不对屏幕就可能完全不亮或显示异常。显存数据则是一连串的像素比特在页寻址模式下发送的第一个字节会写入当前页、当前列之后列自动递增。发送初始化序列的伪 C 代码大概长这样void oled_write_byte(uint8_t type, uint8_t data) { // type0x00 发送命令type0x40 发送数据 uint8_t buf[2]; buf[0] type; buf[1] data; i2c_write_bytes(OLED_ADDR, buf, 2); } void oled_init(void) { oled_write_byte(0x00, 0xAE); // 关闭显示 oled_write_byte(0x00, 0xD5); oled_write_byte(0x00, 0x80); // 内部时钟频率 oled_write_byte(0x00, 0xA8); oled_write_byte(0x00, 0x3F); // 64 行多路复用比 oled_write_byte(0x00, 0xD3); oled_write_byte(0x00, 0x00); // 显示偏移为 0 oled_write_byte(0x00, 0x40); // 起始行 0 oled_write_byte(0x00, 0x8D); oled_write_byte(0x00, 0x14); // 打开内部电荷泵 oled_write_byte(0x00, 0x20); oled_write_byte(0x00, 0x00); // 页寻址模式 oled_write_byte(0x00, 0xA1); // 段重映射 oled_write_byte(0x00, 0xC8); // COM 扫描方向 oled_write_byte(0x00, 0xDA); oled_write_byte(0x00, 0x12); // COM 引脚硬件配置 oled_write_byte(0x00, 0x81); oled_write_byte(0x00, 0xCF); // 对比度 oled_write_byte(0x00, 0xAF); // 开启显示 }中间几行命令如果不好记可以分成几个功能模块来理解设置屏幕驱动结构多路复用比、偏移、起始行、设置内部电源时钟、电荷泵、对比度、预充电、设置内存访问方式寻址模式、扫描方向、最后开启显示。屏幕出现左右镜像时改 A0/A1上下颠倒时改 C0/C8就能在不改硬件的情况下调整画面方向。2.4 驱动不止是点亮还有缓冲区这一课点亮屏幕只是开始真正好用的驱动必须考虑缓冲区。原因是 SSD1306 通过 I2C 读取显存的能力很弱而且像素操作如果每次直接读改写屏幕不但慢还容易因为 I2C 事务太多把总线占满。实践中普遍的做法是在 MCU 内存里开一块 1024 字节的数组作为屏幕显存的影子。绘制文字、画线、画矩形时先修改这块数组最后用一个 show 或 flush 函数把整块数组一次写入屏幕。缓冲区也带来一个常见问题闪烁。如果直接在屏幕上先清屏再画图肉眼会看到一明一暗的闪动。解决办法是用双缓冲后台缓冲区用来完整绘制下一帧绘制完成后一次性切换交给前台发送前台缓冲区继续显示老内容。双缓冲会占用双倍 RAM但对大部分有 20KB 以上 RAM 的 MCU 来说2KB 完全没压力。对于资源紧张的单片机可以退而求其次减少更新区域只刷新变化的页和列。3. 动手实操从接线到点亮屏幕的完整流程3.1 材料、接线和上电顺序你需要准备一块 I2C 接口的 OLED 模块常见是四针VCC、GND、SCL、SDA。有的模块还会引出 RES 复位脚但纯 I2C 模式下一般不需要 MCU 控制复位拉高或者悬空也能工作不过最稳妥的是接到 VCC 或 GPIO 输出高电平。主控这边任意有 I2C 外设的 MCU 都行没有硬性 I2C 也可以用普通 GPIO 模拟时序只要速率别太离谱。接线表很直观模块引脚接到说明VCC3.3V 或 5V按模块标注电压不确定就选 3.3VGNDGND必须和主控共地SCL主控 I2C 时钟引脚例如某款 MCU 的 SCL 引脚SDA主控 I2C 数据引脚例如某款 MCU 的 SDA 引脚上电顺序有个容易被忽略的点先接 GND 和 VCC再接 SCL 和 SDA。因为 I2C 如果先把信号线接上供电还没建立时可能会有电流从 GPIO 灌进模块的 ESD 保护二极管长期这样做有一定风险。另外接线尽量短不要搞 30cm 以上的杜邦线至少在最初调试时别这样。线一长寄生电容变大200kHz 以上就容易出现数据错乱。3.2 先扫描地址别急着写满屏数据很多新手拿到模块直接套网上的初始化代码明明代码没问题却白屏。我习惯先做一件事扫描 I2C 总线确认模块的地址到底是多少。在某个 Linux 单板机上可以直接用系统自带的 I2C 工具扫描i2cdetect -y 1屏幕上会打印一张地址表如果模块正常供电且在总线上一般会在 0x3c 或 0x3d 位置看到一个编号。如果你的环境没有现成工具也可以写一段最简扫描代码比如在 Python 固件环境下from machine import Pin, I2C i2c I2C(0, sclPin(22), sdaPin(21), freq400000) print(scan result:, i2c.scan())正常情况下会输出类似[60]也就是十进制 60对应十六进制 0x3C。如果输出空列表先检查接线是否共地、VCC 是否有电压、SDA 和 SCL 是否接反。还有一个非常容易踩的坑模块在背板上已经有上拉电阻但你的主控 I2C 外设同时内部也开了上拉两个上拉并联后总电阻偏低对信号反而更有利但如果你用 GPIO 软件模拟 I2C一定要确认 GPIO 是否配置成了漏极开路且外部有没有上拉。3.3 初始化之后马上画一行字扫描到地址后把前面第 2.3 节里的初始化序列跑一遍屏幕应当处于开启状态但里面还没有内容所以屏幕上大概率是均匀的黑屏。这时候你需要在一片背景中用像素点亮信息。最简单的测试是画一个坐标点或者写一个字符。如果你用的是带内置字体库的封装代码会很短from machine import I2C, Pin import ssd1306 i2c I2C(0, sclPin(22), sdaPin(21), freq400000) oled ssd1306.SSD1306_I2C(128, 64, i2c) oled.text(Hello I2C OLED, 0, 0) oled.show()这里text只是把字符点阵写入内存缓冲区show才是真正把缓冲内容推送到屏幕。忘了调用show或没刷新缓冲区屏幕就会一直保持原来的状态这是新手最常问的问题之一。如果用 C 裸写其实就是先清屏、绘制点阵、再全量写缓冲三步逻辑完全一样。3.4 从像素到字符再到中文如果不用封装库自己实现绘制也没多复杂。核心函数是设置像素void oled_set_pixel(uint8_t x, uint8_t y, uint8_t on) { uint8_t page y / 8; uint8_t bit y % 8; if (on) buffer[page * 128 x] | (1 bit); else buffer[page * 128 x] ~(1 bit); }画线就是在两个点之间按步进逐个设置像素画字符则要准备字模数组。英文字母通常用 8x8 或 8x16 点阵每个字符由一组字节描述横向取模时一个字节的每一位对应同一行相邻 8 列。中文显示要用 16x16 甚至 24x24 点阵字模通过取模软件生成。取模方式如果选错比如取了纵向取模却按横向解析屏幕上就是完全不可读的乱码。这里建议统一约定数组下标按“先页、后列”存储取模软件里设置为纵向取模或横向取模后把生成的数据直接映射到缓冲区并且先拿一个已知字符做测试再批量合入字库。4. 刷新机制、坐标换算和通信时间的边界4.1 一帧数据在内存里如何排布把屏幕看成 128 列、64 行缓冲区就是 8 页 x 128 字节。显存地址计算公式为页号 行号 ÷ 8页内偏移 行号 % 8列号 列号缓冲区位置 页号 × 128 列号举例要在屏幕坐标 (x30, y20) 画一个点亮点20 ÷ 8 2所以它在第 2 页20 % 8 4所以它在第 2 页的第 4 位。操作方式就是buffer[2 * 128 30] | (1 4)。这个换算看似简单却是驱动代码里最容易出 bug 的地方。很多人直接把 x 当高字节、y 当低字节线性排列结果画出来的图案像被撕裂成 8 条横带根源就是忘了屏幕显存按页组织。理解了这一点画水平线很简单同一个页内把对应列的位设置即可。画垂直线反而要小心因为一条竖线从上到下会跨越多个页需要按段处理每段 8 行高度内只设置一位页与页之间切换。画矩形和填充矩形都可以用这个思路组合出来。代码里如果看到buffer[page * WIDTH x]说明就是按页优先组织的缓冲区适配 SSD1306 的内存排列刷屏时最直接。4.2 一次全屏刷新到底需要多久这个计算值得认真做一次。整帧数据 1024 字节先发一个控制字节 0x40然后是 1024 字节数据。I2C 传输每个字节需要 9 个时钟8 个数据位加 1 个 ACK 位所以刷一帧的通信位数大约是 (1 1024) × 9 9225 位。在 100kHz 标准模式下理论耗时约 92ms400kHz 快速模式下约 23ms。再算上发送开始条件、设备地址和设备应答实际耗时还会再多个几毫秒。也就是说I2C OLED 全屏刷新率大概是 10 到 40 帧看通信速率。这个刷新率看起来不算高但别忘了I2C OLED 最合适的场景是静态信息显示。CPU 占用率曲线、温湿度历史波形这类变化频率不高的数据每秒钟更新 2 到 5 次局部区域完全没问题。做动画就不太合适了但说实话用一块 128x64 单色屏做动画除了小游戏更多是图个新鲜还是把性能留给更有价值的事情比较好。4.3 局部更新是提升体验的关键全屏刷新最大的问题是为了改一个数字把 1024 字节全发一遍浪费总线带宽也容易造成轻微的视觉闪烁。局部更新做法是先设置页地址和列地址把写入位置移动到目标区域再只发送该区域的字节。页寻址模式下的典型流程是发送命令 0xB0 页号发送列地址低字节 0x00 (start_col 0x0F)发送列地址高字节 0x10 ((start_col 4) 0x0F)然后连续写入该行区域内若干个字节。假设要更新第 2 页第 30 到 60 列只发送 31 字节数据耗时不到 3ms效果立竿见影。实际项目中显示时钟数字时只需要更新秒数所在的几列其余部分不用动肉眼几乎感知不到刷新过程。局部更新虽然好管理成本也不低。如果屏幕上有多个交互区域绘制时需要记录哪些区域脏了设计一套脏矩形机制。这个小优化在资源紧缺的单片机上非常实用可以让响应更流畅。如果使用现成驱动库开启自动局部刷新或者设置更新窗口可以减少手动操作。5. 常见问题与排查技巧实录5.1 白屏、黑屏、花屏先从这六点查起白屏是最常见的故障。遇到白屏我习惯按顺序排查先看 I2C 扫描能不能找到设备地址如果扫描不到多半是接线或供电问题如果地址能扫到但还白屏重点怀疑初始化序列里少了开启电荷泵命令 0x8D 0x14或者对比度被设成了 0。某次帮朋友调试初始化代码明明看着没问题最后发现是 0x81 后面的对比度参数误写成了 0x00屏幕全黑我还以为是屏坏了。花屏通常和信号完整性有关。把 I2C 速率从 400kHz 降到 100kHz这个问题大概率能解决。其次就是接线过长、模块电源加了大电容导致复位时序不对。还有 SH1106 和 SSD1306 的列偏移问题SH1106 内部显存是 132 列但有效显示区是 128 列列地址从 2 开始所以很多库有专门选项。如果你不小心用了 SSD1306 的驱动去刷 SH1106画面会往左偏 2 列容易误判为屏幕坏了。我把常见问题整理成一张速查表症状可能原因处理建议完全白屏接线错误、供电不足、地址错误扫描地址、量电压、检查接线白屏但地址正常缺少电荷泵命令或对比度为 0补上 0x8D 0x14重设 0x81 参数黑色无内容初始化序列未完成或命令顺序错对照数据手册逐条核对初始化序列花屏乱码I2C 速率过高、电源噪声、接错 MISO降速到 100kHz缩短接线上下颠倒COM 扫描方向反了改命令 0xC0/0xC8左右颠倒段重映射反了改命令 0xA0/0xA1显示内容偏移OLED 控制芯片型号不符按实际芯片选驱动参数如 SH11065.2 用万用表和逻辑分析仪定位疑难杂症靠肉眼和重新插拔解决不了问题时建议上工具。万用表先量模块 VCC 和 GND 之间电压是否正常再用直流电压挡量 SDA 和 SCL应该能测到上拉后的高电平。如果 SDA 一直为低可能是总线上有设备把线拉死了断开所有设备逐一点亮排查。还能顺便量一下 OLED 模块工作电流正常情况下几毫安到二十毫安如果电流异常偏大或偏小硬件问题的可能性就高了。逻辑分析仪是排查 I2C 的神器几十块的采样率足够。把逻辑分析仪的通道夹在 SCL 和 SDA 上抓取一次 I2C 扫描过程可以清楚看到起始条件、地址字节、读写位以及 ACK 位。如果抓到的地址不是 0x3C而是 0x78 这种 8 位形式不要慌换算成 7 位再对。如果最后一个 ACK 位是高电平说明从机根本没应答问题大概率在地址或供电。如果波形的高电平幅度只有 1V 左右说明上拉电阻太小或者线上挂载设备太多总线电平被拉弱了。5.3 不同环境之间移植驱动的三个经典坑第一个坑是 reset 引脚的处理。某些开源库在初始化时需要指定 RESET GPIO如果你的模块没有引出 reset 引脚库可能直接返回失败或卡死。这时候要看文档有的库允许传 -1有的库需要你在模块侧把 reset 引脚拉高。第二是地址的表示方式不同库对地址参数的要求不同7 位地址和 8 位地址经常混用。我自己写底层层时统一用 7 位地址遇到需要 8 位地址的库就左移一位减少混乱。第三是初始化序列的差异SSD1306 和 SH1106 表面相似但 SH1106 的列地址映射需要偏移 2 列直接套用 SSD1306 代码会出现花屏。移植前先确认控制芯片型号再看库的默认配置别盲目复制初始化数组。6. 进阶玩法让 I2C OLED 不只是会跳字的数码管6.1 动态曲线和滚动信息既然全屏刷新能跑到 40 帧做简单的动态曲线完全可行。做法是维护一个环形缓冲新数据到来时把旧曲线整体左移一列把新数据画到最右列最后刷新整行或者局部列。这种波形显示在传感器监测里非常实用。相比用串口输出一堆数字屏幕上直接看到趋势体验提升不是一星半点。滚动功能可以用 SSD1306 的硬件滚动命令实现设置滚动区域、方向和步数后屏幕自己会滚不占用 CPU。不过硬件滚动有个限制它只能滚动显存里的内容且遇到水平滚动时屏幕边缘会有黑边。你要结合自己的界面设计取舍。如果只是想让多行文本交替显示也可以用软件方式定时移动视口刷新局部区域效果更可控。6.2 低功耗场景的省电技巧OLED 自发光特性决定了功耗和点亮像素数量强相关。白色全屏显示时电流可能到 20mA 甚至更高而只显示少量文字时可能只有几毫安。这也是为什么很多人把 OLED 屏幕做成深色背景、浅色文字因为大面积黑色像素其实是熄灭状态非常省电。设备休眠前发送 0xAE 命令关闭显示或者发送 0xA5 忽略 RAM 内容让全屏熄灭都能显著降低静态功耗。对电池设备可以设置一个无操作自动熄灭的逻辑用触摸或按键唤醒后再开屏。还有一个细节OLED 长期显示同一静止画面可能造成像素寿命衰减专业上叫烧屏。平时使用建议降低对比度到 0x80 以下长时间不使用时熄灭显示并且偶尔做一次全屏反色或滚动虽然不能完全避免但能减轻痕迹。OLED 响应速度快、视角宽低功耗场景下比 LCD 有优势前提是你别让不该亮的像素一直亮着。6.3 多屏并联和 I2C 加载问题一条 I2C 总线上最多可以挂两个同型号 OLED一片 SA0 拉低地址 0x3C一片 SA0 拉高地址 0x3D。如果你需要挂更多屏幕就要用 I2C 多路复用器比如常见的 8 通道 I2C 开关把不同的屏幕接到不同通道使用时先切换通道再通信。每增加一个设备总线电容就增加一点上拉电阻可能需要适当减小但总线上拉电阻太小也会让低电平无法拉到 0V这个平衡要靠测试来定。如果不想买多路复用器也可以使用 GPIO 模拟第二路 I2C同时驱动两片屏幕。很多 MCU 的任意 GPIO 都能模拟 I2C只要频率控制在 100kHz 左右协议时序正确完全能用。但这只能作为备用方案因为模拟时序受到中断影响较大高负载时容易偶发错误。实测中我用模拟 I2C 驱动两块屏连续跑一整天没出过问题但给项目加了一个软件重试机制后更安心。最后分享一点个人经验玩这类 I2C OLED 模块最值得花的钱不是买更贵的屏而是买一个逻辑分析仪。很多疑难杂症抓一次波形就定位了。焊接时注意屏的排针非常脆弱焊完最好用放大镜检查有没有虚焊使用杜邦线时尽量用短线固定好接头避免震动导致接触不良。我自己的习惯是屏背面贴一层绝缘胶带防止和下方的金属引脚短路再配上一个小支架或热熔胶固定能省去一堆莫名其妙的故障。照着这个思路l2c oled 驱动这条路会走得顺畅很多。