0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個產品級MCU菜單框架設計

技術讓夢想更偉大 ? 來源:屋脊雀工作室 ? 2023-09-07 09:34 ? 次閱讀

來源:屋脊雀工作室

大家好,今天分享一個用單色屏做的菜單框架。代碼托管在github:

https://github.com/wujique/stm32f407/tree/sw_arch

1、概述

本處所說的菜單是用在128*64這種小屏幕的菜單,例如下面這種,不是彩屏上的GUI。

a67afbb6-4d12-11ee-a25d-92fbcf53809c.png

2、菜單框架設計

作為一個底層驅動工程師,驅動寫完了,是要寫硬件測試程序的。這個測試程序,一般給測試部/硬件工程師用來測試硬件, 也會給工廠產線測試準成品。

開始的人偷懶,不想一秒就直接上,所有菜單都這樣做,一層套一層。

voidtest_main(void)
{
while(1)
{
get_key(&key);

switch(key)
{
case1:
test_key();
break;

case2:
test_lcd();
break;
....
}
}
}

當菜單越來越多,就開始糾結了,這樣寫維護不便,看起來也不美,還浪費程序空間。

作為一個天天看《編程之美》的碼農,決定改變現狀。搜索引擎找了很久,找到了兩個參考:《基于二叉樹的多層的液晶菜單界面設計》 《基于節(jié)點編號的通用樹狀菜單設計方法與實現.pdf》 按照他們的設計方法,鼓搗了一個版本,能用,挺好,但是也糾結。

因為他們用了樹這種數據結構。對于程序運行來說,非常好,效率高。但是對于我來說,菜單代碼是一次性的,但是菜單內容,卻是會經常改的。讓我用人腦去維護一個包含幾十個上百個菜單的樹,不容易。

想來想去,這些菜單到底有什么不好?對于我來說,為什么不好用?得出下面結論:

管得太寬。菜單,你就管菜單切換就行了,到了最低一層,也就是實際的測試功能,就不要管了。菜單切換是類似的,實際測試都是不同的。比如在菜單中,按鍵1,是進入第一個菜單。但是在測試中,按鍵1,功能都不一樣。如果菜單連這個也要管,相同動作功能太多,無法進行統(tǒng)一抽象,就很難模塊化。

出發(fā)點不一樣。上面說到的菜單,出發(fā)點都是如何設計一個好的菜單數據結構,讓程序快速,高效運行。我想要的卻是一個容易維護的菜單結構,至于菜單的代碼有多亂多糾結,沒關系, 而且,幾百上千個菜單,就算用輪詢的方法,也不過幾百us吧,沒關系。

3、改進菜單

根據需求,我重新設計了一個菜單結構體

/**
*@brief菜單對象
*/
typedefstruct_strMenu
{
MenuLell;///<菜單等級
????char?cha[MENU_LANG_BUF_SIZE];???///中文
????char?eng[MENU_LANG_BUF_SIZE];???///英文
????MenuType?type;??///菜單類型
????s32?(*fun)(void);??///測試函數

}MENU;

是的,就這么簡單,每一個菜單都是這個結構體 用這個結構體填充一個列表,就是我們的菜單了

constMENUEMenuListTest[]=
{
MENU_L_0,//菜單等級
"測試程序",//中文
"test",//英文
MENU_TYPE_LIST,//菜單類型
NULL,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_1,//菜單等級
"LCD",//中文
"LCD",//英文
MENU_TYPE_LIST,//菜單類型
NULL,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行
MENU_L_2,//菜單等級
"VSPIOLED",//中文
"VSPIOLED",//英文
MENU_TYPE_FUN,//菜單類型
test_oled,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_2,//菜單等級
"I2COLED",//中文
"I2COLED",//英文
MENU_TYPE_FUN,//菜單類型
test_i2coled,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行


MENU_L_1,//菜單等級
"聲音",//中文
"sound",//英文
MENU_TYPE_LIST,//菜單類型
NULL,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行
MENU_L_2,//菜單等級
"蜂鳴器",//中文
"buzzer",//英文
MENU_TYPE_FUN,//菜單類型
test_test,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_2,//菜單等級
"DAC音樂",//中文
"DACmusic",//英文
MENU_TYPE_FUN,//菜單類型
test_test,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_2,//菜單等級
"收音",//中文
"FM",//英文
MENU_TYPE_FUN,//菜單類型
test_test,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行


MENU_L_1,//菜單等級
"觸摸屏",//中文
"tp",//英文
MENU_TYPE_LIST,//菜單類型
NULL,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_2,//菜單等級
"校準",//中文
"calibrate",//英文
MENU_TYPE_FUN,//菜單類型
test_cal,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_2,//菜單等級
"測試",//中文
"test",//英文
MENU_TYPE_FUN,//菜單類型
test_tp,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

MENU_L_1,//菜單等級
"按鍵",//中文
"KEY",//英文
MENU_TYPE_FUN,//菜單類型
test_key,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行

/*最后的菜單是結束菜單,無意義*/
MENU_L_0,//菜單等級
"END",//中文
"END",//英文
MENU_TYPE_NULL,//菜單類型
NULL,//菜單函數,功能菜單才會執(zhí)行,有子菜單的不會執(zhí)行
};

