基于单片机驱动OLED显示菜单界面显示效果5种功能可切换

1、前言

作为嵌入式软件开发,经常会使用命令行或显示屏等设备来实现人机交互功能。功能通常包括UI菜单设计;许多开发者都会有自己的菜单框架模块,以防止重复造轮子。这种菜单框架的代码在网上有很多,但大多过于耦合,无法独立适应不同的菜单设计。

本文介绍了一个完全独立的减少耦合的菜单框架。菜单显示风格和显示平台完全根据需要自行设计,菜单操作可以通过菜单模块处理,提高了程序的可移植性。

2、简介

菜单框架代码的主要特点是:

3、代码函数

代码的源代码部分如下:

/**
  * @brief      菜单初始化
  * 
  * @param[in]  pMainMenu    主菜单注册信息
  * @param[in]  num          主菜单数目
  * @param[in]  fpnShowMenu  主菜单显示效果函数
  * @return     0,成功; -1,失败 
  */
int Menu_Init(MenuRegister_t *pMainMenu, uint8_t num, ShowMenuCallFun_f fpnShowMenu)
{
    MenuCtrl_t *pMenuCtrl = NULL;
#if MENU_MAX_DEPTH != 0
    sg_currMenuDepth = 0;
#endif
    if ((pMenuCtrl = NewMenu()) != NULL)
    {
        pMenuCtrl->pLastMenuCtrl = NULL;
        pMenuCtrl->pfnShowMenuFun = fpnShowMenu;
        pMenuCtrl->pMenuInfo = pMainMenu;
        pMenuCtrl->menuNum = num;
        pMenuCtrl->currPos = 0;
        pMenuCtrl->isRunCallback = 0;
        sg_tMenuManage.pCurrMenuCtrl = pMenuCtrl;
        return 0;
    }
    return -1;
}

头文件的代码如下:

/**
  * @brief 菜单信息注册结构体
  * 
  */
typedef struct MenuRegister
{
    const char     *pszDesc;            /*!< 当前选项的中文字符串描述 */
    const char     *pszEnDesc;          /*!< 当前选项的英文字符串描述 */
    menusize_t      subMenuNum;         /*!< 当前选项的子菜单数目, 子菜单数目为0则表示下一级非菜单界面, 会执行非菜单功能函数 */
    struct MenuRegister *pSubMenu;      /*!< 当前选项的子菜单内容 */
    ShowMenuCallFun_f pfnShowMenuFun;   /*!< 当前选项的子菜单显示效果函数, 为NULL则延续上级菜单显示效果 */
    MenuCallFun_f     pfnEnterCallFun;  /*!< 当前选项确定进入时需要执行的函数, 为NULL不执行 */
    MenuCallFun_f     pfnExitCallFun;   /*!< 当前选项进入后在退出时需要执行的函数, 为NULL不执行 */
    MenuCallFun_f     pfnRunCallFun;    /*!< 当前选项的非菜单功能函数, 只有当菜单数目为0有效, 为NULL不执行 */
    void             *pExtendData;      /*!< 当前选项的菜单显示效果函数扩展数据入参, 可自行设置该内容 */
}MenuRegister_t;
/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/
#define GET_MENU_NUM(X)    (sizeof(X) / sizeof(MenuRegister_t))
/* Exported functions ------------------------------------------------------------------------------------------------*/
/* 菜单初始化和反初始化 */
extern int Menu_Init(MenuRegister_t *pMainMenu, uint8_t num, ShowMenuCallFun_f fpnShowMenu);
extern int Menu_DeInit(void);
/* 菜单功能设置 */
extern menubool Menu_IsEnglish(void);
extern int Menu_SetEnglish(menubool isEnable);
/* 菜单选项显示时需要使用的功能扩展函数 */
extern int Menu_UpdateShowBase(MenuShow_t *ptMenuShow, menusize_t showNum);
/* 菜单状态获取函数 */
extern menubool Menu_IsRun(void);
extern menubool Menu_IsMainMenu(void);
extern menubool Menu_IsAtMenu(void);
/* 菜单操作 */
extern int Menu_Reset(void);
extern int Menu_Enter(void);
extern int Menu_Exit(uint8_t isReset);
extern int Menu_SelectPrevious(uint8_t isAllowRoll);
extern int Menu_SelectNext(uint8_t isAllowRoll);
/* 菜单轮询处理任务 */
extern int Menu_Task(void);

4、示例代码展示效果

示例代码使用的平台是命令行输出输入显示效果

该demo提供了如何实现图形化菜单(主菜单有点粗糙)、常用列表菜单、右侧弹出菜单(更多设置)等的演示。菜单样式可以自由扩展,而且是足够免费;快捷菜单操作,中英文切换演示。(windows编译需要将demo.c转为GBK编码,Linux转为utf8编码,否则可能会出现汉字乱码的问题)

以下是单片机驱动的OLED显示的菜单界面的显示效果

5、示例代码获取链接

下载链接点击:轻量级菜单框架(最新功能可切换开发分支)

© 版权声明
THE END
喜欢就支持一下吧
点赞54赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容