STM32 oled多级菜单显示

前言

      只要有显示屏的地方,就要用到多级菜单的显示。在很多初学者眼里,多级菜单的显示是很难的,今天我做完了这个小项目,我就来分享一下我做的经历。OELD采用中景园0.78寸分辨率128*80。

首先肯定的是,只要理清思路,就不怕多级菜单显示很难。先上几张照片看看我的显示。

                               一级菜单

 

                             二级菜单

  

 

                             三级菜单

 

                                四级菜单

  1. 硬件设备:STM32F103C8T6+0.78寸OLED IIC连接方式 两个独立按键
  2. 原理图与PCB图纸:https://gitee.com/zhu_yu_yang/stm32_-oled_-board_-v2.1

程序实现

我学的多级菜单显示是多个界面的跳转,这个比较适合初学者。我的硬件上有两个按键,一个主要用来切换选项,另一个用来确定选项。所以我们暂时叫他next键enter键。先定义一个结构体,结构体里面有四个变量,分别代表当前索引号,next键,enter键当前执行函数。我这里只有两个按键,所以这样定义了。假如你有三个按键,你就把另一个按键当做向上动作。假如你有四个按键,另外两个按键分别代表 向上返回。这样你就有向上,向下,返回和确定四个功能键。那你的结构体定义的时候就要增加成员变量了。这里以两个按键为例,分别代表向下动作和确定动作。结构体如下:

typedef struct
{
    uint8_t current;//当前状态索引号
    uint8_t next; //向下一个
    uint8_t enter; //确定
    void (*current_operation)(void); //当前状态应该执行的操作
} Menu_table;

这里是核心思想,就是按键按下决定当前的索引号,继续定义一个数组:

Menu_table  table[13]=
{
    {0,0,1,(*fun0)},//一级界面  时钟界面
    {1,2,6,(*fun1)},//二级界面第一行 CAN Mode
    {2,3,7,(*fun2)},//二级界面第二行 485 Mode
    {3,4,8,(*fun3)},//二级界面第三行 UART Mode
    {4,2,0,(*fun4)},//二级界面第四行 BACK


    {5,6,4,(*fun5)},//三级界面第一行 back

    {6,7,x,(*fun6)},//三级界面第二行 //x,y,z代表四级界面的索引号,在这篇文章里没有详细列出。

    {7,8,y,(*fun7)},//三级界面第三行 

    {8,5,z,(*fun8)},//三级界面第四行 
};

uint8_t  func_index = 0;//主程序此时所在界面的索引值
 

这里解释一下这个数组中 {0,0,1,(*fun0)},//一级界面  时钟界面 ,由于我们在前面先定义了Menu_table结构体,结构体成员变量分别为当前索引号,next,enter和void (*current_operation)(void),第一的0代表当前的索引号,第二个0代表next这个按键按下返回的索引号,第三个1代表enter按键按下返回的索引号。第三个(*fun0)代表索引号为0要执行的函数。一一对应。再结合按键按下的画面就比较有逻辑了。

再来就是按键按下需要处理的函数

void  Menu_key_set(void)
{
  Get_key_next = get_button(button1);
  Get_key_enter = get_button(button2);
  if(Get_key_next == 1)
  {   
    func_index=table[func_index].next;//按键next按下后的索引号
    OLED_Clear();
  }
  if(Get_key_enter == 1)
  {
    func_index=table[func_index].enter;
    OLED_Clear();
  }

  current_operation_index=table[func_index].current_operation;//执行当前索引号所对应的功能函数。
  (*current_operation_index)();//执行当前操作函数
}
 

这里解释一下,比如在二级菜单中,分别为 :

1.CAN Mode

2.485 Mode

3.UART mode

4.BACK

那么,在一级菜单跳到二级菜单的时候,光标应该在1.CAN Mode 这里,而此时假设按键next按下就要执行光标移动到2.485 Mode 上,假设按键enter按下就要跳转到三级菜单中的第一行。所以,next按键按下就要返回2.485 Mode前面的索引号,程序在根据索引号执行相应的光标移到程序,造成光标在第一行移动到第二行的现象。光标在4.BACK上 按下next 就跳转到1.CAN Mode,只要令此时next键按下返回的索引号是CAN Mode的索引号就行。再索引号所对应的函数里执行光标移到的函数就行。多个按键也是这样的原理。

 

以上是我对多级菜单的理解,其中还有很多是一知半解,如果有误,欢迎指正。

我自己画的PCB 原理图与PCB图纸和程序源码:https://gitee.com/zhu_yu_yang/stm32_-oled_-board_-v2.1

另外参考了:https://blog.csdn.net/calmuse/article/details/79346742

如果转载,请标明出处。

 

  • 62
    点赞
  • 464
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
多级菜单显示是在OLED屏幕上实现多个界面之间的跳转。通常使用按键来选择下一项和确定选项。在STM32的程序中,可以使用一个结构体数组来定义菜单表,结构体中包含当前状态的索引号、下一项的索引号、确定选项的索引号以及当前状态应该执行的操作函数。通过按下按键来改变当前索引号,从而实现菜单的切换。以下是一个示例的菜单表: typedef struct { u8 current; //当前状态索引号 u8 next; //向下一个 u8 enter; //确定 void (*current_operation)(void); //当前状态应该执行的操作 } Menu_table; Menu_table table[17] = { {0, 0, 1, (*show0)}, //一级界面 {1, 2, 5, (*show1)}, //二级界面 第一行 {2, 3, 9, (*show2)}, //二级界面 第二行 {3, 4, 13, (*show3)}, //二级界面 第三行 {4, 1, 0, (*show4)}, //三级界面 Back {5, 6, 4, (*show5)}, //三级菜单 Back {6, 7, 5, (*show6)}, //三级菜单 {7, 8, 5, (*show7)}, //三级菜单 {8, 5, 5, (*show8)}, //三级菜单 {9, 10, 4, (*show9)}, //三级菜单 Back {10, 11, 9, (*show10)}, //三级菜单 {11, 12, 9, (*show11)}, //三级菜单 {12, 9, 9, (*show12)}, //三级菜单 {13, 14, 4, (*show13)}, //三级菜单 Back {14, 15, 13, (*show14)}, //三级菜单 {15, 16, 13, (*show15)}, //三级菜单 {16, 13, 13, (*show16)}, }; 以上是一个示例的菜单表,你可以根据需要自定义菜单的结构和操作函数。通过按下不同的按键,可以实现菜单之间的切换和操作的执行。 回答完问题后的
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值