STM32 oled多级菜单显示

   日期:2021-03-07     浏览:124    评论:0    
核心提示:前言 只要有显示屏的地方,就要用到多级菜单的显示。在很多初学者眼里,多级菜单的显示是很难的,今天我做完了这个小项目,我就来分享一下我做的经历。首先肯定的是,只要理清思路,就不怕多级菜单显示很难。先上几张照片看看我的显示。 一级菜单 二级菜单 ...

前言

      只要有显示屏的地方,就要用到多级菜单的显示。在很多初学者眼里,多级菜单的显示是很难的,今天我做完了这个小项目,我就来分享一下我做的经历。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

如果转载,请标明出处。

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服