摘 要: 提出了一種基于ARM9嵌入式系統(tǒng)的LCD多級(jí)菜單結(jié)構(gòu)的實(shí)現(xiàn)方法,。本方法使用了鏈表數(shù)據(jù)結(jié)構(gòu)。它建立的菜單網(wǎng)狀模型具有結(jié)構(gòu)清晰,、擴(kuò)展性好,、便于維護(hù)的特點(diǎn)。根據(jù)應(yīng)用和嵌入式系統(tǒng)中液晶屏自身的特點(diǎn)提供了鎖屏與解鎖功能。
關(guān)鍵詞: ARM9,;人機(jī)交互界面,;多級(jí)菜單;鎖屏,;解鎖
嵌入式應(yīng)用系統(tǒng)中,,使用點(diǎn)陣式液晶屏作為人機(jī)交互的界面和使用鍵盤控制顯示的內(nèi)容已成為主流趨勢(shì)。但點(diǎn)陣式液晶屏顯示的內(nèi)容非常有限,,如何設(shè)計(jì)一個(gè)合理的結(jié)構(gòu)化菜單就成了嵌入式開發(fā)中非常關(guān)鍵的問題,。本文介紹了一種用鏈表表示菜單的樹形結(jié)構(gòu)。該方法使設(shè)計(jì)的菜單結(jié)構(gòu)清晰,、功能明確,、擴(kuò)展性好,易維護(hù),。
此外,,良好的菜單設(shè)計(jì)除包括基本的工作流程選擇外,還應(yīng)包括自動(dòng)鎖屏,、手動(dòng)鎖屏及解鎖的操作,。這樣可以延長LCD的使用壽命,起到保護(hù)LCD顯示屏的作用,。
下面以6個(gè)按鍵,、ARM芯片LPC3250和OCMJ2X10C_5液晶屏組成的系統(tǒng)為例,在C語言環(huán)境下進(jìn)行介紹,。
1 系統(tǒng)硬件總體框圖
本文設(shè)計(jì)了一個(gè)在ARM嵌入式平臺(tái)上實(shí)現(xiàn)LCD160×32多級(jí)菜單的電路,。采用LPC3250的ARM芯片為控制芯片,OCMJ2X10C_5液晶屏為顯示模塊,,采用鍵盤掃描作為輸入控制,。系統(tǒng)總體硬件框圖如圖1所示。
2 鍵盤掃描模塊
鎖屏和解鎖功能需區(qū)分按下系統(tǒng)鍵的時(shí)間長短,,鍵盤中斷輸入控制方式不易實(shí)現(xiàn)這種區(qū)分,。但因鍵盤掃描有一個(gè)合理的時(shí)間閾值,從而容易實(shí)現(xiàn)這種區(qū)分,。故本文采用鍵盤掃描作為輸入控制,,其電路原理圖如圖2所示。
3 點(diǎn)陣式液晶模塊
本文中系統(tǒng)采用160×32點(diǎn)陣液晶屏[1],,可顯示16×16點(diǎn)陣的漢字2行10列,。它還可顯示字母和數(shù)字,并且提供了多功能指令,。本文中液晶屏和CPU之間采用串行連接方式[2],,其電路原理圖如圖3所示。
4 基于鏈表的網(wǎng)狀菜單模型
本文采用鏈表法[3]將每個(gè)菜單抽象成統(tǒng)一的對(duì)象,用面向?qū)ο蟮乃枷朐O(shè)計(jì)菜單結(jié)構(gòu),。每個(gè)對(duì)象節(jié)點(diǎn)需儲(chǔ)存自己的基本屬性及其父節(jié)點(diǎn),、第一個(gè)子節(jié)點(diǎn)和左右兄弟節(jié)點(diǎn)的位置。本文以三級(jí)菜單為例,,基于C語言用鏈表結(jié)構(gòu)來完成對(duì)菜單樹的設(shè)計(jì),,通過“上”、“下”,、“左”,、“右”、“確認(rèn)”,、“返回”6個(gè)按鍵實(shí)現(xiàn)對(duì)菜單的選擇,。
鏈表法實(shí)現(xiàn)多級(jí)菜單的顯示,首先建立一個(gè)結(jié)構(gòu)體,,定義結(jié)構(gòu)體變量,。本文中結(jié)構(gòu)體的C語言源代碼如下:
typedef struct MENU_STRUCT{
INT8U name[LCD_WIDTH_IN_HALF_WORD];
INT8U value[LCD_WIDTH_IN_HALF_WORD],;
INT32S value_PreIdx,;/*保存value上一個(gè)值*/
INT32S value_CurIdx;/*保存value當(dāng)前值*/
INT8U value_addr,;/*menu在LCD屏上的顯示位置*/
INT8U idx[8],;/*菜單索引號(hào)*/
pfMenu pfHook;/*菜單響應(yīng)函數(shù)*/
pfMenu pfDisp,;/*菜單顯示函數(shù)*/
struct MENU_STRUCT*parent,;/*菜單的上一級(jí)菜單*/
struct MENU_STRUCT*firstchild;
/*菜單的第一個(gè)子菜單*/
struct MENU_STRUCT*nextsiling,;
/*菜單的下一個(gè)兄弟菜單*/
struct MENU_STRUCT*presiling,;
/*菜單的前一個(gè)兄弟菜單*/
struct MENU_STRUCT*nextNode;
/*用于菜單數(shù)組的管理*/
}*pMENU_STRUCT,;
結(jié)構(gòu)體指針parent,、firstchild、nextsiling,、presiling和nextNode管理一段存儲(chǔ)菜單項(xiàng)的內(nèi)存空間,,它們通過鏈表的方式建立起菜單的網(wǎng)狀結(jié)構(gòu),便于菜單項(xiàng)的刪除,、擴(kuò)展和維護(hù),。通過鏈表結(jié)構(gòu)可由當(dāng)前菜單確定它的父菜單及第一個(gè)兄弟菜單,從而查找到當(dāng)前菜單所在的菜單項(xiàng)并在液晶屏上顯示,。每層的菜單結(jié)構(gòu)模型如圖4所示。
5 菜單響應(yīng)按鍵的基本事件
通過按鍵事件可對(duì)菜單進(jìn)行顯示、編輯,、進(jìn)入下級(jí)菜單,、返回上級(jí)菜單、鎖屏,、解鎖等操作,。在μC/OS-II系統(tǒng)中[4-5],按鍵任務(wù)模塊發(fā)送按鍵狀態(tài)消息,,LCD顯示任務(wù)模塊接收消息并做相應(yīng)的消息處理,。非鎖屏狀態(tài)程序流程圖如圖5所示。
6 液晶屏鎖屏與解鎖
嵌入式系統(tǒng)顯示屏離不開鎖屏與解鎖操作,。鎖屏狀態(tài)下按任意鍵可點(diǎn)亮LCD液晶屏并顯示解鎖提示信息,。通過手動(dòng)長按系統(tǒng)鍵或持續(xù)一段時(shí)間無按鍵操作,則進(jìn)入鎖屏狀態(tài),;鎖屏和解鎖的流程圖分別如圖6,、圖7所示。
本文以6個(gè)按鍵,、LPC3250的ARM芯片和LCD液晶屏為例,,在C語言環(huán)境下介紹了用鏈表設(shè)計(jì)菜單結(jié)構(gòu)和鎖屏解鎖的方法。該方法設(shè)計(jì)的菜單結(jié)構(gòu)清晰,,擴(kuò)展性好,,具有很好的可移植性,易維護(hù),,適用于嵌入式應(yīng)用系統(tǒng)開發(fā),。同時(shí),此方法也為其他應(yīng)用系統(tǒng)的多級(jí)菜單設(shè)計(jì)提供了參考和選擇,。
參考文獻(xiàn)
[1] 陸錚,,羅嘉.單片機(jī)C語言下LCD多級(jí)菜單的一種實(shí)現(xiàn)方法[J].工礦自動(dòng)化,2006(1):50-51.
[2] 林曉毅,,謝劍英.圖形點(diǎn)陣式液晶結(jié)構(gòu)化菜單設(shè)計(jì)與實(shí)現(xiàn)[J].控制工程,,2007,14(4):391-394.
[3] 嚴(yán)蔚敏,,吳偉民.數(shù)據(jù)結(jié)構(gòu)(第2版)[M].北京:清華大學(xué)出版社,,1992.
[4] 高俊堯,趙佳.基于μC/OS-II的顯示控制系統(tǒng)開發(fā)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,,2009(12):43-45.
[5] JEAN LABROSSE J.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II(第2版)[M].邵貝貝,,等譯.北京:北京航空航天大學(xué)出版社,2003.