這個菜單列表有什么特點和要求呢?1 需要一個根節(jié)點和結束節(jié)點 2 子節(jié)點必須跟父節(jié)點,類似下面結構

-----------------------------------------------
根節(jié)點
第1個1級菜單
第1個子菜單
第2個子菜單
第3個子菜單
第2個1級菜單
第1個子菜單
第1個孫菜單
第2個孫菜單
第2個子菜單
第3個子菜單
第3個1級菜單
第4個1級菜單
第5個1級菜單
結束節(jié)點
------------------------------------------------
第2個1級菜單有3個子菜單,子菜單是2級菜單,其中第1個子菜單下面又有2個孫菜單(3級菜單)。 維護菜單,就是維護這個列表,添加刪除修改,非常容易。那菜單程序怎么樣呢?管他呢。定義好菜單后,通過下面函數運行菜單,
emenu_run(WJQTestLcd,(MENU*)&WJQTestList[0],sizeof(WJQTestList)/sizeof(MENU),FONT_SONGTI_1616,2);

第1個參數是在哪個LCD上顯示菜單,

第2個是菜單列表,

第3個是菜單長度,

第4個四字體,

第5則是行間距

注意:運行這個菜單需要有rtos,因為菜單代碼是while(1)的,陷進去就不出來了。需要有其他線程(TASK)維護系統(tǒng),例如按鍵掃描。

4、菜單實現效果

相關文件:emenu.c、emenu.h、emenu_test.c

當前代碼:

1實現了雙列菜單,用數字鍵選擇進入下一層。每頁最多顯示8個菜單(4*4鍵盤用1-8鍵)

2 實現了單列菜單,通過上下翻查看菜單,確認鍵進入菜單。3 天頂菜單未實現,誰有興趣可以加上。

3 基于LCD驅動架構,這個簡易菜單自適應于多種LCD。

效果如下,有需要的盡管拿去,不用謝。

5、顯示效果

a6837e26-4d12-11ee-a25d-92fbcf53809c.png

128*64 OLED

a69fc8ba-4d12-11ee-a25d-92fbcf53809c.png

128*64 OLED


a6d8aff4-4d12-11ee-a25d-92fbcf53809c.png

128*128 tft lcd

a6ec171a-4d12-11ee-a25d-92fbcf53809c.png

128*128 tft lcd

a6f9ce78-4d12-11ee-a25d-92fbcf53809c.png


320*240 tft lcd


a703574a-4d12-11ee-a25d-92fbcf53809c.png

320*240 tft lcd

6、最后

本文就分享到這里,感興趣的讀者可以自己寫一個菜單框架。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16665

    瀏覽量

    347742
  • 程序
    +關注

    關注

    115

    文章

    3719

    瀏覽量

    80355
  • GUI
    GUI
    +關注

    關注

    3

    文章

    631

    瀏覽量

    39289
  • GitHub
    +關注

    關注

    3

    文章

    461

    瀏覽量

    16232

