本帖最后由 lsrly 于 2023-10-15 11:16 编辑
1,先定义一个结构体,定义菜单相关项
typedef struct
{
uint8_t Cur_Index; // 当前索引项
uint8_t previous; // 上一页
uint8_t next; // 下一页
uint8_t enter; // 确认
uint8_t back; // 返回
void (*current_operation)(uint8_t, uint8_t); // 当前索引执行的函数(界面)
} Main_Menu;
2.定义相关变量
static uint8_t func_index = 0; // 当前页面索引值
static uint8_t last_index = 0; // 上一个界面索引值
static void (*current_operation_func)(uint8_t, uint8_t);
3.写入表中
// 菜单索引表,{当前界面的索引值,对应previous的索引值,对应next的索引值,对应enter的索引值,对应back的索引值,要执行的函数}
Main_Menu table[] = {
// 设置菜单
{0, 0, 0, 0, 0, (*test)}, // 设置菜单
};
4.写一个刷新函数,一直检测按键
void GUI_Refresh(void)
{
keyvalue = tm1650_getkey();
if (keyvalue == 255 || keyvalue == 0)
{
keyflag = 0;
}
if (keyvalue > 0 && keyvalue < 255 && keyflag == 0)
{
last_index = func_index; // 更新上一界面索引值
if (keyvalue == 41 && keyflag == 0)
{ // 向上键
func_index = table[func_index].previous;
keyflag = 1; // 锁住按键,让按一次只能运行一次
//}; // 更新索引值
}
func_index = func_index;
}
current_operation_func = table[func_index].current_operation;
(*current_operation_func)(func_index, keyvalue);
vTaskDelay(100 / portTICK_RATE_MS);
}
5.定义要显示的函数
void test(uint8_t, uint8_t)
{
OLED_ShowNum(0, 0, 2023, 4, 16);
OLED_ShowChar(32, 0, ':', 16);
OLED_ShowNum(40, 0, 10, 2, 16);
OLED_ShowChar(56, 0, ':', 16);
OLED_ShowNum(64, 0, 15, 2, 16);
OLED_ShowChar(80, 0, ' ', 16);
OLED_ShowNum(85, 0, 10, 2, 16);
OLED_ShowChar(101, 0, ':', 16);
OLED_ShowNum(109, 0, miao, 2, 16);
}
|