多級菜單編程的設計思路:
預先定義一個包含 6 個結構元素的結構體、5 個字符型和 1 個指針型。 第 1 個字符變量存放當前界面的索引號;
第 2 個字符變量存放按下“down(向下)”鍵時需要跳轉到的索引號; 第 3 個字符變量存放按下“up(向上)”鍵時需要跳轉到的索引號;
第 4 個字符變量存放按下“enter(進入)”鍵時需要跳轉的索引號; 第 5 個字符變量存放按下“esc(退出)”鍵時需要跳轉的索引號;
第 6 個變量為函數指針變量,存放當前索引號下需要執行的函數的入口地址。 將所有需要顯示的界面其所對應的執行函數和按鍵索引號以結構體的形式列表存儲。具體實現如下:
typedef struct
{
uchar index; //第 1 個,存放當前界面的索引號
uchar down_index; //第 2 個,按下“down(向下)”鍵時需要跳轉到的索引號 uchar up_index; //第 3 個,按下“up(向上)”鍵時需要跳轉到的索引號; uchar enter_index; //第 4 個,按下“enter(進入)”鍵時需要跳轉的索引號; uchar esc_index; //第 5 個當前索引號下需要執行 的函數的入口地址。 void (*operate)(); //第 6 個函數指針
}Key_index_struct;
假設菜單分 3 級,共 10 個界面,則有:
Key_index_struct const Key_tab[10]=
// |-----------> Index
// | |down(下)
// | | | up(上)
// | | | | Enter(確認)
// | | | | |Esc (退出)--->功能函數
// | | | | |
{ 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機畫面
{ {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)}, };
/****************************************************
索引號在結構圖中,讀者可以標上

/********************************************************
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)();//執行當前按鍵的操作
}
當微處理器掃描鍵盤檢測到有按鍵按下時,根據按鍵按下的類型,返回在當前界面下其 所對應的跳轉索引號,并執行相應的函數。
這段程序隱含一狀態機-----通過按不同的鍵改變狀態。

結構圖與這一段代碼可理解為狀態機。{1, 2, 3, 4, 0,(*sub_menu1)},這些數字代表 不同階段不同狀態的索引號。 按鍵按下表示在各個狀態之間跳轉。可理解為狀態機,然后根據按鍵掃描返回的鍵值,決定所要
跳轉的下一狀態。
系統啟動初始化是顯示 Main_menu 界面,當按鍵檢測有返回值(即有按鍵按下)時,根據按下的按 鍵所代表的操作跳轉到指定的狀態。
例如:按下 Up 或者是 down 鍵時,只是在 Main_menu 界面內高亮顯示不同區域; 按下 Enter 時,則要根據原來按下的 Up 和 down 鍵來選擇需要跳轉的方向。
假設在按下 Enter 之前僅按下一次 down 鍵,則 key_v 的值為 2(key_v 的值默認為 1,即默認選中子菜 單的第一項),就跳轉為 Sub_menu2 界面。
注:也可以自己任定。key_v 的值,第一級(0-10),第二級 100-150,第三級 1000-1100
方便寫程序。
按下 Esc 鍵時,為從子菜單返回到上一級菜單,如果已經是主菜單了則返回的還是主菜單。 狀態機,只有發生一次有效的按鍵,狀態才會發生一次跳轉。而且,僅當 Enter 和 Esc 鍵按下時,才會
切換界面。
多級菜單的程序流程。系統上電初始化后顯示主菜單,鍵盤掃描可以通過主程序用中斷掃描來實現, 最終根據鍵盤返回的鍵值選擇下一狀態。
結語 多級菜單的實現方式具有很強的實用性。程序的本質是數組,與函數指針的組合應用。
在芯片中只有二進制碼,沒有什么結構圖,指針,狀態圖。 同一程序可畫結構圖來理解, 同一程序可畫狀態圖來理解。
以上的Word格式文檔51黑下載地址:
單片機多級菜單編程的理解.zip
(504.08 KB, 下載次數: 565)
2018-11-2 09:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|