代码
/**
* @brief ssd1306 OLED 初始化操作.
*/
uint32_t OledInit(void)
{
// 初始化命令
static const uint8_t initCmds[] = {
0xAE, // --display off
0x00, // ---set low column address
0x10, // ---set high column address
0x40, // --set start line address
0xB0, // --set page address
0x81, // contract control
0xFF, // --128
0xA1, // set segment remap
0xA6, // --normal / reverse
0xA8, // --set multiplex ratio(1 to 64)
0x3F, // --1/32 duty
0xC8, // Com scan direction
0xD3, // -set display offset
0x00, //
0xD5, // set osc division
0x80, //
0xD8, // set area color mode off
0x05, //
0xD9, // Set Pre-Charge Period
0xF1, //
0xDA, // set com pin configuartion
0x12, //
0xDB, // set Vcomh
0x30, //
0x8D, // set charge pump enable
0x14, //
0xAF, // --turn on oled panel
};
// 设置 13 引脚为 SDA 总线
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
// 设置 14 引脚为 SCL 时钟线
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);
// 设置 I2C 波特率,能够与外部 I2C 设备(如 OLED 屏幕、传感器等)正常通信。
I2cInit(WIFI_IOT_I2C_IDX_0, (400*1000)); // 400k
// I2cSetBaudrate(WIFI_IOT_I2C_IDX_0, OLED_I2C_BAUDRATE);
for (size_t i = 0; i < ARRAY_SIZE(initCmds); i++) {
uint32_t status = Write(0x00,initCmds[i]);
if (status != 0) {
return status;
}
}
return 0;
}
解释
每一条指令都有特定功能,用于配置屏幕的硬件参数和工作模式。
以下是逐行解析:
| 指令 | 含义说明 |
|---|---|
0xAE |
关闭显示(Display Off)<br>初始化时先关闭屏幕,避免配置过程中出现乱码。 |
0x00 |
设置列地址低4位(Set Lower Column Address)<br>配合下一条指令,共同指定显示的起始列(低4位)。 |
0x10 |
设置列地址高4位(Set Higher Column Address)<br>与上一条指令组合,确定完整的起始列地址(0-127)。 |
0x40 |
设置起始行地址(Set Start Line Address)<br>指定屏幕从哪一行开始显示(默认从第0行开始)。 |
0xB0 |
设置页地址(Set Page Address)<br>OLED将屏幕分为8页(每页8行像素),此指令指定从第0页开始显示。 |
0x81 |
开启对比度控制(Contrast Control)<br>允许后续指令调节屏幕亮度。 |
0xFF |
设置对比度值<br>0xFF表示最大对比度(亮度最高),值越小亮度越低。 |
0xA1 |
设置段重映射(Set Segment Re-map)<br>控制列的显示方向(0xA1表示列地址从右到左,0xA0则相反,用于调整屏幕左右镜像)。 |
0xA6 |
设置正常显示模式(Normal Display)<br>0xA6表示“1亮0灭”(正常显示),0xA7为反显(1灭0亮)。 |
0xA8 |
设置多路复用率(Set Multiplex Ratio)<br>配置屏幕的驱动路数,与屏幕高度相关。 |
0x3F |
设置复用率参数<br>配合上一条指令,0x3F对应64行屏幕(0.96英寸OLED常见参数)。 |
0xC8 |
设置COM扫描方向(Com Output Scan Direction)<br>0xC8表示行地址从上到下扫描(0xC0则相反,用于调整屏幕上下翻转)。 |
0xD3 |
设置显示偏移(Set Display Offset)<br>控制屏幕整体上下偏移量(用于微调显示位置)。 |
0x00 |
显示偏移参数<br>0x00表示无偏移(偏移量为0)。 |
0xD5 |
设置时钟分频(Set Display Clock Divide Ratio)<br>配置内部振荡器频率,影响屏幕刷新速度。 |
0x80 |
时钟分频参数<br>默认值,平衡刷新速度和功耗。 |
0xD8 |
关闭区域颜色模式(Set Area Color Mode Off)<br>禁用特殊颜色模式(适用于单色OLED)。 |
0x05 |
区域颜色模式参数<br>配合上一条指令使用的默认值。 |
0xD9 |
设置预充电周期(Set Pre-Charge Period)<br>配置像素点亮前的充电时间,影响显示稳定性。 |
0xF1 |
预充电周期参数<br>针对3.3V供电的优化值。 |
0xDA |
设置COM引脚配置(Set COM Pins Hardware Configuration)<br>根据屏幕硬件接线方式配置COM引脚(影响显示是否正常)。 |
0x12 |
COM引脚参数<br>适用于大多数64行OLED的默认配置。 |
0xDB |
设置VCOMH电压(Set VCOMH Deselect Level)<br>配置COM引脚的电压水平,影响显示对比度和寿命。 |
0x30 |
VCOMH电压参数<br>3.3V供电下的推荐值。 |
0x8D |
设置电荷泵使能(Set Charge Pump Enable)<br>控制内部电荷泵(为OLED提供工作电压)。 |
0x14 |
开启电荷泵<br>0x14表示启用电荷泵(必须开启,否则屏幕无法点亮)。 |
0xAF |
开启显示(Display On)<br>初始化完成后开启屏幕,显示配置后的内容。 |
这些指令的作用是将OLED从断电状态配置为可正常工作的状态,包括:
- 关闭屏幕→设置行列地址→配置显示方向和亮度→初始化硬件参数→开启屏幕。
- 所有参数配置完成后,OLED才能正确接收和显示通过
I2cWrite()发送的点阵数据。
不同品牌的OLED可能需要微调部分参数(如0xDA的引脚配置),但整体初始化逻辑一致。