
OLED 基礎與顯示方法一、OLEDOLED嵌入式開發(fā)中常用的顯示與調(diào)試工具。使用SSD1306 驅動的 0.96 寸 OLED分辨率128×64像素通過I2C 接口與 STM32 通信地址 0x3C僅需 SCL、SDA 兩根線使用江協(xié)科技封裝的 OLED 標準庫調(diào)用函數(shù)即可顯示無需操作底層寄存器。重點學會用 OLED顯示變量、參數(shù)、調(diào)試信息替代串口/仿真器方便移植和調(diào)試。二、OLED 硬件接口OLED 模塊通過 I2C 與 STM32 連接OLED 引腳連接到 STM32說明SCLPB8I2C 時鐘時鐘線SDAPB9I2C 數(shù)據(jù)數(shù)據(jù)線VCC3.3V電源GNDGND地江協(xié) OLED 庫默認使用PB8/PB9軟件 I2C無需配置時鐘接口靈活。三、穿插I2C 通信協(xié)議OLED 正是通過 I2C 總線與 STM32 通信穿插 I2C 協(xié)議理解 OLED 的底層傳輸。1. I2CI2C是一種串行、同步、半雙工的通信協(xié)議兩根線即可通信SCL串行時鐘線SDA串行數(shù)據(jù)線主從架構主設備如 STM32發(fā)起通信從設備如 OLED響應每個從設備有唯一的7 位地址主設備據(jù)此尋址OLED 為 0x3C支持一主多從多個設備可掛同一條 I2C 總線。I2C 特點接線少、速率適中標準 100kbps / 快速 400kbps、適合短距離板內(nèi)通信。2. I2C 的 4 種信號I2C 通信通過 SCL 與 SDA 的電平配合完成核心是 4 種信號信號觸發(fā)條件作用起始條件 STARTSCL 高電平時SDA 由高→低總線開始通信停止條件 STOPSCL 高電平時SDA 由低→高總線結束通信數(shù)據(jù)位SCL 高電平期間SDA 電平即數(shù)據(jù)值一位一位地傳數(shù)據(jù)應答 ACK接收方在 SCL 高電平時拉低 SDA表示已收到上一個字節(jié)3. I2C 字節(jié)傳輸流程主設備發(fā) 起始 ── 發(fā)從設備地址(7位)讀寫位(1位) ── 等 ACK ── 發(fā) 1 字節(jié)數(shù)據(jù) ── 等 ACK ── ...可多字節(jié) ── 發(fā) 停止傳輸單位是字節(jié)8 位 1 位 ACK地址字節(jié)7 位地址 1 位讀寫標志0寫1讀每收完一個字節(jié)接收方回 ACK主設備繼續(xù)或停止。4. 軟件 I2C vs 硬件 I2C方式原理優(yōu)點缺點軟件 I2C用 GPIO 手動翻轉 SCL/SDA模擬時序引腳任意、靈活、時序可控占用 CPU、速率受代碼限制硬件 I2C用芯片內(nèi)置 I2C 外設速率高、CPU 占用低引腳固定、時序需查手冊江協(xié) OLED 庫使用軟件 I2C把任意兩個 GPIO 引腳配成推挽輸出手動按 I2C 時序翻轉電平即可與 OLED 通信5. I2C 在 OLED 中的應用STM32主向 OLED從地址 0x3C寫數(shù)據(jù)每次寫起始 → 發(fā) 0x780x3C1 | 0寫→ ACK → 發(fā)控制字節(jié)命令/數(shù)據(jù)→ 發(fā)數(shù)據(jù) → 停止OLED 內(nèi)部 SSD1306 根據(jù)控制字節(jié)區(qū)分命令OLED_CMD和數(shù)據(jù)OLED_DATA。標準庫已封裝好我們只需調(diào)用OLED_ShowString、OLED_ShowNum等函數(shù)無需關心底層點陣。四、完整配置步驟確認硬件接線在代碼里配置 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 里執(zhí)行調(diào)用初始化函數(shù)int main(void) { OLED_Init(); // OLED_Init 內(nèi)部會調(diào)用 I2C_Soft_Init() 完成引腳配置 OLED_Clear(); // 清屏 OLED_ShowString(1, 1, Hello); // 顯示 // ...五、OLED 常用函數(shù)函數(shù)作用OLED_Init()初始化 OLEDOLED_Clear()清屏全部熄滅OLED_ShowChar(Line, Column, Char)顯示 1 個字符OLED_ShowString(Line, Column, String)顯示字符串OLED_ShowNum(Line, Column, Num, Length)顯示無符號整數(shù)定長OLED_ShowSignedNum(Line, Column, Num, Length)顯示有符號整數(shù)OLED_ShowHexNum(Line, Column, Num, Length)顯示十六進制數(shù)OLED_ShowBinNum(Line, Column, Num, Length)顯示二進制數(shù)OLED_ShowFloat(Line, Column, Num, Length)顯示浮點數(shù)參數(shù)說明Line行1~4 行每行 16 像素高Column列0~127Length顯示位數(shù)。顯示位置規(guī)則屏幕共4 行每行 16 像素可放 16 個 8×6 字符字符串或 8 個 16 像素寬的大字符顯示數(shù)字/字符串時注意 Length 與實際位數(shù)匹配不足會補零或截斷。六、顯示變量// 在 main 循環(huán)中實時刷新顯示一個遞增變量 Count while (1) { OLED_ShowNum(1, 1, Count, 5); // 第1行第1列顯示 Count占5位 Count; Delay(1000); }七、易錯點接線錯誤SCL/SDA 接反或接錯引腳OLED 無反應未初始化使用前必須調(diào)用OLED_Init()行/列參數(shù)超界Line 只能 1~4Column 只能 0~127Length 與實際位數(shù)不符OLED_ShowNum的 Length 要大于等于數(shù)字實際位數(shù)顯示負數(shù)用錯函數(shù)有符號數(shù)必須用OLED_ShowSignedNum用ShowNum會顯示成無符號數(shù)float 顯示OLED_ShowFloat會自動處理小數(shù)Length 為整數(shù)位數(shù)需注意溢出。