- typedef struct {
- const char* title; // 菜单标题
- void (*display)(void); // 显示函数指针
- void (*enter)(void); // 进入菜单函数
- uint8_t parent; // 父菜单索引
- uint8_t children[4]; // 子菜单索引数组
- uint8_t child_count; // 子菜单数量
- } MenuItem;
- // 菜单数组定义
- MenuItem menuTree[] = {
- // ID, 标题, 显示函数, 进入函数, 父ID, 子菜单ID数组
- {0, "主菜单", showMain, NULL, 0, {1,2,3}, 3},
- {1, "设置", showConfig, enterConfig, 0, {4,5}, 2},
- {2, "信息", showInfo, NULL, 0, { }, 0},
- {3, "控制", showControl,enterCtrl, 0, {6}, 1},
- {4, "时间设置", showTime, NULL, 1, { }, 0},
- {5, "参数设置", showParam, NULL, 1, { }, 0},
- {6, "电机控制", showMotor, NULL, 3, { }, 0}
- };
2. 状态管理变量
- uint8_t currentMenu = 0; // 当前菜单ID
- uint8_t prevMenu = 0; // 上级菜单ID
- uint8_t menuPosition = 0; // 当前菜单中的选项位置
3. 按键处理状态机
- void handleKeyPress(KeyCode key) {
- switch(key) {
- case KEY_UP:
- menuPosition = (menuPosition > 0) ? menuPosition-1 :
- menuTree[currentMenu].child_count-1;
- break;
-
- case KEY_DOWN:
- menuPosition = (menuPosition+1) % menuTree[currentMenu].child_count;
- break;
-
- case KEY_ENTER:
- prevMenu = currentMenu;
- currentMenu = menuTree[currentMenu].children[menuPosition];
- if(menuTree[currentMenu].enter)
- menuTree[currentMenu].enter();
- menuPosition = 0; // 重置子菜单位置
- break;
-
- case KEY_BACK:
- if(currentMenu != prevMenu) {
- currentMenu = prevMenu;
- prevMenu = menuTree[currentMenu].parent;
- }
- break;
- }
- refreshDisplay(); // 刷新显示
- }
- void refreshDisplay() {
- // 1. 清屏
- LCD_Clear();
-
- // 2. 显示当前菜单标题
- LCD_Print(menuTree[currentMenu].title, 0, 0);
-
- // 3. 显示子菜单项(带>指示当前选项)
- for(uint8_t i=0; i<menuTree[currentMenu].child_count; i++) {
- uint8_t childID = menuTree[currentMenu].children[i];
- char prefix = (i == menuPosition) ? '>' : ' ';
- LCD_Printf("%c %s", prefix, menuTree[childID].title);
- }
-
- // 4. 调用自定义显示函数(如需要额外显示内容)
- if(menuTree[currentMenu].display) {
- menuTree[currentMenu].display();
- }
- }
- // UP键处理:
- menuPosition = (menuPosition > 0) ? menuPosition-1 : max-1;
- // DOWN键处理:
- menuPosition = (menuPosition+1) % max;