找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 18239|回復(fù): 17
收起左側(cè)

單片機(jī)多級(jí)菜單編程的設(shè)計(jì)思路與理解

  [復(fù)制鏈接]
ID:90762 發(fā)表于 2018-11-2 09:10 | 顯示全部樓層 |閱讀模式
多級(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ī)-----通過不同的鍵改變狀態(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ù)原來按下的 Up down 鍵來選需要跳轉(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),實(shí)現(xiàn), 最終根據(jù)鍵盤返回的鍵值選擇下一狀態(tài)。

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



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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:138032 發(fā)表于 2018-11-13 20:25 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:449279 發(fā)表于 2018-12-18 20:28 | 顯示全部樓層
很不錯(cuò)。
回復(fù)

使用道具 舉報(bào)

ID:449279 發(fā)表于 2018-12-18 20:30 | 顯示全部樓層
可以下載嗎!
回復(fù)

使用道具 舉報(bào)

ID:338959 發(fā)表于 2019-5-29 10:13 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:568315 發(fā)表于 2019-6-23 21:24 | 顯示全部樓層
感謝樓主分享,但是附件是此篇文章PDF版本,讓我有點(diǎn)失望啊
回復(fù)

使用道具 舉報(bào)

ID:96552 發(fā)表于 2019-10-4 10:24 | 顯示全部樓層
資料不錯(cuò),但假如我的子菜單名稱是不固定的呢,例如一級(jí)菜單第二項(xiàng)是設(shè)置,第二級(jí)菜單是電機(jī)PID參數(shù),要求在菜單中實(shí)時(shí)顯示PID變化 參數(shù),這個(gè)框架應(yīng)該怎樣修改?
回復(fù)

使用道具 舉報(bào)

ID:392914 發(fā)表于 2019-11-23 15:58 | 顯示全部樓層
看不懂這個(gè)怎么執(zhí)行的
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機(jī)畫面
回復(fù)

使用道具 舉報(bào)

ID:392914 發(fā)表于 2019-12-1 13:07 | 顯示全部樓層
下載什么是沒有.還口我10黑幣
回復(fù)

使用道具 舉報(bào)

ID:412814 發(fā)表于 2020-1-15 09:46 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:412814 發(fā)表于 2020-5-4 19:36 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:292460 發(fā)表于 2020-9-7 15:24 | 顯示全部樓層
感謝樓主的解答
回復(fù)

使用道具 舉報(bào)

ID:156220 發(fā)表于 2020-12-12 10:56 | 顯示全部樓層
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
回復(fù)

使用道具 舉報(bào)

ID:87000 發(fā)表于 2021-10-22 15:09 | 顯示全部樓層
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
回復(fù)

使用道具 舉報(bào)

ID:610005 發(fā)表于 2021-12-6 16:04 | 顯示全部樓層
謝謝樓主的分享,最近正在學(xué)習(xí)多級(jí)菜單的編寫
回復(fù)

使用道具 舉報(bào)

ID:246744 發(fā)表于 2022-3-15 10:25 | 顯示全部樓層
感謝分享,共同進(jìn)步
回復(fù)

使用道具 舉報(bào)

ID:1048017 發(fā)表于 2022-10-17 15:40 | 顯示全部樓層
感謝分享,共同進(jìn)步
回復(fù)

使用道具 舉報(bào)

ID:1088987 發(fā)表于 2023-7-19 16:21 | 顯示全部樓層
很好的思路
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表