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