源代码源自:
(Arduino提高篇15—摇杆操作OLED多级菜单_TonyIOT的博客-优快云博客_arduino 多级菜单
根据个人的理解,画图理解,根据结构体中的变量,我将index索引和界面操作menu分为在一个方格内,表示同一个意思,index有九个界面。
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--------------往下一级或无法往下则保持本界面
假设在index为0的情况下,也就是menu11情况下,往up同级别左移动的操作界面为本身menu11,那么对应的索引号为0,down同级别右移的界面为menu12,索引号为1,left返回上级为本身menu11索引号为0,right往下一级移动的界面最先跳到索引号为2的界面,即menu12,
所以inex=0时,结构体数组变量赋值情况为:{0,0,1,0,2,(*menu11)}
同理假如换到index=7的情况,LEFT往上一级为3,RIGHT往下一级是无法移动的,所以是本身索引号7,UP同级别左移无法移动过到6这边(特别注意不是同一树支不能乱移动),只能为7,DOWN右移为8。结构体数组变量赋值情况为:{7, 7, 8, 3, 7, (*menu33)}
那么假设index=1,即menu12,
可以同级别左移,不能右移,可以下移,不能上移,则为{1, 0, 1, 1, 4, (*menu12)}。
综合以上规律总结所有的界面, 完整的结构体数组变量赋值情况为:
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)},
};
原完整代码为
/*
OLED_Menu
摇杆操作OLED多级菜单
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
#define pinX A0
#define pinY A1
int valueX = 0;
int valueY = 0;
unsigned char keyValue = 0;
//定义按键结构体
typedef struc