本帖最后由 人的发个哈哈 于 2024-2-24 15:07 编辑
使用数组查表的方式来实现不同层级的菜单切换和显示。下面是对代码的一些解释和建议: typedef struct {
uchar current;
uchar up; // 向上翻索引号
uchar down; // 向下翻索引号
uchar enter; // 确认索引号
void (*current_operation)();
} key_table;
该结构体定义了菜单项的属性,包括当前索引号,向上、向下、确认按钮对应的索引号以及当前页面执行的显示函数(函数指针)。
菜单数组定义:
key_table table[30] = { // 菜单项的定义};
菜单数组定义了不同层级的菜单关系,每个菜单项包含了在不同按钮操作下应该切换到的索引号和执行的显示函数。
显示函数定义:
void fun_a1() { // 显示函数的内容
}// 其他显示函数的定义
显示函数用于在OLED屏幕上显示不同菜单层级的内容。
按键切换页面:
void *current_operation_index() {
// 检测按键并根据按键切换页面
if (KEY1 || KEY2 || KEY3) {
delay_ms(10);
if (KEY1) {
func_index = table[func_index.down];
} else if (KEY2) {
func_index = table[func_index.up];
} else if (KEY3) {
func_index = table[func_index.enter];
}
if (func_index != last_index) {
current_operation_index = func_index.current_operation;
u8g2_ClearBuffer(&u8g2);
current_operation_index();
u8g2_SendBuffer(&u8g2);
last_index = func_index;
}
}
}
一些建议和注意事项: - 确保在中断上下文中执行的代码是安全的,特别是在显示函数中使用的图形库和可能引起并发问题的操作。
- 确保按键检测和页面切换逻辑是正确的,避免潜在的死循环或无法退出的情况。
- 在显示函数中尽量保持简洁,以提高响应性和降低在中断上下文中执行的时间。
- 考虑使用状态机来处理菜单状态,使代码更加清晰和可维护。
|