一个按键多级菜单的设计方法

# define MENU_LEN_MENU         55   / / 定义菜单总长度

typedef struct
{
 uchar  KeyStateIndex ;               / / 当前状态索引号
 uchar  KeyDnState ;                   / / 按下“向下”键时转向的状态索引号
 uchar  KeyUpState ;                   / / 按下“向上”键时转向的状态索引号
 uchar  KeyCrState ;                   / / 按下“回车”键时转向的状态索引号
 uchar  KeyBackState ;               / / 按下“退回”键时转向的状态索引号
 void   (*CurrentOperate)( ) ;      / / 当前状态应该执行的功能操作
}  KbdTabStruct ;

KbdTabStruct  KeyTab[ MENU_LEN_MENU ] =
{
 {0 ,0 ,0 ,1 ,0 , MainJob1 } ,
 {1 ,7 ,2 ,8 ,0 , Dsp Point} ,   / / 第一层
 {2 ,1 ,3 ,8 ,0 , DspCurve},   / / 第一层
 {3 ,2 ,4 ,36 ,0 ,Dsp Kout} ,   / / 第一层
 {4 ,3 ,5 ,50 ,0 , DisCloseDown } ,   / / 第一层


 {5 ,4 ,6 ,8 ,0 ,  ModifyPoint} ,   / / 第一层
 {6 ,5 ,7 ,52 ,0 , SetCloseDown } ,   / / 第一层
 {7 ,6 ,1 ,0 ,0 , Cancel} ,   / / 第一层
 …
 …
 {52 ,53 ,53 ,0 ,1 ,  OkSetCloseDown1} ,
 {53 ,52 ,52 ,0 ,1 , OkSetCloseDown2} ,
 {54 ,0 ,0 ,0 ,0 , Disable} ,
  …
  …
} ;
 void Get Keylnput (void)
{
 switch ( status &0xf0)  //按键值
  {
  case 0xe0 :/ / 回车键,找出新的菜单状态编号
   …
        KeyFuncIndex = KeyTab[ KeyFuncIndex ] . KeyCrState ;
   …
   break ;
  case 0xb0 :/ / 向下键,找出新的菜单状态编号
   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyDnState ;
   …
  break ;
   case 0xd0 :/ / 向上键,找出新的菜单状态编号


   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyUpState ;
   …
   break ;
  case 0x70 :/ / 回退键,找出新的菜单状态编号
   …
    KeyFuncIndex = KeyTab [ KeyFuncIndex ] . KeyBackState ;
   …
   break ;
  case 0 ;
    return ;   / / 错误的处理
    break ;
   }
  KeyFuncPt r = KeyTab[ KeyFuncIndex ] . CurrentOperate ;
  ( * KeyFuncPt r) () ;   / / 执行当前按键的操作
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现STM32多级菜单按键切换的方法如下: 1. 定义菜单结构体 首先,我们需要定义一个菜单结构体,它包含了菜单项的名称、子菜单指针、以及该菜单项对应的回调函数(即按下该菜单项时要执行的操作)等信息。示例代码如下: ```c typedef struct _menu_item { char *name; // 菜单项名称 struct _menu_item *submenu; // 子菜单指针 void (*callback)(void); // 菜单项对应的回调函数 } menu_item_t; ``` 2. 实现菜单切换函数 接下来,我们需要实现一个函数,用于切换不同的菜单。该函数需要接收按键的输入,并根据输入的按键来执行相应的操作,如切换到上一个或下一个菜单项、进入当前菜单项的子菜单、执行当前菜单项对应的操作等。示例代码如下: ```c void menu_switch(menu_item_t *menu, int key) { static int index = 0; static menu_item_t *curr_menu = NULL; if (curr_menu == NULL) { curr_menu = menu; } if (key == KEY_UP) { // 上一项 index--; if (index < 0) { index = 0; } } else if (key == KEY_DOWN) { // 下一项 index++; if (index >= get_menu_item_count(curr_menu)) { index = get_menu_item_count(curr_menu) - 1; } } else if (key == KEY_ENTER) { // 进入子菜单或执行操作 menu_item_t *item = get_menu_item(curr_menu, index); if (item->submenu != NULL) { // 进入子菜单 curr_menu = item->submenu; index = 0; } else if (item->callback != NULL) { // 执行操作 item->callback(); } } } ``` 在该函数中,我们使用了一个静态变量 `index` 来记录当前选中的菜单项的索引,以及一个静态变量 `curr_menu` 来记录当前所处的菜单。接着,根据输入的按键来更新 `index`,并判断是否需要进入子菜单或执行操作。在进入子菜单时,我们将 `curr_menu` 指向该子菜单,并将 `index` 重置为 0。 3. 实现菜单项计数和获取函数 在菜单切换函数中,我们需要根据当前菜单项的个数来判断是否越界。因此,我们需要实现两个辅助函数,用于获取当前菜单项的个数以及获取指定索引的菜单项。示例代码如下: ```c int get_menu_item_count(menu_item_t *menu) { int count = 0; menu_item_t *item = menu; while (item->name != NULL) { count++; item++; } return count; } menu_item_t *get_menu_item(menu_item_t *menu, int index) { int i = 0; menu_item_t *item = menu; while (i < index && item->name != NULL) { i++; item++; } return item; } ``` 在 `get_menu_item_count` 函数中,我们遍历菜单项,直到遇到 `name` 为 NULL 的菜单项,即表示该菜单项已经遍历完毕,此时返回计数器的值即可。而在 `get_menu_item` 函数中,我们使用一个计数器 `i` 来记录当前遍历到的菜单项的索引,当 `i` 等于指定的 `index` 时,即表示已找到该菜单项,此时返回该菜单项的指针即可。 4. 按键输入检测 最后,我们需要在主循环中不断检测按键输入,并调用菜单切换函数来切换菜单。示例代码如下: ```c int main(void) { int key; while (1) { key = get_input_key(); // 获取按键输入 if (key != KEY_NONE) { menu_switch(main_menu, key); // 切换菜单 } } } ``` 在该示例代码中,我们使用了一个 `get_input_key` 函数来获取按键输入,具体实现细节可以根据实际情况进行更改。当检测到按键输入时,我们调用 `menu_switch` 函数来切换菜单。同时,需要注意,在菜单切换函数中,我们使用了静态变量来保存当前选中的菜单项的索引和当前所处的菜单,因此,在调用该函数时必须传入当前菜单的指针,否则会导致菜单切换不正常。 综上所述,以上就是实现STM32多级菜单按键切换的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newzhpfree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值