動(dòng)OLED貪吃蛇:I2C與ADC外設(shè)綜合實(shí)戰(zhàn))
這次我們來看一個(gè)很經(jīng)典的 STM32 入門綜合實(shí)戰(zhàn)STM32F103C8T6 最小系統(tǒng)板搭配 0.96 寸 I2C OLED 顯示屏加上雙軸搖桿在單片機(jī)上實(shí)現(xiàn)貪吃蛇游戲。項(xiàng)目不依賴上位機(jī)不走串口繪圖顯示、輸入、邏輯全部由 STM32 自己完成非常適合把 HAL 庫的 I2C 外設(shè)、ADC 外設(shè)和狀態(tài)機(jī)設(shè)計(jì)串起來練一遍。先說結(jié)論STM32F103C8T6 驅(qū)動(dòng) OLED 做貪吃蛇完全沒有性能壓力。OLED 用 I2C 只需要 PB6/PB7 兩根線搖桿用 ADC 只需要 PA0/PA1 兩個(gè)模擬輸入128×64 的顯示分辨率切分成 16×8 個(gè)單元格游戲邏輯主要靠一個(gè)固定間隔的移動(dòng)定時(shí)器驅(qū)動(dòng)。整個(gè)工程推薦用 STM32CubeMX 生成骨架 HAL 庫寫外設(shè)驅(qū)動(dòng)IDE 選 Keil MDK 或 STM32CubeIDE 都行。本文會(huì)依次講清楚硬件接線、CubeMX 配置、OLED 驅(qū)動(dòng)代碼、搖桿 ADC 采樣、貪吃蛇核心邏輯、主循環(huán)刷新控制、測(cè)試方法和常見問題。代碼會(huì)給出完整版本你可以直接復(fù)制到自己的工程里跑通。1. 項(xiàng)目核心能力速覽能力項(xiàng)說明主控芯片STM32F103C8T6Cortex-M3 內(nèi)核72MHz64KB Flash20KB SRAM顯示方案0.96 寸 I2C OLEDSSD1306128×64I2C1 接口速率 400kHz輸入方案雙軸搖桿模塊ADC1 采樣PA0 接 X 軸PA1 接 Y 軸游戲機(jī)制經(jīng)典貪吃蛇墻碰檢測(cè)、自碰檢測(cè)、隨機(jī)食物生成、分?jǐn)?shù)統(tǒng)計(jì)工程形態(tài)STM32CubeMX 生成工程 HAL 庫驅(qū)動(dòng)Keil MDK / STM32CubeIDE 均可編譯啟動(dòng)方式上電自動(dòng)運(yùn)行無上位機(jī)依賴調(diào)試方式ST-Link SWD 下載調(diào)試串口可選輸出調(diào)試日志可擴(kuò)展性支持增加難度加速、最高分保存、LCD 屏適配、FreeRTOS 任務(wù)化重構(gòu)從功能清單可以看出這個(gè)項(xiàng)目的核心不是游戲本身而是把單片機(jī)常見外設(shè)串起來用I2C 屏要解決“怎么畫點(diǎn)、怎么刷新”ADC 要解決“搖桿讀數(shù)怎么映射成方向”主循環(huán)要解決“什么時(shí)候讓蛇動(dòng)一次”。這三個(gè)問題一旦跑通后面再去做溫濕度顯示、遙控小車、菜單系統(tǒng)思路是完全共通的。需要特別說明的是STM32F103C8T6 的 20KB SRAM 對(duì) 1024 字節(jié)的 OLED 幀緩沖區(qū)來說很寬裕即使加字庫、加游戲狀態(tài)數(shù)組也不會(huì)出現(xiàn)內(nèi)存緊張的情況。Flash 64KB 對(duì) HAL 庫驅(qū)動(dòng)來說也夠用正常工程編譯出來一般在 20KB 到 30KB 之間留有余量。2. 適用場(chǎng)景與使用邊界這個(gè)項(xiàng)目最合適的讀者是已經(jīng)學(xué)會(huì)點(diǎn)燈、懂 GPIO 輸出但是還沒接觸過通信外設(shè)和模擬采樣的同學(xué)。貪吃蛇游戲的狀態(tài)比較簡(jiǎn)單調(diào)試