www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]傳統(tǒng)的LCD顯示模式總是不加選擇地顯示所有監(jiān)控的信息,在監(jiān)控的信息量非常龐大時會導(dǎo)致不能及時顯示用戶所需求的信息。多級菜單顯示則是將信息分類顯示的一種顯示方式,該方式根據(jù)用戶的選擇,對顯示信息加以篩選并分級顯示,這樣既保證用戶獲取其所需的信息,又能保障信息顯示的實時性。

1 概述

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

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

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

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

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

3.1 循環(huán)方式

循環(huán)方式的設(shè)計思路:預(yù)先定義一個包含6個結(jié)構(gòu)元素的結(jié)構(gòu)體、5個字符型和1個指針型。第1個字符變量存放當前界面的索引號;第2個字符變量存放按下“down(向下)”鍵時需要跳轉(zhuǎn)到的索引號;第3個字符變量存放按下“up(向上)”鍵時需要跳轉(zhuǎn)到的索引號;第4個字符變量存放按下“enter(進入)”鍵時需要跳轉(zhuǎn)的索引號;第5個字符變量存放按下“esc(退出)”鍵時需要跳轉(zhuǎn)的索引號;第6個變量為函數(shù)指針變量,存放當前索引號下需要執(zhí)行的函數(shù)的入口地址。

將所有需要顯示的界面其所對應(yīng)的執(zhí)行函數(shù)和按鍵索引號以結(jié)構(gòu)體的形式列表存儲。具體實現(xiàn)如下:
typedef struct{
uchardown_index;
ucharup_index;
ucharenter_index;
ucharesc_index;
void (*operate)();
}Key_index_struct;

假設(shè)菜單分3級,共10個界面,則有:
Key_index_struct const Key_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)},
};
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í)行當前按鍵的操作
}

當微處理器掃描鍵盤檢測到有按鍵按下時,根據(jù)按鍵按下的類型,返回在當前界面下其所對應(yīng)的跳轉(zhuǎn)索引號,并執(zhí)行相應(yīng)的函數(shù)。

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

3.2 查詢方式

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

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

菜單參數(shù)的結(jié)構(gòu)體定義如下:
typedef struct Lcd_menu_content{
uchar *lpIcon;//顯示圖標
uchar *lpText;//顯示文本信息
uchar nTextCount; //菜單對應(yīng)的文本信息的個數(shù)
}Lcd_menu_content;

每個界面對應(yīng)一個節(jié)點,節(jié)點都定義成如下結(jié)構(gòu)體的變量:
typedef struct Lcd_menu{
struct Lcd_menu*lpfather;//父級
struct Lcd_menu*lpson;//大兒子
uchar nSonCount;//父級的兒子個數(shù)
Lcd_menu_content lpIconAndText;
uchar Flag_return;//返回標志
void (*operate)();//處理函數(shù)入口地址
}Lcd_menu;

由圖1可知,多級菜單的拓撲結(jié)構(gòu)為樹型拓撲結(jié)構(gòu),即每一個節(jié)點只有一個父節(jié)點和若干個子節(jié)點。所以,對整個叉樹進行遍歷即可準確地查找到菜單界面所在的節(jié)點。
結(jié)構(gòu)體實現(xiàn)的鏈表如圖2所示。

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

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

3.3 狀態(tài)機方式

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

如圖3所示,系統(tǒng)啟動初始化是顯示Main_menu界面,當按鍵檢測有返回值(即有按鍵按下)時,根據(jù)按下的按鍵所代表的操作跳轉(zhuǎn)到指定的狀態(tài)。例如:按下Up或者是down鍵時,只是在Main_menu界面內(nèi)高亮顯示不同區(qū)域;按下Enter時,則要根據(jù)原來按下的Up和down鍵來選擇需要跳轉(zhuǎn)的方向,假設(shè)在按下Enter之前僅按下一次down鍵,則key_v的值為2(key_v的值默認為1,即默認選中子菜單的第一項),就跳轉(zhuǎn)為Sub_menu2界面;按下Esc鍵時,為從子菜單返回到上一級菜單,如果已經(jīng)是主菜單了則返回的還是主菜單。

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

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

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

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

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

圖4 多級菜單的程序流程圖


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

結(jié)語

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

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