標(biāo)題: 單片機(jī)多級(jí)菜單編程的設(shè)計(jì)思路與理解 [打印本頁(yè)]

作者: liu100m    時(shí)間: 2018-11-2 09:10
標(biāo)題: 單片機(jī)多級(jí)菜單編程的設(shè)計(jì)思路與理解
多級(jí)菜單編程的設(shè)計(jì)思路:

預(yù)先定義一個(gè)包含 6 個(gè)結(jié)構(gòu)元素的結(jié)構(gòu)體5 個(gè)字符型和 1 個(gè)指針。 1 個(gè)字符量存放當(dāng)前界面的索引號(hào);
2 個(gè)字符量存放按下down(向下)鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào); 3 個(gè)字符量存放按下“up(向上)鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào);
4 個(gè)字符量存放按下enter(進(jìn)入)鍵時(shí)需要跳轉(zhuǎn)的索引號(hào); 5 個(gè)字符量存放按下esc(退出)鍵時(shí)需要跳轉(zhuǎn)的索引號(hào);
6 個(gè)變量函數(shù)指針變量,存放當(dāng)前索引號(hào)下需要執(zhí)行的函數(shù)的入口地址。 將所有需要顯示的界面其所對(duì)應(yīng)的執(zhí)行函數(shù)和按鍵索引號(hào)以結(jié)構(gòu)體的形式列表存儲(chǔ)。具體實(shí)現(xiàn)如下:
typedef struct
{
uchar index;              // 1 個(gè),存放當(dāng)前界面的索引號(hào)
uchar down_index; // 2 個(gè),按下down(向下)鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào) uchar up_index;              // 3 個(gè),按下“up(向上)鍵時(shí)需要跳轉(zhuǎn)到的索引號(hào); uchar enter_index;                // 4 個(gè),按下enter(進(jìn)入)鍵時(shí)需要跳轉(zhuǎn)的索引號(hào); uchar esc_index;              // 5 個(gè)當(dāng)前索號(hào)下需要執(zhí)行 的函數(shù)入口地址。 void (*operate)();                            //
6 個(gè)函數(shù)指針
}Key_index_struct;

設(shè)單分 3 級(jí), 10 個(gè),則
Key_index_struct const Key_tab[10]=
//              |-----------> Index
//              |              |down(下)
//              |              |              | up上)
//              |              |              |              | Enter(確認(rèn))
//              |              |              |              |              |Esc (退出)--->功能函數(shù)
//              |              |              |              |              |
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機(jī)畫面


{ {0, 0, 0, 1, 0,(*main_menu)},
{1, 2, 3, 4, 0,(*sub_menu1)},
{2, 3, 1, 5, 0,(*sub_menu2)},
{3, 1, 2, 7, 0,(*sub_menu3)},
{4, 4, 4, 4, 1,(*sub_menu1_1)},
{5, 6, 6, 5, 2, (*sub_menu2_1)},
{6, 5, 5, 5, 2,(*sub_menu2_2)},
{7, 8, 9, 7, 3,(*sub_menu3_1)},
{8, 9, 7, 8, 3,(*sub_menu3_2)},
{9, 7, 8, 9, 3,(*sub_menu3_3)}, };



