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

如果转载,请标明出处。

 

版权声明:本文为CSDN博主「朱宇阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42618564/article/details/114402298

生成海报
点赞 0

朱宇阳

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

HAL库串口中断

一,配置串口初始化 void MX_USART1_UART_Init(void) {huart1.Instance USART1;huart1.Init.BaudRate 115200;huart1.Init.WordLen