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);
相关推荐
FreakStudio7 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
EVERSPIN10 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh10 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
芯橦13 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海17 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu17 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白17 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_18 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人18 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时18 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件