基于stm32f4做一个可以包含三个功能的oled多级菜单
时间: 2024-03-18 17:39:07 浏览: 36
好的,以下是一个基于 STM32F4 的 OLED 多级菜单,包含三个功能的示例代码:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "oled.h"
#include "key.h"
// 菜单项操作函数
void menu1_func();
void menu2_func();
void menu3_func();
// 菜单项数据结构
typedef struct
{
char *name; // 菜单名称
int sub_menu_cnt; // 子菜单个数
struct menu_item *sub_menus; // 子菜单指针
void (*func)(); // 菜单项操作函数
} menu_item;
// 菜单数据结构
menu_item root_menu = {"Root", 3, NULL, NULL};
menu_item menu1 = {"Menu 1", 0, NULL, menu1_func};
menu_item menu2 = {"Menu 2", 0, NULL, menu2_func};
menu_item menu3 = {"Menu 3", 0, NULL, menu3_func};
// 初始化所有菜单
void init_menu()
{
root_menu.sub_menus = (menu_item *)malloc(sizeof(menu_item) * root_menu.sub_menu_cnt);
root_menu.sub_menus[0] = menu1;
root_menu.sub_menus[1] = menu2;
root_menu.sub_menus[2] = menu3;
}
// 当前菜单指针
menu_item *cur_menu = &root_menu;
// 按键中断处理函数
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
delay_ms(20); // 消抖
if (KEY0 == 0) // 按键按下
{
cur_menu = cur_menu->sub_menus[0]; // 进入子菜单
OLED_Clear();
OLED_ShowString(0, 0, cur_menu->name, 16);
for (int i = 0; i < cur_menu->sub_menu_cnt; i++)
{
char buf[20];
sprintf(buf, "%d. %s", i + 1, cur_menu->sub_menus[i].name);
OLED_ShowString(0, i * 2 + 2, buf, 16);
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
else if (EXTI_GetITStatus(EXTI_Line1) != RESET)
{
delay_ms(20); // 消抖
if (KEY1 == 0) // 按键按下
{
if (cur_menu == &root_menu) // 根菜单
{
// 执行功能1
}
else // 子菜单
{
cur_menu->sub_menus[1].func(); // 执行菜单项操作2
}
}
EXTI_ClearITPendingBit(EXTI_Line1);
}
else if (EXTI_GetITStatus(EXTI_Line2) != RESET)
{
delay_ms(20); // 消抖
if (KEY2 == 0) // 按键按下
{
if (cur_menu == &root_menu) // 根菜单
{
// 执行功能2
}
else // 子菜单
{
cur_menu->sub_menus[2].func(); // 执行菜单项操作3
}
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
int main(void)
{
OLED_Init();
KEY_Init();
init_menu();
OLED_ShowString(0, 0, cur_menu->name, 16);
for (int i = 0; i < cur_menu->sub_menu_cnt; i++)
{
char buf[20];
sprintf(buf, "%d. %s", i + 1, cur_menu->sub_menus[i].name);
OLED_ShowString(0, i * 2 + 2, buf, 16);
}
while (1)
{
// 主循环
}
}
void menu1_func()
{
// 执行菜单项操作1
}
void menu2_func()
{
// 执行菜单项操作2
}
void menu3_func()
{
// 执行菜单项操作3
}
```
以上代码中,使用了三个按键分别对应三个功能。在按键中断处理函数中,如果当前菜单为根菜单,则按键1执行功能1,按键2执行功能2。如果当前菜单为子菜单,则按键1执行子菜单的第一个菜单项操作,按键2执行第二个菜单项操作,以此类推。同时,在进入子菜单时显示菜单项列表,以便用户选择。