CHAPTER 10 / FIELD GUIDE
OLED:从像素到数字
自己看懂最小屏幕驱动。
显示内容先存在内存里
128×64 的黑白屏每个像素一位,一帧需要 128×64÷8 = 1024 字节。本教程的 frame 数组存储这一帧,oled_rect 改变内存,oled_show 才把内容送到屏幕。
公共驱动采用 SSD1306 的页组织:每字节对应同一列连续 8 个像素。位置 (x,y) 的数组下标为 (y/8)×128+x,对应位为 y%8。理解这个映射,就能解释为什么字符最终也只是像素。
先画矩形,再画数字
教程提供自己实现的七段数字,避免安装第三方字体库。它支持 0–9 和矩形,不提供汉字或通用字体。先完成读数显示,彩屏与 LVGL 放在结课扩展。
实验工程 · 06_display
屏幕每 200 ms 后更新计数和条形图。传输本身也需要时间,因此这不是精确的 5 Hz 定时器。
打开 main.c · 查看公共驱动 lab.c · 下载全部工程
#include "lab.h"
void app_main(void) {
oled_init();
unsigned n=0;
for(;; ) {
oled_clear();
oled_number(30,10,n%10000,4);
oled_rect(4,48,n%120,6);
oled_show();
n++;
vTaskDelay(pdMS_TO_TICKS(200));
}
}阅读驱动的三个入口
- oled_init:查地址、配置设备、发送初始化命令。只在启动时做一次。
- oled_rect / oled_number:修改 frame。绘图阶段不访问总线。
- oled_show:设置显示窗口,分块发送数据。0x00 前缀表示命令流,0x40 表示显示数据。
实验
先将计数固定为 1234,确认每个数字;再单独画四角的小方块,验证坐标和方向;最后让条形长度随计数变化。不要一开始就把字体、动画、输入和网络同时加进来。
停下来想一想
如果调用 oled_number 后忘记 oled_show,会发生什么?
查看推导与答案
内存缓冲区变化,但屏幕仍显示上一次发送的画面。绘制与提交是两个独立步骤。
本章验收
本章一手资料
卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。