CHAPTER 10 / FIELD GUIDE

OLED:从像素到数字

自己看懂最小屏幕驱动。

建议用时 60 分钟先预测,再实验,再解释

显示内容先存在内存里

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));
    }
}

阅读驱动的三个入口

  1. oled_init:查地址、配置设备、发送初始化命令。只在启动时做一次。
  2. oled_rect / oled_number:修改 frame。绘图阶段不访问总线。
  3. oled_show:设置显示窗口,分块发送数据。0x00 前缀表示命令流,0x40 表示显示数据。

实验

先将计数固定为 1234,确认每个数字;再单独画四角的小方块,验证坐标和方向;最后让条形长度随计数变化。不要一开始就把字体、动画、输入和网络同时加进来。

停下来想一想

如果调用 oled_number 后忘记 oled_show,会发生什么?

查看推导与答案

内存缓冲区变化,但屏幕仍显示上一次发送的画面。绘制与提交是两个独立步骤。

本章验收

本章一手资料

卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。