打印
[其他ST产品]

基于按键操作的多级菜单系统,使用数组查表的方式实现不同层级的菜单切换和显示

[复制链接]
727|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 人的发个哈哈 于 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;
        }
    }
}


  • 这段代码处理按键操作,根据按键的不同切换到不同的菜单项,并执行对应的显示函数。

一些建议和注意事项:
  • 确保在中断上下文中执行的代码是安全的,特别是在显示函数中使用的图形库和可能引起并发问题的操作。
  • 确保按键检测和页面切换逻辑是正确的,避免潜在的死循环或无法退出的情况。
  • 在显示函数中尽量保持简洁,以提高响应性和降低在中断上下文中执行的时间。
  • 考虑使用状态机来处理菜单状态,使代码更加清晰和可维护。





使用特权

评论回复
沙发
tpgf| | 2024-5-7 16:36 | 只看该作者
如果使用查表的方式的话 会不会占用单片机大量的内存呢

使用特权

评论回复
板凳
观海| | 2024-5-7 17:12 | 只看该作者
如果按键过于频繁了  系统将如何响应呢

使用特权

评论回复
地板
八层楼| | 2024-5-7 18:04 | 只看该作者
对于这种基于按键操作的菜单 要做好防抖

使用特权

评论回复
5
晓伍| | 2024-5-7 18:36 | 只看该作者
这个表格的深度可以是动态更改的吗

使用特权

评论回复
6
磨砂| | 2024-5-7 19:08 | 只看该作者
如果按键数量比较少 需要实现的功能比较多 那么层级就会分的很深是吗

使用特权

评论回复
7
木木guainv| | 2024-5-7 19:40 | 只看该作者
这种分层查表的方式可能比不分层的查表方式要快吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

136

帖子

0

粉丝