本文主要是介绍使用摇杆以及oled显示屏 制作 选择菜单以及子菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
x轴方向控制翻页
y轴方向控制上下选择
#include <Arduino.h>
#include <U8g2lib.h>// PS2摇杆和按钮的引脚定义
const int ps2_y_pin = 33; // Y轴用于上下选择
const int ps2_x_pin = 32; // X轴用于翻页(进入/退出子菜单)// OLED显示屏初始化
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);// 菜单项和状态
String menuItems[] = {"Item 1", "Item 2", "Item 3", "Item 4"};
String subMenuItems[] = {"Option A", "Option B", "Option C"};
int selectedItem = 0; // 当前选中的菜单项
bool inSubMenu = false; // 是否处于子菜单
void drawSubMenu();
void drawMainMenu();
void displayMenu();
void handleInput();
void setup() {Serial.begin(9600);pinMode(ps2_x_pin, INPUT);pinMode(ps2_y_pin, INPUT);u8g2.begin();
}void loop() {handleInput();displayMenu();delay(100); // 适当延迟以稳定读取
}void handleInput() {static unsigned long lastInputTime = 0;const unsigned long debounceDelay = 200; // 去抖动延迟int val_y = analogRead(ps2_y_pin);int val_x = analogRead(ps2_x_pin);int maxIndex = (inSubMenu ? sizeof(subMenuItems)/sizeof(subMenuItems[0]) : sizeof(menuItems)/sizeof(menuItems[0])) - 1;if (millis() - lastInputTime > debounceDelay) {if (val_y < 1000) { // 向上移动selectedItem = max(selectedItem - 1, 0);lastInputTime = millis();} else if (val_y > 3000) { // 向下移动selectedItem = min(selectedItem + 1, maxIndex);lastInputTime = millis();}if (val_x < 1000 || val_x > 3000) { // 向左或向右翻页inSubMenu = !inSubMenu; // 切换子菜单状态selectedItem = 0; // 重置选中项到第一项lastInputTime = millis();while(analogRead(ps2_x_pin) < 1000 || analogRead(ps2_x_pin) > 3000); // 等待翻页操作完成}}
}void displayMenu() {u8g2.firstPage();do {if (inSubMenu) {drawSubMenu();} else {drawMainMenu();}} while (u8g2.nextPage());
}void drawMainMenu() {u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体for (int i = 0; i < sizeof(menuItems) / sizeof(menuItems[0]); i++) {if (i == selectedItem) {u8g2.drawStr(0, i * 12 + 12, ">"); // 在选中项前绘制指示符}u8g2.setCursor(12, i * 12 + 12); // 设置文字开始的位置u8g2.print(menuItems[i]); // 绘制菜单项文本}
}void drawSubMenu() {u8g2.setFont(u8g2_font_ncenB08_tr); // 设置字体for (int i = 0; i < sizeof(subMenuItems) / sizeof(subMenuItems[0]); i++) {if (i == selectedItem) {u8g2.drawStr(0, i * 12 + 12, ">"); // 在选中项前绘制指示符}u8g2.setCursor(12, i * 12 + 12); // 设置文字开始的位置u8g2.print(subMenuItems[i]); // 绘制子菜单项文本}
}
这篇关于使用摇杆以及oled显示屏 制作 选择菜单以及子菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!