1、main函数中,while循环之前
MenuStruct menu[30]= //定义多级菜单结构体数组
{
{0,0,0,1,show0}, //第一个元素表示索引号,第二个元素表示该按键按下后要返回的界面,第三个元素表示该按键按下后要切换的菜单条目界面,第四个元素表示该按键按下后要进入的界面
{1,0,2,4,show1},
{2,0,3,5,show2},
{3,0,1,6,show3},
{4,1,4,4,show4},
{5,2,5,5,show5},
{6,3,6,6,show6},
};
uint8_t INDEX=0; //索引变量
int (*show)()=NULL; //显示刷新函数指针
show=menu[INDEX].point; //INDEX为0时,把函数指针show0函数赋值给show,即初始界面位show0对应的界面
2、while循环中
key=KEY_Scan(0); //获取按键值
switch(key) //根据按键值改变索引
{
case 0:
break;
case KEY0_PRES://按键按下,返回到上一级目录界面
INDEX=menu[INDEX].key1;
if(menu[INDEX].point()==1) //如过索引值对应的函数返回值为1,是需要更改显示的函数,则将其函数指针的值给show
{
show=menu[INDEX].point;
}
break;
case KEY1_PRES://按键按下,切换本级目录的菜单条目界面
INDEX=menu[INDEX].key2;
if(menu[INDEX].point()==1) //如过索引值对应的函数返回值为1,是需要更改显示的函数,则将其函数指针的值给show
{
show=menu[INDEX].point;
}
break;
case KEY2_PRES://按键按下,进入到下一级目录界面
INDEX=menu[INDEX].key3;
if(menu[INDEX].point()==1) //如过索引值对应的函数返回值为1,是需要更改显示的函数,则将其函数指针的值给show
{
show=menu[INDEX].point;
}
break;
default :
break;
}
show(); //执行显示刷新函数
3、MultiMenu.c中
//一级界面
int show0()
{
SetTxData1_toLCD(0x00,0x00);//发送5A A5 07 82 0084 5A01 0001(切换到0号页面即0级初始界面)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
SetTxData_toLCD(0x13,0x00,LL_high,LL_low);
UserUart1Send( tempbuff,sizeof(tempbuff));
HAL_Delay(500);
return 1;
}
//一级界面
int show1()
{
SetTxData1_toLCD(0x00,0x01);//发送5A A5 07 82 0084 5A01 0001(切换到1号页面即一级目录1)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
int show2()
{
SetTxData1_toLCD(0x00,0x02);//发送5A A5 07 82 0084 5A01 0002(切换到2号页面即一级目录2)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
int show3()
{
SetTxData1_toLCD(0x00,0x03);//发送5A A5 07 82 0084 5A01 0003(切换到3号页面即一级目录3)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
int show4()
{
SetTxData1_toLCD(0x00,0x04);//发送5A A5 07 82 0084 5A01 0004(切换到4号页面即二级目录历史数据页面)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
//一级界面菜单1的二级界面
int show5()
{
SetTxData1_toLCD(0x00,0x05);//发送5A A5 07 82 0084 5A01 0005(切换到5号页面即二级目录时间日期设置页面)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
int show6()
{
SetTxData1_toLCD(0x00,0x06);//发送5A A5 07 82 0084 5A01 0006(切换到6号页面即二级目录位置人员设置页面)
UserUart1Send( tempbuff1,sizeof(tempbuff1));
return 1;
}
int show7()
{
return 1;
}
//一级界面菜单2的二级界面
int show8()
{
return 1;
}
//一级界面菜单3的二级界面
int show9()
{
return 1;
}
//一级界面菜单4的二级界面
int show10()
{
return 1;
}
4、MultiMenu.h中
struct menu_struct
{
int index; //索引值
int key1; //按下时要切换的索引值
int key2; //按下时要切换的索引值
int key3; //按下时要切换的索引值
int (* point)(); //函数指针,输入值为空,返回类型为int
};
typedef struct menu_struct MenuStruct;
int show0(void);
int show1(void);
int show2(void);
int show3(void);
int show4(void);
int show5(void);
int show6(void);
int show7(void);
int show8(void);
int show9(void);
int show10(void);
int show11(void);
int action1(void);
int action2(void);
int action3(void);