arduino 多级菜单
时间: 2023-10-02 11:05:33 浏览: 199
在 Arduino 中实现多级菜单可以采用递归函数的方式。以下是一个简单的示例:
```
#include <LiquidCrystal.h>
// 定义 LCD 引脚
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// 定义菜单项
struct MenuItem {
const char* name; // 菜单项名称
MenuItem* subMenu; // 子菜单指针
void (*action)(); // 菜单项动作
};
// 定义菜单
MenuItem menu[] = {
{"Option 1", NULL, NULL},
{"Option 2", NULL, NULL},
{"Sub-menu", &menu[3], NULL},
{"Back", NULL, NULL}
};
// 菜单项数量
const int NUM_MENU_ITEMS = sizeof(menu) / sizeof(MenuItem);
// 显示菜单项
void displayMenuItem(const MenuItem& item) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(item.name);
lcd.setCursor(0, 1);
lcd.print("Press SELECT");
}
// 显示菜单
void displayMenu(MenuItem* menuItems, int selectedItemIndex) {
displayMenuItem(menuItems[selectedItemIndex]);
}
// 处理菜单项动作
void handleMenuAction(const MenuItem& item) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(item.name);
lcd.setCursor(0, 1);
lcd.print("Action taken");
delay(2000);
}
// 处理菜单选择
void handleMenuSelect(MenuItem* menuItems, int& selectedItemIndex) {
MenuItem& selectedItem = menuItems[selectedItemIndex];
// 如果存在子菜单,则进入子菜单
if (selectedItem.subMenu != NULL) {
displayMenu(selectedItem.subMenu, 0);
handleMenuSelection(selectedItem.subMenu);
}
// 如果是返回菜单,则返回上一级菜单
else if (selectedItem.action == NULL && &selectedItem != menu) {
handleMenuSelection(menuItems - 1);
}
// 否则执行菜单项动作
else {
handleMenuAction(selectedItem);
displayMenu(menuItems, selectedItemIndex);
}
}
// 处理菜单选择
void handleMenuSelection(MenuItem* menuItems) {
int selectedItemIndex = 0;
displayMenu(menuItems, selectedItemIndex);
while (true) {
// 处理 SELECT 按钮
if (digitalRead(6) == HIGH) {
handleMenuSelect(menuItems, selectedItemIndex);
}
// 处理 UP 按钮
if (digitalRead(7) == HIGH) {
if (selectedItemIndex > 0) {
selectedItemIndex--;
displayMenu(menuItems, selectedItemIndex);
}
}
// 处理 DOWN 按钮
if (digitalRead(8) == HIGH) {
if (selectedItemIndex < NUM_MENU_ITEMS - 1) {
selectedItemIndex++;
displayMenu(menuItems, selectedItemIndex);
}
}
}
}
void setup() {
// 初始化 LCD
lcd.begin(16, 2);
// 初始化按钮
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
}
void loop() {
// 进入菜单
handleMenuSelection(menu);
}
```
这个示例使用 LCD 显示屏和 3 个按钮来实现多级菜单。当菜单项被选择时,它可以执行某些操作或进入子菜单。用户可以使用 UP 和 DOWN 按钮来选择菜单项,使用 SELECT 按钮来确认选择。
阅读全文