#include <U8g2lib.h>
#include <Encoder.h>
// OLED相关配置
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); // 使用U8G2_SSD1306_128X64_NONAME_F_HW_I2C初始化屏幕,根据需要调整旋转方向
const int SCREEN_WIDTH = 128;
const int SCREEN_HEIGHT = 64;
const int MENU_ITEM_HEIGHT = 15; // 每行高度
const int MENU_ITEM_WIDTH = SCREEN_WIDTH; // 每行宽度
#define U8G2_WHITE 0 // 如果U8G2库中未定义,手动定义为0(白色)
#define U8G2_BLACK 1 // 如果U8G2库中未定义,手动定义为1(黑色)
// EC11编码器相关配置
Encoder encoder(10, 11); // TRA接10,TRB接11
const int BUTTON_PIN = 8; // CON按钮接8
const int BACK_BUTTON_PIN = 12; // BAK按钮接12
// 菜单相关变量
int menuIndex = 0;
int submenuIndex = 0;
bool inSubMenu = false;
const int NUM_MENU_ITEMS = 2; // 主菜单项数
const int NUM_SUBMENU_ITEMS = 2; // 读取模式下的子菜单项数
void setup() {
u8g2.begin();
u8g2.clearBuffer();
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BACK_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
// 读取EC11编码器旋转方向
int encoderValue = encoder.read();
if (encoderValue > 0) {
menuIndex = (menuIndex + 1) % NUM_MENU_ITEMS;
submenuIndex = 0;
inSubMenu = false;
} else if (encoderValue < 0) {
menuIndex = (menuIndex - 1 + NUM_MENU_ITEMS) % NUM_MENU_ITEMS;
submenuIndex = 0;
inSubMenu = false;
}
// 检测按钮按下
if (digitalRead(BUTTON_PIN) == LOW) {
if (!inSubMenu) {
enterSubMenu();
} else {
if (menuIndex == 1 && submenuIndex == 1) {
// 处理设置保存逻辑,这部分根据你的实际设置需求来编写
// 在这里处理保存设置的逻辑
// 保存成功后返回上一级菜单
exitSubMenu();
} else {
exitSubMenu();
}
}
}
// 检测返回按钮按下
if (digitalRead(BACK_BUTTON_PIN) == LOW && inSubMenu) {
exitSubMenu();
}
// 渲染显示
drawMenu();
u8g2.sendBuffer();
delay(10); // 可以根据需要调整刷新频率
}
void drawMenu() {
u8g2.clearBuffer();
// 渲染标题栏
if (!inSubMenu) {
u8g2.setFont(u8g2_font_ncenB14_tr); // 设置标题字体
u8g2.setDrawColor(1); // 黑色字体
u8g2.drawBox(0, 0, SCREEN_WIDTH, MENU_ITEM_HEIGHT); // 白色背景
u8g2.setCursor(0, MENU_ITEM_HEIGHT - 2);
u8g2.setFontMode(1); // 启用透明背景
u8g2.setDrawColor(0); // 黑色字体
if (menuIndex == 0) {
u8g2.print("S mode");
} else if (menuIndex == 1) {
u8g2.print("R mode");
}
} else {
if (menuIndex == 1 && submenuIndex == 0) {
u8g2.setFont(u8g2_font_ncenB14_tr); // 设置标题字体
u8g2.setDrawColor(1);
u8g2.drawBox(0, 0, SCREEN_WIDTH, MENU_ITEM_HEIGHT); // 白色背景
u8g2.setCursor(0, MENU_ITEM_HEIGHT - 2);
u8g2.setFontMode(1); // 启用透明背景
u8g2.setDrawColor(0); // 黑色字体
u8g2.print(" 读取模式设置");
} else {
u8g2.setFont(u8g2_font_ncenB08_tr); // 设置内容字体
u8g2.setDrawColor(0); // 白色字体
u8g2.drawBox(0, 0, SCREEN_WIDTH, MENU_ITEM_HEIGHT); // 黑色背景
u8g2.setCursor(2, MENU_ITEM_HEIGHT - 2);
u8g2.setFontMode(1); // 启用透明背景
u8g2.setDrawColor(1); // 白色字体
if (submenuIndex == 0) {
u8g2.print(" pin1: ");
// 在这里添加pin1的当前设置编号,默认A0
} else if (submenuIndex == 1) {
u8g2.print(" pin2: ");
// 在这里添加pin2的当前设置编号,默认A1
} else if (submenuIndex == 2) {
u8g2.print(" pin3: ");
// 在这里添加pin3的当前设置编号,默认D2
} else if (submenuIndex == 3) {
u8g2.print(" pin4: ");
// 在这里添加pin4的当前设置编号,默认D3
}
}
}
u8g2.sendBuffer();
}
void enterSubMenu() {
inSubMenu = true;
submenuIndex = 0;
}
void exitSubMenu() {
inSubMenu = false;
submenuIndex = 0;
}