基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)_第1頁(yè)
基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)_第2頁(yè)
基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)_第3頁(yè)
基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)_第4頁(yè)
基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)2012年12卷2期73-75頁(yè).經(jīng)驗(yàn)交流返回目錄

基于狀態(tài)機(jī)的LCD多級(jí)菜單設(shè)計(jì)賈志成,程敏,宋濤,王彥,康志龍,郭艷菊

1.河北工業(yè)大學(xué)信息工程學(xué)院,天津300401;2.天津職業(yè)技術(shù)大學(xué)1概述

液晶顯示器(LiquidCrystalDisplay,LCD)由于其體積和功耗等因素,非常適合嵌入式環(huán)境的使用。近年來(lái),隨著微處理器性能的提高,嵌入式系統(tǒng)實(shí)現(xiàn)的功能越來(lái)越強(qiáng)大,產(chǎn)生的數(shù)據(jù)量也越來(lái)越大。相對(duì)應(yīng)地,需要顯示的數(shù)據(jù)量也隨之增大。嵌入式環(huán)境下使用LCD顯示器,由于條件限制,體積較小,且顯示的內(nèi)容有限。而且,傳統(tǒng)的LCD顯示模式總是不加選擇地顯示所有監(jiān)控的信息,在監(jiān)控的信息量非常龐大時(shí)會(huì)導(dǎo)致不能及時(shí)顯示用戶所需求的信息。多級(jí)菜單顯示則是將信息分類(lèi)顯示的一種顯示方式,該方式根據(jù)用戶的選擇,對(duì)顯示信息加以篩選并分級(jí)顯示,這樣既保證用戶獲取其所需的信息,又能保障信息顯示的實(shí)時(shí)性。

2多級(jí)菜單的結(jié)構(gòu)

設(shè)計(jì)多級(jí)菜單的目的在于將需要顯示的信息分門(mén)歸類(lèi),方便用戶篩選。所以在設(shè)計(jì)菜單時(shí)需要根據(jù)整個(gè)系統(tǒng)的功能和要求來(lái)設(shè)定菜單的級(jí)數(shù),以及各級(jí)子菜單的個(gè)數(shù)。整個(gè)多級(jí)菜單的拓?fù)浣Y(jié)構(gòu)為樹(shù)型結(jié)構(gòu),主菜單為根節(jié)點(diǎn),子菜單為枝節(jié)點(diǎn),最后一級(jí)菜單為葉節(jié)點(diǎn),如圖1所示。

圖1多級(jí)菜單的結(jié)構(gòu)圖

3多級(jí)菜單的程序設(shè)計(jì)

3.1循環(huán)方式

循環(huán)方式的設(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)如下:

typedefstruct{

uchardown_index;

ucharup_index;

ucharenter_index;

ucharesc_index;

void(*operate)();

}Key_index_struct;

假設(shè)菜單分3級(jí),共10個(gè)界面,則有:

Key_index_structconstKey_tab[10]={

{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)},

};

voidLcd_display(void){

switch(Key_status){

caseenter:

Key_fun=Key_tab[Key_fun].enter_index;

break;

casedown:

Key_fun=Key_tab[Key_fun].down_index;

break;

caseup:

Key_fun=Key_tab[Key_fun].up_index;

break;

caseesc:

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)微處理器掃描鍵盤(pán)檢測(cè)到有按鍵按下時(shí),根據(jù)按鍵按下的類(lèi)型,返回在當(dāng)前界面下其所對(duì)應(yīng)的跳轉(zhuǎn)索引號(hào),并執(zhí)行相應(yīng)的函數(shù)。

由于每個(gè)界面的繪制都是由一個(gè)獨(dú)立函數(shù)實(shí)現(xiàn)的,從循環(huán)方式的實(shí)現(xiàn)過(guò)程中發(fā)現(xiàn),每發(fā)生一次按鍵按下操作都需要重新繪制整個(gè)屏幕。如果核心處理器是低速主頻的處理器,在界面切換的時(shí)候會(huì)閃爍。而且,每一個(gè)界面都有固定不變的索引號(hào),在增加或刪除界面的時(shí)候需要重新修改整個(gè)列表,降低了程序的可移植性。

3.2查詢方式

查詢方式是通過(guò)結(jié)構(gòu)體對(duì)自身的遞歸調(diào)用實(shí)現(xiàn)菜單的多級(jí)嵌套。

結(jié)構(gòu)體通過(guò)對(duì)自身的兩次調(diào)用構(gòu)建雙向列表。一個(gè)菜單界面即為一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)的前驅(qū)和后繼分別存放其父節(jié)點(diǎn)和子節(jié)點(diǎn)的入口地址。

菜單參數(shù)的結(jié)構(gòu)體定義如下:

