|
多級(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 的值為 2(key_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)
2018-11-2 09:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|