stm32多级菜单按键切换
时间: 2023-07-18 17:05:19 浏览: 257
STM32F103标准库的OLED多级菜单GUI实现
实现STM32多级菜单按键切换的基本步骤如下:
1. 定义菜单结构体:包括菜单名称、菜单项数量、菜单项数组等信息。
2. 定义菜单项结构体:包括菜单项名称、执行菜单项的函数指针等信息。
3. 编写菜单初始化函数:初始化菜单结构体和菜单项结构体。
4. 编写菜单项执行函数:根据菜单项的功能编写对应的执行函数。
5. 编写按键扫描函数:检测按键状态,根据按键状态判断是否需要切换菜单,并执行对应的菜单项。
6. 编写主程序:在主程序中调用菜单初始化函数和按键扫描函数,完成菜单的初始化和菜单项的切换。
下面是一个简单的示例代码:
```c
typedef struct
{
char *name; // 菜单名称
uint8_t item_num; // 菜单项数量
void (*item_func)(); // 菜单项执行函数指针
} Menu_Item_t;
typedef struct
{
char *name; // 菜单名称
uint8_t item_num; // 菜单项数量
Menu_Item_t *items; // 菜单项数组
} Menu_t;
Menu_t main_menu; // 主菜单
Menu_t sub_menu; // 子菜单
void menu_init()
{
// 初始化主菜单
main_menu.name = "Main Menu";
main_menu.item_num = 2;
main_menu.items = (Menu_Item_t *)malloc(sizeof(Menu_Item_t) * main_menu.item_num);
main_menu.items[0].name = "Sub Menu";
main_menu.items[0].item_num = 3;
main_menu.items[0].item_func = NULL;
main_menu.items[1].name = "Exit";
main_menu.items[1].item_num = 0;
main_menu.items[1].item_func = NULL;
// 初始化子菜单
sub_menu.name = "Sub Menu";
sub_menu.item_num = 2;
sub_menu.items = (Menu_Item_t *)malloc(sizeof(Menu_Item_t) * sub_menu.item_num);
sub_menu.items[0].name = "Item 1";
sub_menu.items[0].item_num = 0;
sub_menu.items[0].item_func = item1_func;
sub_menu.items[1].name = "Item 2";
sub_menu.items[1].item_num = 0;
sub_menu.items[1].item_func = item2_func;
}
void key_scan()
{
static uint8_t cur_menu = 0; // 当前菜单
static uint8_t cur_item = 0; // 当前菜单项
if (key1_pressed())
{
if (cur_menu == 0 && cur_item == 0)
{
cur_menu = 1;
cur_item = 0;
}
else if (cur_menu == 1 && cur_item == 0)
{
cur_menu = 1;
cur_item = 1;
}
else if (cur_menu == 1 && cur_item == 1)
{
cur_menu = 0;
cur_item = 0;
}
}
else if (key2_pressed())
{
if (cur_menu == 0 && cur_item == 0)
{
cur_menu = 0;
cur_item = 1;
}
else if (cur_menu == 1 && cur_item == 0)
{
item1_func();
}
else if (cur_menu == 1 && cur_item == 1)
{
item2_func();
}
}
// 显示当前菜单和菜单项
if (cur_menu == 0)
{
printf("Main Menu\n");
}
else if (cur_menu == 1)
{
printf("Sub Menu\n");
}
for (uint8_t i = 0; i < main_menu.items[cur_item].item_num; i++)
{
printf("%s\n", main_menu.items[cur_item].name);
}
}
int main()
{
menu_init();
while (1)
{
key_scan();
}
}
```
阅读全文