typedefstructLcd_menu_content{

uchar*lpIcon;//顯示圖標(biāo)

uchar*lpText;//顯示文本信息

ucharnTextCount;//菜單對(duì)應(yīng)的文本信息的個(gè)數(shù)

}Lcd_menu_content;

每個(gè)界面對(duì)應(yīng)一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)都定義成如下結(jié)構(gòu)體的變量:

typedefstructLcd_menu{

structLcd_menu*lpfather;//父級(jí)

structLcd_menu*lpson;//大兒子

ucharnSonCount;//父級(jí)的兒子個(gè)數(shù)

Lcd_menu_contentlpIconAndText;

ucharFlag_return;//返回標(biāo)志

void

(*operate)();//處理函數(shù)入口地址

}Lcd_menu;

由圖1可知,多級(jí)菜單的拓?fù)浣Y(jié)構(gòu)為樹(shù)型拓?fù)浣Y(jié)構(gòu),即每一個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn)和若干個(gè)子節(jié)點(diǎn)。所以,對(duì)整個(gè)叉樹(shù)進(jìn)行遍歷即可準(zhǔn)確地查找到菜單界面所在的節(jié)點(diǎn)。

結(jié)構(gòu)體實(shí)現(xiàn)的鏈表如圖2所示。

圖2結(jié)構(gòu)體鏈表

查詢方式與循環(huán)方式相比,由于減少了查表次數(shù),因而改善了MPU的效率;但查詢方式占用MPU處理時(shí)間過(guò)長(zhǎng),不適應(yīng)需要高速處理數(shù)據(jù)的應(yīng)用。而且,在查詢方式中增加或刪除節(jié)點(diǎn)對(duì)程序改動(dòng)較大,也不適合移植。

3.3狀態(tài)機(jī)方式

狀態(tài)機(jī)是由事件驅(qū)動(dòng),在各個(gè)狀態(tài)之間跳轉(zhuǎn)。采用狀態(tài)機(jī)方式時(shí),只需要提供驅(qū)動(dòng)事件(在此設(shè)計(jì)中驅(qū)動(dòng)事件為有效的按鍵按下),然后根據(jù)按鍵掃描返回的鍵值,決定所要跳轉(zhuǎn)的下一狀態(tài)。

如圖3所示,系統(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的值為2(key_v的值默認(rèn)為1,即默認(rèn)選中子菜單的第一項(xiàng)),就跳轉(zhuǎn)為Sub_menu2界面;按下Esc鍵時(shí),為從子菜單返回到上一級(jí)菜單,如果已經(jīng)是主菜單了則返回的還是主菜單。

圖3多級(jí)菜單的狀態(tài)圖

由于使用的是狀態(tài)機(jī)的方式,只有發(fā)生一次有效的按鍵,狀態(tài)才會(huì)發(fā)生一次跳轉(zhuǎn)。而且,僅當(dāng)Enter和Esc鍵按下時(shí),才會(huì)切換界面。所以即便是在高速M(fèi)PU應(yīng)用中,也不會(huì)出現(xiàn)屏幕閃爍的效果。

從圖3中可以看出,當(dāng)要發(fā)生狀態(tài)跳轉(zhuǎn)時(shí),目的狀態(tài)只能是當(dāng)前狀態(tài)幾個(gè)分支預(yù)測(cè)中的一個(gè),從而不需要遍歷整個(gè)列表,能夠適應(yīng)高速數(shù)據(jù)處理的場(chǎng)合。

多級(jí)菜單的程序流程如圖4所示。系統(tǒng)上電初始化后顯示主菜單,鍵盤(pán)掃描可以通過(guò)主程序中循環(huán)查詢或者中斷掃描來(lái)實(shí)現(xiàn),最終根據(jù)鍵盤(pán)返回的鍵值選擇下一狀態(tài)。

圖5為基于狀態(tài)機(jī)的多級(jí)菜單的實(shí)現(xiàn)。

圖4多級(jí)菜單的程序流程圖

圖5多級(jí)菜單的實(shí)現(xiàn)

結(jié)語(yǔ)

以上三種多級(jí)菜單的實(shí)現(xiàn)方式均具有很強(qiáng)的實(shí)用性。循環(huán)方式和查詢方式下,程序結(jié)構(gòu)簡(jiǎn)單易用,而狀態(tài)機(jī)方式下程序可移植性強(qiáng)。狀態(tài)機(jī)程序設(shè)計(jì)不僅可以用在人機(jī)接口設(shè)計(jì)中,還可用于嵌入式通信協(xié)議等其他場(chǎng)合中。

參考文獻(xiàn)

[1]胡漢才.單片機(jī)原理及其接口技術(shù)[M].北京:清華大學(xué)出版社,1996:1415.

[2]陸錚,羅嘉.單片機(jī)C語(yǔ)言下LCD多級(jí)菜單的一種實(shí)現(xiàn)方法[J].工礦自動(dòng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論