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);
相关推荐
PegasusYu19 分钟前
STM32校准读取激光测距传感器VL53L0X距离数据
stm32·测距·stm32cubeide·激光测距·vl53l0x·飞行时间·stm32g031f8
代码游侠34 分钟前
学习笔记——嵌入式与51单片机学习
单片机·嵌入式硬件·学习·51单片机
zy1353806757338 分钟前
12V输入5V/2A输出升降压芯片AH4002
科技·单片机·物联网·fpga开发·硬件工程·智能电视
代码游侠43 分钟前
学习笔记——嵌入式系统与51单片机核心
笔记·单片机·嵌入式硬件·学习·51单片机
一枝小雨1 小时前
【OTA专题】15 实现App后台无感下载固件
stm32·单片机·嵌入式·ota·bootloader
小郭团队1 小时前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
lemoncat81 小时前
PCB线圈电感设计器推荐
嵌入式硬件·pcb
TEC_INO1 小时前
STM32_10:SPI
stm32·单片机·嵌入式硬件
polarislove02141 小时前
10.3[ADC]采样时间和转换时间-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
创思通信1 小时前
STM32L151RCT6 BC20 采集温湿度DHT11 采集GPS定位 和ADC发送到最新版本ONENET物联网开放平台
stm32·嵌入式硬件·物联网