使用vscode里的U8G2 库编写OLED菜单控制

功能:ESP32 + I2C‑OLED,上下两个按键,实现滚动菜单,>箭头标记当前选中条目。

一、硬件接线

1.OLED SSD1306 I2C(128*64)

OLED 引脚 ESP32 引脚 说明
VCC 3.3V 不要接 5V
GND GND 共地,必须接
SDA GPIO21 I2C 数据
SCL GPIO22 I2C 时钟

2.按键(2 个,不需要外部电阻)

模式INPUT_PULLUP:GPIO 内部自带上拉电阻,按键只需要把引脚和 GND 短接。

按键 ESP32 引脚 另一端
向上按键 BUTTON_UP GPIO12 GND
向下按键 BUTTON_DOWN GPIO14 GND
cpp 复制代码
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>

#define MENU_SIZE 4
#define BUTTON_UP 12
#define BUTTON_DOWN 14

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

char *menu[MENU_SIZE] = {"Item 1", "Item 2", "Item 3", "Item 4"};

int order = 0;

void display_menu(int index);

void setup()
{
  Wire.begin(21,22);
  u8g2.setI2CAddress(0x78);
  u8g2.begin();
  u8g2.setFont(u8g2_font_6x12_tr);

  pinMode(BUTTON_UP, INPUT_PULLUP);
  pinMode(BUTTON_DOWN, INPUT_PULLUP);
}

void loop()
{
  if(!digitalRead(BUTTON_UP))
  {
    order --;
    if(order<0)order = MENU_SIZE-1;
    delay(150);
  }

  if(!digitalRead(BUTTON_DOWN))
  {
    order ++;
    if(order>=MENU_SIZE)order=0;
    delay(150);
  }

  display_menu(order);
  delay(30);
}

void display_menu(int index)
{
  u8g2.clearBuffer();

  u8g2.drawStr(0,12,"Menu");
  u8g2.drawHLine(0,14,128);

  for(int i=0;i<MENU_SIZE;i++)
  {
    int y = (i+2) * 12 +2;
    if(i==index)
    {
      u8g2.drawStr(5,y,">");
      u8g2.drawStr(20,y,menu[i]);
    }
    else{
      u8g2.drawStr(5,y,menu[i]);
    }
  }
  u8g2.sendBuffer();
}

二、程序逻辑流程

1.setup () 初始化

  • Wire.begin(21,22):初始化 I2C 总线 (SDA=21,SCL=22)
  • 设置 OLED I2C 写地址0x78,启动 OLED,设置英文字体
  • 按键引脚配置为内部上拉输入 INPUT_PULLUP,按键按下引脚拉到 GND 变为低电平

2.loop () 主循环

  • 检测 UP 按键:按下 → order−1;到最顶部 (order<0),跳到最后一项 MENU_SIZE‑1
  • 检测 DOWN 按键:按下 → order+1;到最底部,回到 0 号条目
  • delay(150)简单软件消抖,避免一次按动跳多行
  • 调用display_menu(order)刷新屏幕菜单
  • 小延时 30ms,降低 CPU 占用

3.display_menu (int index) 菜单渲染函数

参数index就是当前选中的菜单下标order

  1. clearBuffer()清空内存画面缓存
  2. 绘制标题Menu,画一条水平分隔线
  3. for 循环遍历 4 条菜单:
    • 如果循环变量i == index:打印>箭头 + 菜单文字(代表当前选中)
    • 否则只打印菜单文字
  4. sendBuffer()把整帧画面一次性发送到 OLED 屏幕显示

数组menu[]存放菜单字符串;order是全局变量,保存当前选中项下标,范围 0~3。

相关推荐
兔头?1 分钟前
JVM学习文档
jvm·学习
hkNaruto2 分钟前
【AI】深度学习、强化学习、深度强化学习基础概念笔记
人工智能·笔记·深度学习
无心水1 小时前
15、云原生架构设计理论与实践 核心考点与学习笔记
笔记·学习·云原生·架构师·软考·系统架构设计师·软考系统架构设计师
辰辰观影1 小时前
安卓电视云盘在线播放软件推荐
经验分享
路上有只喵1 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇5
单片机·嵌入式硬件·fpga开发
动词ing1 小时前
【学习笔记】51单片机 独立按键控制LED显示二进制
笔记·学习·51单片机
叼烟扛炮1 小时前
Linux 学习笔记(三十九):网络基石——TCP/IP 模型与 UDP 实战
linux·运维·网络·笔记·学习·tcp/ip
闲云野鹤在人间1 小时前
头秃修炼手册:StorageClass+StatefulSet+ETCD 全套渡劫笔记
linux·数据库·笔记·云原生·kubernetes·etcd
恒锐丰科技林技术员1 小时前
CL5012A 升压型双节锂电池充电芯片方案解析
经验分享·嵌入式硬件·硬件工程
派大猩猩_1 小时前
选题散在 20 篇笔记里?Nutstore Sync在 Obsidian 里创建选题小工具,创作动线短一半
笔记·obsidian·obsidian插件·obsidian ai