随着越来越多的人机交互需求,带有屏幕的嵌入式设备需要展示的信息也越来越多,多种菜单随着按键输入进行各种深入、各种切换操作。如何方便的管理不同菜单之间的切换操作呢?本篇通过实验来介绍多级菜单的实现思路。
在各种屏幕操作中,多级菜单其实是一种思路或者说是一种固定的编程框架。简单来说就是当按键触发时,根据按键定义从数组中取出当前按键需要跳转的界面索引,然后根据索引去执行响应的界面函数。
typedef struct
{
unsigned char index;
unsigned char up;
unsigned char down;
unsigned char left;
unsigned char right;
void (*operation)(void);
} KEY_TABLE;
本实验中定义了四个按键,故定义了up、down、left、right四个按键变量。
KEY_TABLE table[9] =
{
{0, 0, 0, 0, 0, (*menu11)},
{1, 0, 0, 0, 0, (*menu12)},
{2, 0, 0, 0, 0, (*menu21)},
{3, 0, 0, 0, 0, (*menu22)},
{4, 0, 0, 0, 0, (*menu23)},
{5, 0, 0, 0, 0, (*menu31)},
{6, 0, 0, 0, 0, (*menu32)},
{7, 0, 0, 0, 0, (*menu33)},
{8, 0, 0, 0, 0, (*menu34)},
};
本实验中定义了9个界面,所以如上数组元素有9个,其中界面索引号从0到8,分别对应其界面函数指针。本实验中一级菜单有2个,二级菜单有3个,三级菜单有4个。
举几个例子:
在index为0,即menu11界面下,确定{0, 0, 0, 0, 0, (*menu11)}中四个按键变量的值:
故得到{0, 0, 1, 0, 2, (*menu11)}
在index为5,即menu31界面下,确定{5, 0, 0, 0, 0, (*menu31)}中四个按键变量的值:
故得到{5, 5, 6, 2, 5, (*menu31)}
各个界面之间的跳转关系根据实际的需求进行确立,如下为本实验中完整的结构体数组变量赋值情况。
KEY_TABLE table[9] =
{
{0, 0, 1, 0, 2, (*menu11)},
{1, 0, 1, 1, 4, (*menu12)},
{2, 2, 3, 0, 5, (*menu21)},
{3, 2, 3, 0, 7, (*menu22)},
{4, 4, 4, 1, 4, (*menu23)},
{5, 5, 6, 2, 5, (*menu31)},
{6, 5, 6, 2, 6, (*menu32)},
{7, 7, 8, 3, 7, (*menu33)},
{8, 7, 8, 3, 8, (*menu34)},
};
switch (keyValue)//获取按键对应序号
{
case 1: funIndex = table[funIndex].right; break;
case 2: funIndex = table[funIndex].left; break;
case 3: funIndex = table[funIndex].down; break;
case 4: funIndex = table[funIndex].up; break;
}
current = table[funIndex].operation;//根据需要获取对应需要执行的函数
(*current)();//执行获取到的函数
OLED屏的VCC、GND分别连接开发板的3.3V、GND,OLED屏的SDA和SCL分别连接开发板的A4和A5。双轴按键摇杆模块的VCC、GND分别连接开发板的5V、GND,模块的X轴输出、Y轴输出分别连接开发板的模拟引脚A0、A1。
实验原理图如下图所示:
实物连接图如下图所示:
由于代码较长,完整代码可在文末获取。
多界面切换效果:
关注公众号「TonyCode」,后台回复“提高”,获取文中代码。
Arduino学习交流群:868283450
更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注: