大家好,我是U8g2_menu库的作者Yxg。今天给大家带来我打磨已久的嵌入式菜单库——U8g2_menu 2.0.0正式版,基于经典的U8g2图形库开发,专门解决嵌入式设备(尤其是OLED屏)菜单开发繁琐、交互生硬、扩展性差的问题,目前已开源至GitHub,欢迎大家Star、Fork、交流反馈!

一、库的核心定位

U8g2_menu 是 U8g2图形库的功能扩展组件,并非独立库,核心目标是让开发者无需从零搭建菜单逻辑,只需几行代码就能实现功能完善、交互流畅的嵌入式菜单,适配128x64 OLED(SSD1306)及所有U8g2支持的显示屏,兼容各类MCU(STM32、ESP32等)。

适用场景:智能硬件控制面板、嵌入式调试界面、小型仪表显示、DIY项目菜单等,尤其适合资源有限的嵌入式场景(占用资源少,无多余冗余代码)。

二、核心优势(为什么选择它?)

作为开发者,我深知嵌入式菜单开发的痛点——重复写绘制逻辑、按键交互、动画效果,耗时且易出错。因此U8g2_menu 2.0.0 重点解决这些问题,核心优势如下:

  • 上手极简:提供最小化示例,3分钟就能搭建一个可运行的菜单,标准初始化流程固定,无需纠结底层细节;

  • 功能全面:覆盖文本、数值、按钮、图表、图片、自定义画板等多类型菜单项,支持UTF-8中文显示、超长文本自动滚动;

  • 交互流畅:内置按键消抖、长按检测,菜单项切换有平滑动画,选中项缩放效果,提升用户体验;

  • 高度灵活:支持自定义选择器、自定义画板、弱定义回调重写,可根据项目需求灵活扩展;

  • 工程化适配:内置事件系统、图层支持、记录功能(便于调试),按键参数、动画帧率可自由配置,贴合实际工程开发场景;

  • 示例丰富:提供12个由浅入深的示例,从基础显示到高级定制,复制粘贴就能移植使用。

三、快速上手(3分钟搭建第一个菜单)

话不多说,直接上代码!以下是最小化示例,适配128x64 OLED,实现一个简单的“Hello 菜单”显示,新手可直接复制使用。

3.1 依赖准备

使用前需先集成 U8g2 官方库(u8g2.h、u8g2.c等),并完成OLED的底层硬件初始化(IIC/SPI均可)。

3.2 最小化示例代码

#include "u8g2.h"
#include "u8g2_menu.h"

u8g2_t u8g2;          // U8g2实例
u8g2_menu_t u8g2_menu;// 菜单实例

// 菜单项绘制回调(自定义菜单内容)
void menuItem_1() {
    u8g2_menuUTF8Printf("Hello U8g2_menu!"); // UTF-8字符串绘制
}

// 菜单绘制函数
void oled_display(u8g2_t *u8g2) {
    u8g2_Drawmenu(&u8g2_menu, 0, 0, 128, 64); // 绘制菜单(坐标+尺寸)
}

int main(void) {
    delay_init();                // 延时初始化(根据自己的MCU修改)
    oled_u8g2_init(&u8g2);       // OLED + U8g2初始化(自定义底层)
    u8g2_SetFont(&u8g2, u8g2_font_10x20_tf); // 设置字体
    
    // 创建菜单(绑定U8g2实例、菜单实例、绘制回调)
    u8g2_Createmenu(&u8g2, &u8g2_menu, menuItem_1);
    
    // 主循环(U8g2标准刷新流程)
    while(1) {
        u8g2_ClearBuffer(&u8g2); // 清空缓冲区
        oled_display(&u8g2);     // 绘制菜单
        u8g2_SendBuffer(&u8g2);  // 发送到屏幕显示
    }
}

3.3 标准初始化流程(必看)

所有项目都可遵循以下流程,避免踩坑:

延时初始化 → GPIO初始化(按键需要) → OLED初始化(U8g2) → 设置字体 → 创建菜单 → 定时器初始化(1ms按键扫描) → 主循环(清缓冲→绘制→发送)

四、核心功能速览(重点模块)

2.0.0版本包含20个核心模块,这里挑几个开发者最常用的重点介绍,完整API可查看仓库文档。

4.1 变量绑定(最常用功能)

支持int、float、switch等多种类型变量绑定,按下Enter进入编辑状态,Up/Down调整数值,无需手动写编辑逻辑:

// 示例:绑定int变量(值10~100,步长5)
int num = 50;
u8g2_menuItemValue_int(&num, 5, 10, 100);
u8g2_menuUTF8Printf("数值: %d", num);

// 示例:绑定switch开关(打开值为1,按下Enter切换)
uint8_t sw = 0;
u8g2_menuItemValue_switch(&sw, 1);
u8g2_menuUTF8Printf("开关: %s", sw ? "开启" : "关闭");

4.2 菜单导航与子菜单

支持多层子菜单跳转(最大16层),绑定简单,自动保留返回路径:

// 子菜单绘制回调
void sub_menu() {
    u8g2_menuItem_menu_back(); // 返回上一级菜单
    u8g2_menuUTF8Printf("返回上一级菜单");
    u8g2_menuUTF8Printf("子菜单页面");
}

// 主菜单绑定子菜单
void main_menu() {
    u8g2_menuItem_menu(sub_menu); // 跳转到子菜单
    u8g2_menuUTF8Printf("进入子菜单");
}

4.3 图表与交互组件

内置折线图、散点图、柱状图,支持双缓冲(防闪烁),还有滑块条、进度条,适合数据显示场景:

// 图表示例(折线图)
u8g2_chart_t chart;
float data[50], data_dis[50];

// 图表初始化
u8g2_chart_init(&chart, data, data_dis, 50);

// 菜单项绘制图表
void chart_menu() {
    u8g2_chart_addData(&chart, 随机数据); // 添加数据
    u8g2_chart_update(&chart);           // 同步显示缓冲
    // 绘制折线图(高度60,自动计算数据范围)
    u8g2_menuDrawItemLineChart(&chart, 60, 0, 0);
}

4.4 消息框与动画

支持字符串/图片消息框,可设置超时自动关闭;内置菜单项切换动画、选中缩放效果,提升交互体验:

// 显示字符串消息框(3秒后自动关闭)
u8g2_menuDrawMessageBox_str(&u8g2_menu, "操作成功!", 3000);

// 显示图片消息框(无限显示,手动关闭)
u8g2_menuDrawMessageBox_xbm(&u8g2_menu, 32, 32, 图片数据, U8G2_menu_INFINITE_TIMEOUT);

五、12个完整示例(快速移植)

仓库example目录提供12个梯度示例,覆盖从基础到高级的所有场景,新手可直接复制对应示例的main.c,修改底层初始化即可使用:

  • 示例1:最小化菜单创建(Hello显示)

  • 示例3:变量编辑(uint32/float/switch)

  • 示例4:多菜单跳转

  • 示例9:图表绘制(折线/散点/柱状)

  • 示例12:高级定制(快捷跳转+弱回调重写)

六、开源地址与使用说明

✅ 仓库地址:https://github.com/1641420800/u8g2_menu

✅ 版本:2.0.0(稳定版,已完成测试,可直接用于项目)

✅ 文档:仓库内包含完整API手册(本文部分内容来自手册,完整版可查看仓库README)

使用注意事项

  • 必须依赖U8g2官方库,使用前请确保已集成U8g2的头文件和源文件;

  • 定时器中断需调用u8g2_menuTime_ISR(消息框超时、动画依赖);

  • 按键扫描建议使用u8g2_menuKeyScannDebounce(带消抖,更稳定);

  • 支持自定义选择器、画板等扩展,具体可参考示例11、12。

七、作者寄语

这个库从构思到2.0.0版本,前后打磨了很久,初衷是解决自己开发嵌入式菜单时的痛点,也希望能帮助到更多同行开发者,节省开发时间。

如果大家在使用过程中遇到问题、有优化建议,欢迎在GitHub Issues留言,或者在评论区交流;如果觉得这个库对你有帮助,麻烦给个Star支持一下,后续会持续更新迭代,增加更多实用功能!

最后,感谢U8g2作者olikraus提供的优秀图形库,也感谢所有可能支持这个开源项目的朋友🙏

补充说明

本文仅展示核心功能和快速上手方法,完整的API文档、详细示例、配置说明,均在GitHub仓库中,建议大家下载源码查看,配合示例学习效率更高。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