这是一篇示例文章,用来验证博客的排版、代码高亮和目录效果。 内容需要你自己填充 —— 尤其是"为什么这么写"的部分,那才是给别人讲的重点。

背景

考核要求 OLED 菜单必须是整个固件的顶层框架,所有功能都从菜单进入。 而且录制开始后不能改代码、不能重烧,所以菜单的扩展性必须一开始就设计好。

五张表的映射关系

核心思路是:不去写"进入哪个菜单"的判断逻辑,而是把菜单结构本身变成数据。

数组含义索引关系
title[]每个屏幕的标题直接按屏号索引
name[]每个屏幕里各项的文字name[cursor]
count[]该屏幕有几项决定 cursor 的回绕边界
parent[]该项的父屏用于逐级返回
cursor[]当前光标位置每屏独立记忆

关键代码

1
2
3
4
5
6
/* 按键 2:光标下移,到边界回绕 */
cursor[screen] = (cursor[screen] + 1) % count[screen];

/* 按键 4:返回上一屏,并清空离开那一屏的光标 */
cursor[screen] = 0;
screen = parent[screen];

这里回绕用取模而不是 if,好处是边界逻辑只有一处,屏幕项数变了也不用改代码。

踩过的坑

  • 一开始把 cursor 写成全局单变量,导致返回父菜单时光标位置丢失;
  • 改成"每屏一个 cursor“之后,离开时清空的那一步忘了写,造成二次进入位置错乱。

下一步

  • draw() 从 printf 换成 OLED 驱动
  • 抽出 menu.h 接口,让主固件能调用
  • 按赛题验收流程重写自动测试