打印
[应用相关]

STM32实现多级菜单界面显示

[复制链接]
728|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-6-17 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/jacklood/article/details/139699423

使用特权

评论回复
沙发
呐咯密密| | 2024-6-17 14:47 | 只看该作者
多级菜单很常用

使用特权

评论回复
板凳
EmmaTT| | 2024-6-18 21:11 | 只看该作者
这个多级菜单有没有源码看看啊

使用特权

评论回复
地板
等你下课| | 2024-8-31 15:54 | 只看该作者
你定义了一个多级菜单的结构体数组 MenuStruct,并在 main 函数中初始化了该数组

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

13

粉丝