OLED 基础与显示方法一、OLEDOLED嵌入式开发中常用的显示与调试工具。使用SSD1306 驱动的 0.96 寸 OLED分辨率128×64像素通过I2C 接口与 STM32 通信地址 0x3C仅需 SCL、SDA 两根线使用江协科技封装的 OLED 标准库调用函数即可显示无需操作底层寄存器。重点学会用 OLED显示变量、参数、调试信息替代串口/仿真器方便移植和调试。二、OLED 硬件接口OLED 模块通过 I2C 与 STM32 连接OLED 引脚连接到 STM32说明SCLPB8I2C 时钟时钟线SDAPB9I2C 数据数据线VCC3.3V电源GNDGND地江协 OLED 库默认使用PB8/PB9软件 I2C无需配置时钟接口灵活。三、穿插I2C 通信协议OLED 正是通过 I2C 总线与 STM32 通信穿插 I2C 协议理解 OLED 的底层传输。1. I2CI2C是一种串行、同步、半双工的通信协议两根线即可通信SCL串行时钟线SDA串行数据线主从架构主设备如 STM32发起通信从设备如 OLED响应每个从设备有唯一的7 位地址主设备据此寻址OLED 为 0x3C支持一主多从多个设备可挂同一条 I2C 总线。I2C 特点接线少、速率适中标准 100kbps / 快速 400kbps、适合短距离板内通信。2. I2C 的 4 种信号I2C 通信通过 SCL 与 SDA 的电平配合完成核心是 4 种信号信号触发条件作用起始条件 STARTSCL 高电平时SDA 由高→低总线开始通信停止条件 STOPSCL 高电平时SDA 由低→高总线结束通信数据位SCL 高电平期间SDA 电平即数据值一位一位地传数据应答 ACK接收方在 SCL 高电平时拉低 SDA表示已收到上一个字节3. I2C 字节传输流程主设备发 起始 ── 发从设备地址(7位)读写位(1位) ── 等 ACK ── 发 1 字节数据 ── 等 ACK ── ...可多字节 ── 发 停止传输单位是字节8 位 1 位 ACK地址字节7 位地址 1 位读写标志0写1读每收完一个字节接收方回 ACK主设备继续或停止。4. 软件 I2C vs 硬件 I2C方式原理优点缺点软件 I2C用 GPIO 手动翻转 SCL/SDA模拟时序引脚任意、灵活、时序可控占用 CPU、速率受代码限制硬件 I2C用芯片内置 I2C 外设速率高、CPU 占用低引脚固定、时序需查手册江协 OLED 库使用软件 I2C把任意两个 GPIO 引脚配成推挽输出手动按 I2C 时序翻转电平即可与 OLED 通信5. I2C 在 OLED 中的应用STM32主向 OLED从地址 0x3C写数据每次写起始 → 发 0x780x3C1 | 0写→ ACK → 发控制字节命令/数据→ 发数据 → 停止OLED 内部 SSD1306 根据控制字节区分命令OLED_CMD和数据OLED_DATA。标准库已封装好我们只需调用OLED_ShowString、OLED_ShowNum等函数无需关心底层点阵。四、完整配置步骤确认硬件接线在代码里配置 PB8/PB9 为推挽输出void I2C_Soft_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // ① 使能 GPIOB 时钟GPIO 挂在 APB2 总线 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // ② 把 PB8、PB9 配置成推挽输出软件 I2C 手动控制电平 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // 写入寄存器 // ③ 空闲时 SCL、SDA 都拉高I2C 总线空闲标准 GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9); }在 main 里执行调用初始化函数int main(void) { OLED_Init(); // OLED_Init 内部会调用 I2C_Soft_Init() 完成引脚配置 OLED_Clear(); // 清屏 OLED_ShowString(1, 1, Hello); // 显示 // ...五、OLED 常用函数函数作用OLED_Init()初始化 OLEDOLED_Clear()清屏全部熄灭OLED_ShowChar(Line, Column, Char)显示 1 个字符OLED_ShowString(Line, Column, String)显示字符串OLED_ShowNum(Line, Column, Num, Length)显示无符号整数定长OLED_ShowSignedNum(Line, Column, Num, Length)显示有符号整数OLED_ShowHexNum(Line, Column, Num, Length)显示十六进制数OLED_ShowBinNum(Line, Column, Num, Length)显示二进制数OLED_ShowFloat(Line, Column, Num, Length)显示浮点数参数说明Line行1~4 行每行 16 像素高Column列0~127Length显示位数。显示位置规则屏幕共4 行每行 16 像素可放 16 个 8×6 字符字符串或 8 个 16 像素宽的大字符显示数字/字符串时注意 Length 与实际位数匹配不足会补零或截断。六、显示变量// 在 main 循环中实时刷新显示一个递增变量 Count while (1) { OLED_ShowNum(1, 1, Count, 5); // 第1行第1列显示 Count占5位 Count; Delay(1000); }七、易错点接线错误SCL/SDA 接反或接错引脚OLED 无反应未初始化使用前必须调用OLED_Init()行/列参数超界Line 只能 1~4Column 只能 0~127Length 与实际位数不符OLED_ShowNum的 Length 要大于等于数字实际位数显示负数用错函数有符号数必须用OLED_ShowSignedNum用ShowNum会显示成无符号数float 显示OLED_ShowFloat会自动处理小数Length 为整数位数需注意溢出。