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);
相关推荐
SystickInt19 小时前
32 DMA实现ROM与RAM通信
stm32·单片机·嵌入式硬件
俊昭喜喜里20 小时前
STM32开发板电源设计( DCDC 电路和 LDO 电路 )
stm32·单片机·嵌入式硬件
m0_5557629020 小时前
方案再再对比
单片机
路弥行至21 小时前
FreeRTOS任务管理详解中: FreeRTOS任务创建与删除实战教程(动态方法)
c语言·开发语言·笔记·stm32·操作系统·freertos·入门教程
boneStudent21 小时前
Day20:串口基本配置与收发
stm32·单片机·嵌入式硬件
紫阡星影21 小时前
基于Arduino模拟烟雾监测系统
单片机·嵌入式硬件·arduino
HIZYUAN1 天前
嵌入式开发踩坑记: AG32硬件设计指南(一)
stm32·单片机·嵌入式硬件·fpga开发·硬件设计·最小系统·agm ag32
三佛科技-134163842121 天前
BP85958D输出12V400MA智能家居电源芯片(典型应用电路、替代型号HN32512)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
海涛高软1 天前
axi-gpio
单片机·嵌入式硬件
youcans_1 天前
【动手学STM32G4】(2)USB 虚拟串口通信
stm32·单片机·嵌入式硬件·串口通信·通信协议