前言
只要有显示屏的地方,就要用到多级菜单的显示。在很多初学者眼里,多级菜单的显示是很难的,今天我做完了这个小项目,我就来分享一下我做的经历。OELD采用中景园0.78寸分辨率128*80。
首先肯定的是,只要理清思路,就不怕多级菜单显示很难。先上几张照片看看我的显示。
一级菜单
二级菜单
三级菜单
四级菜单
- 硬件设备:STM32F103C8T6+0.78寸OLED IIC连接方式 两个独立按键
- 原理图与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
如果转载,请标明出处。