[应用相关] stm32二级菜单

[复制链接]
 楼主| xiaoqizi 发表于 2025-7-12 11:31 | 显示全部楼层 |阅读模式
oled是嵌入式学习中必不可少的显示器,但是往往显示的内容有限,有时候又需要进行多层显示,比如24年的电赛小车题,一共四问,这时候就可以使用二级菜单,在第一级菜单中显示每一问,再分别掉进各自的二级菜单中对pid进行调节,话不读书直接上代码
int menu1(void)
{
    uint8_t KeyNum=0;
    int8_t oled1_display_mdoe=1;
    OLED_ShowString(0,0, "display1             ",OLED_8X16);
    OLED_ShowString(0,16,"display2            ",OLED_8X16);
    OLED_ShowString(0,32,"display3            ",OLED_8X16);
    OLED_ShowString(0,48,"display4            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==1)
        {
            oled1_display_mdoe++;
            if(oled1_display_mdoe==6){oled1_display_mdoe=1;}
        }
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return oled1_display_mdoe;
        }
        switch(oled1_display_mdoe)
        {
            case 1:
            {
                OLED_ShowString(0,0, "display1            ",OLED_8X16);
                OLED_ShowString(0,16,"display2            ",OLED_8X16);
                OLED_ShowString(0,32,"display3            ",OLED_8X16);
                OLED_ShowString(0,48,"display4            ",OLED_8X16);
                OLED_ReverseArea(0,0,128,16);
                OLED_Update();
                break;
            }
            case 2:
            {
                OLED_ShowString(0,0, "display1             ",OLED_8X16);
                OLED_ShowString(0,16,"display2             ",OLED_8X16);
                OLED_ShowString(0,32,"display3             ",OLED_8X16);
                OLED_ShowString(0,48,"display4             ",OLED_8X16);
                OLED_ReverseArea(0,16,128,16);
                OLED_Update();
                break;
            }
            case 3:
            {
                OLED_ShowString(0,0, "display1             ",OLED_8X16);
                OLED_ShowString(0,16,"display2             ",OLED_8X16);
                OLED_ShowString(0,32,"display3             ",OLED_8X16);
                OLED_ShowString(0,48,"display4             ",OLED_8X16);
                OLED_ReverseArea(0,32,128,16);
                OLED_Update();
                break;
            }
            case 4:
            {
                OLED_ShowString(0,0, "display1              ",OLED_8X16);
                OLED_ShowString(0,16,"display2             ",OLED_8X16);
                OLED_ShowString(0,32,"display3             ",OLED_8X16);
                OLED_ShowString(0,48,"display4             ",OLED_8X16);
                OLED_ReverseArea(0,48,128,16);
                OLED_Update();
                break;
            }
            case 5:
            {
                OLED_ShowString(0,0,"PID                    ",OLED_8X16);
                OLED_ShowString(0,16,"                  ",OLED_8X16);
                OLED_ShowString(0,32,"                  ",OLED_8X16);
                OLED_ShowString(0,48,"                  ",OLED_8X16);
                OLED_ReverseArea(0,0,128,16);
                OLED_Update();
                break;
            }
        }
    }
}



首先是一级菜单,每次按键KeyNum1按下对oled1_display_mdoe进行加一,以切换不同的oled显示,switch中根据oled1_display_mdoe值进行切换显示内容,如果KeyNum2按下按键将当前所在的是第几个页面进行返回
接着是二级菜单
oled_display_menu2 = menu1();


我们在主函数的while中不断调用menu1()进行一级菜单显示,如果检测到返回值就根据返回值跳进对应的页面

        if(oled_display_menu2 == 1){menu2_display1();}
                if(oled_display_menu2 == 2){menu2_display2();}
                if(oled_display_menu2 == 3){menu2_display3();}
                if(oled_display_menu2 == 4){menu2_display4();}
                if(oled_display_menu2 == 5){menu2_display5();}


int menu2_display1(void)
{
    uint8_t KeyNum=0;
    OLED_ShowString(0,0, "menu2_1_1             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_1_2            ",OLED_8X16);
    OLED_ShowString(0,0, "menu2_1_3             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_1_4            ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_1_5            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return 0;
        }
    }
}
int menu2_display2(void)
{
    uint8_t KeyNum=0;
    OLED_ShowString(0,0, "menu2_2_1             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_2_2            ",OLED_8X16);
    OLED_ShowString(0,0, "menu2_2_3             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_2_4            ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_2_5            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return 0;
        }
    }
}
int menu2_display3(void)
{
    uint8_t KeyNum=0;
    OLED_ShowString(0,0, "menu2_3_1             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_3_2            ",OLED_8X16);
    OLED_ShowString(0,0, "menu2_3_3             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_3_4            ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_3_5            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return 0;
        }
    }
}
int menu2_display4(void)
{
    uint8_t KeyNum=0;
    OLED_ShowString(0,0, "menu2_4_1             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_4_2            ",OLED_8X16);
    OLED_ShowString(0,0, "menu2_4_3             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_4_4            ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_4_5            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return 0;
        }
    }
}
int menu2_display5(void)
{
    uint8_t KeyNum=0;
    OLED_ShowString(0,0, "menu2_5_1             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_5_2            ",OLED_8X16);
    OLED_ShowString(0,0, "menu2_5_3             ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_5_4            ",OLED_8X16);
    OLED_ShowString(0,16,"menu2_5_5            ",OLED_8X16);
    OLED_Update();
    while(1)
    {
        KeyNum=Key_GetNum();
        if(KeyNum==2)
        {
            OLED_Clear();
            OLED_Update();
            return 0;
        }
    }
}



进入二级菜单后再次按下按键二就会返回一级菜单,如果需要三级菜单或者更多的菜单可以按照这个思路进行拓展
————————————————

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

原文链接:https://blog.csdn.net/2301_80143498/article/details/149135330

小小蚂蚁举千斤 发表于 2025-7-28 23:12 | 显示全部楼层
stm32二级菜单很不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

126

主题

4320

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部