多级菜单
时间: 2023-08-24 13:08:23 浏览: 92
多级菜单通常用于在嵌入式系统中显示和选择多个菜单选项。这些菜单通常是分层的,用户可以通过选择菜单项来导航到更深层的菜单。
以下是一个简单的多级菜单的示例,其中有三个菜单层级,每个菜单层级都有多个菜单选项:
```C++
#include <Arduino.h>
#include <LiquidCrystal.h>
// Define LCD pins
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Define menu structure
struct MenuItem {
String title;
int numSubItems;
MenuItem *subItems[3];
};
MenuItem rootMenu[] = {
{"Option 1", 0, nullptr},
{"Option 2", 0, nullptr},
{"Submenu 1", 3, new MenuItem[3]{
{"Option 3", 0, nullptr},
{"Option 4", 0, nullptr},
{"Back", 0, nullptr}
}},
{"Submenu 2", 3, new MenuItem[3]{
{"Option 5", 0, nullptr},
{"Option 6", 0, nullptr},
{"Back", 0, nullptr}
}}
};
MenuItem *currentMenu = rootMenu;
int selectedItem = 0;
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(currentMenu[selectedItem].title);
}
void loop() {
// Handle button presses or rotary encoder
// For example: if (buttonPressed) selectMenuItem();
}
void selectMenuItem() {
if (currentMenu[selectedItem].numSubItems > 0) {
// Navigate to sub-menu
currentMenu = currentMenu[selectedItem].subItems;
selectedItem = 0;
} else if (currentMenu[selectedItem].title == "Back") {
// Navigate back to parent menu
currentMenu = rootMenu;
selectedItem = 0;
} else {
// Handle selected menu option
switch (selectedItem) {
case 0:
// Option 1 selected
break;
case 1:
// Option 2 selected
break;
case 2:
// Option 3 selected
break;
case 3:
// Option 4 selected
break;
case 4:
// Option 5 selected
break;
case 5:
// Option 6 selected
break;
}
}
// Update menu display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(currentMenu[selectedItem].title);
if (currentMenu[selectedItem].numSubItems > 0) {
lcd.setCursor(0, 1);
lcd.print(">");
}
}
```
在以上代码中,我们定义了一个 `MenuItem` 结构体来表示每个菜单项,其中包括菜单项标题、子菜单项数量和一个指向子菜单的指针数组。我们定义了一个 `rootMenu` 数组来表示根菜单,其中包括四个菜单选项,其中两个选项是普通选项,另外两个选项是子菜单。每个子菜单包含三个菜单选项。我们使用 `currentMenu` 变量跟踪当前菜单,使用 `selectedItem` 变量跟踪当前选择的菜单项。
在 `setup()` 函数中,我们初始化 LCD 显示屏,并显示当前菜单的标题。
在 `selectMenuItem()` 函数中,我们根据当前选择的菜单项执行适当的操作。如果当前菜单项有子菜单,我们会更新 `currentMenu` 变量指向子菜单,并将 `selectedItem` 重置为 0。如果当前菜单项是 "Back",我们会返回到父菜单,并将 `selectedItem` 重置为 0。否则,我们会处理当前选择的菜单选项,并根据需要执行相应的操作。无论哪种情况,我们都会更新 LCD 显示屏以反映当前菜单的状态。
在 `loop()` 函数中,我们将处理按钮按下或旋转编码器的代码放在那里。当用户选择菜单项时,我们将调用 `selectMenuItem()` 函数。
阅读全文