/****************************************************
索引號(hào)在結(jié)構(gòu)圖中,讀者可以標(biāo)上




/********************************************************


void Lcd_display(void)
{
switch(Key_status)
{
case enter: Key_fun=Key_tab[Key_fun].enter_index;
break;
case down: Key_fun=Key_tab[Key_fun].down_index;
break;
case up: Key_fun=Key_tab[Key_fun].up_index;
break;
case esc: Key_fun=Key_tab[Key_fun].esc_index;
break;
default: return;
break;
} Key_fun_Pt=Key_tab[Key_fun].operate;
(*Key_fun_Pt)();//執(zhí)行當(dāng)按鍵的操作
}
當(dāng)微處理掃描鍵盤測(cè)到有按按下時(shí),據(jù)按鍵按的類型,回在當(dāng)前 所對(duì)應(yīng)的跳轉(zhuǎn)索引號(hào),并執(zhí)行相應(yīng)的函數(shù)。

這段程序隱含一狀態(tài)機(jī)-----通過(guò)不同的鍵改變狀態(tài)。



結(jié)構(gòu)圖與這一段代碼可理解為狀態(tài)機(jī)。{1,
2, 3, 4, 0,(*sub_menu1)},這些數(shù)字代表 不同階段不同狀態(tài)的索引號(hào)。 表示個(gè)態(tài)之轉(zhuǎn)。可理態(tài)機(jī),據(jù)按鍵的鍵
跳轉(zhuǎn)的下一狀態(tài)。
系統(tǒng)啟動(dòng)初始化是顯示 Main_menu 界面,當(dāng)按鍵檢測(cè)有返回值(即有按鍵按下)時(shí),根據(jù)按下的按 鍵所代表的操作跳轉(zhuǎn)到指定的狀態(tài)。

例如:按下 Up 或者是 down 時(shí),只是在 Main_menu 界面內(nèi)高亮顯示不同區(qū)域; 按下 Enter 時(shí),則要根據(jù)原來(lái)按下的 Up down 鍵來(lái)選需要跳轉(zhuǎn)的方向

假設(shè)在按下 Enter 之前僅按下一次 down , key_v 的值為 2key_v 值默認(rèn)為 1,默認(rèn)選中子菜 單的第一項(xiàng),就跳轉(zhuǎn)為 Sub_menu2 界面。

注:也可以自己任定。key_v 的值,第一級(jí)(0-10,第二級(jí) 100-150,三級(jí) 1000-1100
方便寫程序。

按下 Esc 鍵時(shí),為從子菜單返回到上一級(jí)菜單,如果已經(jīng)是主菜單了則返回的還是主菜單。 狀態(tài)機(jī),只有發(fā)生一次有效的按鍵,狀態(tài)才會(huì)發(fā)生一次跳轉(zhuǎn)。而且,僅當(dāng) Enter Esc 鍵按下時(shí)會(huì)
切換界面。

級(jí)。統(tǒng)過(guò)來(lái)實(shí)現(xiàn), 最終根據(jù)鍵盤返回的鍵值選擇下一狀態(tài)。

結(jié)語(yǔ) 多級(jí)菜單的實(shí)現(xiàn)方式具有很強(qiáng)的實(shí)用性。程序的本質(zhì)是數(shù)組,與函數(shù)指針的組合應(yīng)用。
在芯片中只有二進(jìn)制碼,沒(méi)有什么結(jié)構(gòu)圖,指針,狀態(tài)圖。 同一程序可畫結(jié)構(gòu)圖來(lái)理解, 同一程序可畫狀態(tài)圖來(lái)理解。



以上的Word格式文檔51黑下載地址:
單片機(jī)多級(jí)菜單編程的理解.zip (504.08 KB, 下載次數(shù): 565)



作者: 經(jīng)緯    時(shí)間: 2018-11-13 20:25
謝謝分享
作者: wangsheng1997    時(shí)間: 2018-12-18 20:28
很不錯(cuò)。
作者: wangsheng1997    時(shí)間: 2018-12-18 20:30
可以下載嗎!
作者: wangpan04321    時(shí)間: 2019-5-29 10:13
感謝分享
作者: catking3119    時(shí)間: 2019-6-23 21:24
感謝樓主分享,但是附件是此篇文章PDF版本,讓我有點(diǎn)失望啊
作者: hilam    時(shí)間: 2019-10-4 10:24
資料不錯(cuò),但假如我的子菜單名稱是不固定的呢,例如一級(jí)菜單第二項(xiàng)是設(shè)置,第二級(jí)菜單是電機(jī)PID參數(shù),要求在菜單中實(shí)時(shí)顯示PID變化 參數(shù),這個(gè)框架應(yīng)該怎樣修改?
作者: ygflsa    時(shí)間: 2019-11-23 15:58
看不懂這個(gè)怎么執(zhí)行的
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機(jī)畫面

作者: ygflsa    時(shí)間: 2019-12-1 13:07
下載什么是沒(méi)有.還口我10黑幣
作者: jifengjianwu    時(shí)間: 2020-1-15 09:46
謝謝樓主分享
作者: jifengjianwu    時(shí)間: 2020-5-4 19:36
謝謝分享
作者: 布萊克先生    時(shí)間: 2020-9-7 15:24
感謝樓主的解答
作者: 紫色的云    時(shí)間: 2020-12-12 10:56
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者: 西點(diǎn)鐘靈毓秀    時(shí)間: 2021-10-22 15:09
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者: n_n    時(shí)間: 2021-12-6 16:04
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
作者: 993347045    時(shí)間: 2022-3-15 10:25
感謝分享,共同進(jìn)步
作者: 飛揚(yáng)1023    時(shí)間: 2022-10-17 15:40
感謝分享,共同進(jìn)步
作者: fangbolin    時(shí)間: 2023-7-19 16:21
很好的思路




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1