原文標題:一個產品級MCU菜單框架設計

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    12864液晶使用教程分享 基于MCU菜單框架設計方案

    12864里面有菜單功能。 以前可能覺得菜單高大上,其實并不是想象中的復雜,本文為大家分享用單色屏做的
    發(fā)表于 02-19 17:29 ?9777次閱讀
    12864液晶使用教程分享 基于<b class='flag-5'>MCU</b><b class='flag-5'>菜單</b><b class='flag-5'>框架設</b>計方案

    STM32F407的HAL庫框架設

    第12章 STM32F407的HAL庫框架設計學習通過本章節(jié),主要是想讓大家對HAL庫程序設計的基本套路有了解,防止踩坑。目錄第12章 STM32F407的HAL庫框架設計學習12.1 初學者重要
    發(fā)表于 08-10 06:23

    如何設計產品級MCU菜單框架

    聲明:本處所說的菜單是用在128*64這種小屏幕的菜單,例如下面這種,不是彩屏上的GUI。作為底層驅動工程師,驅動寫完了,是要寫硬件測試程序的。這個測試程序,
    發(fā)表于 11-04 06:43

    分享產品級MCU菜單框架設

    發(fā)表于 11-10 06:23

    怎么實現ThreadX內核模板框架設計?

    怎么實現ThreadX內核模板框架設計?
    發(fā)表于 11-29 07:45

    在碼云/Github/CSDN上收藏的嵌入式產品級項目分享

    1、MCU產品級項目收集早年活躍在CSDN上的時候,我曾擁有不少積分下載了很多產品級的資源,這些年我也在這些產品級的項目上學習了很多編碼技能和產品
    發(fā)表于 12-24 06:26

    分享產品級的紅外發(fā)射電路

    分享產品級的紅外發(fā)射電路
    發(fā)表于 01-17 08:53

    簡單實用的MCU程序框架介紹

    簡單實用的MCU程序框架(非操作系統(tǒng),簡單調度任務) - 總體介紹?單片機程序,總體上可分為跑操作系統(tǒng)的和沒操作系統(tǒng),對于無MMU的小單片機,操作系統(tǒng)通常是UCOS、RTOS等實時
    發(fā)表于 02-11 06:21

    基于GIS的城鄉(xiāng)公交系統(tǒng)框架設計與實現

    本文在分析建立城鄉(xiāng)公交信息系統(tǒng)意義的基礎上,通過詳細調研城鄉(xiāng)公交工作需求,規(guī)劃和設計了基于GIS 的城鄉(xiāng)公交信息系統(tǒng)的框架設計,功能結構,并根據系統(tǒng)功能需要,在簡
    發(fā)表于 12-19 14:12 ?8次下載

    基于CAN總線的通訊系統(tǒng)軟件框架設

    基于CAN總線的通訊系統(tǒng)軟件框架設
    發(fā)表于 01-24 16:54 ?21次下載

    產品級MCU菜單框架設計~

    聲明:本處所說的菜單是用在128*64這種小屏幕的菜單,例如下面這種,不是彩屏上的GUI。作為底層驅動工程師,驅動寫完了,是要寫硬件測試程序的。這個測試程序,
    發(fā)表于 10-29 11:20 ?15次下載
    <b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>產品級</b><b class='flag-5'>MCU</b><b class='flag-5'>菜單</b><b class='flag-5'>框架設</b>計~

    產品級MCU菜單框架設

    關注+星標公眾號,不錯過精彩內容轉自 | 嵌入式云IOT技術圈微信公眾號|嵌入式專欄不知道有多少人折騰過液晶顯示的菜單,我覺得很多人都應該搞過,我還記得以前大學參加電子設計競賽獲獎的...
    發(fā)表于 11-05 15:51 ?38次下載
    <b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>產品級</b><b class='flag-5'>MCU</b><b class='flag-5'>菜單</b><b class='flag-5'>框架設</b>計

    基于WebRTC開源MCU框架的橫向對比

    基于WebRTC開源MCU框架的橫向對比
    發(fā)表于 12-05 10:06 ?7次下載
    三<b class='flag-5'>個</b>基于WebRTC開源<b class='flag-5'>MCU</b><b class='flag-5'>框架</b>的橫向對比

    產品級MCU菜單框架設

    作為底層驅動工程師,驅動寫完了,是要寫硬件測試程序的。這個測試程序,般給測試部/硬件工程師用來測試硬件, 也會給工廠產線測試準成品。
    發(fā)表于 02-08 16:09 ?2次下載
    <b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>產品級</b><b class='flag-5'>MCU</b><b class='flag-5'>菜單</b><b class='flag-5'>框架設</b>計

    基于LCD驅動架構的MCU菜單框架設

    當前代碼: 1實現了雙列菜單,用數字鍵選擇進入下層。每頁最多顯示8菜單(4*4鍵盤用1-8鍵) 2 實現了單列菜單,通過上下翻查看
    發(fā)表于 10-11 14:51 ?1126次閱讀
    基于LCD驅動架構的<b class='flag-5'>MCU</b><b class='flag-5'>菜單</b><b class='flag-5'>框架設</b>計