STM32实现多级菜单界面显示

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);
相关推荐
网易独家音乐人Mike Zhou1 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵1 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu4 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi8 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生6568 小时前
输出比较简介
stm32
哔哥哔特商务网8 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式8 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
电子科技圈9 小时前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
东芝、铠侠总代1361006839310 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi10 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件