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);
相关推荐
Jason_zhao_MR6 小时前
RK3576 MIPI Camera ISP调试:客观标定与环境准备(上)
人工智能·嵌入式硬件·机器人·嵌入式·接口隔离原则
深圳市晶科鑫实业有限公司6 小时前
RTC模块vs. 32.768KHz晶振:深度对比与选型指南
stm32·单片机·嵌入式硬件·实时音视频·rtc
weixin_452077646 小时前
VS code 使用STM32CubelDE for Visual Studio Code环境,如何配置CMakeLists.txt新增其他.C文件路径
c语言·vscode·stm32
jghhh016 小时前
STM32F103 驱动 BMP180 气压传感器源码
stm32·单片机·嵌入式硬件
踏着七彩祥云的小丑6 小时前
嵌入式测试学习第 5 天:电阻分类、色环电阻读数、贴片电阻
单片机·嵌入式硬件
济6176 小时前
MonitorTask 系统监控任务(下篇)---完善堆内存 、任务栈监控
单片机·嵌入式·freertos
代码又报错la6 小时前
5、电源保护板
单片机·嵌入式硬件
leo__52015 小时前
STM32 MAX30102 心率血氧测量代码
stm32·单片机·嵌入式硬件
金色光环18 小时前
【DSP学习】DSP28335 点亮LED
嵌入式硬件·学习·dsp开发
yuan1999718 小时前
STM32 IAP 电量计源码
stm32·单片机·嵌入式硬件