在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于狀態(tài)機的LCD多級菜單設計方案

            基于狀態(tài)機的LCD多級菜單設計方案

            作者: 時間:2017-10-21 來源:網(wǎng)絡 收藏

              1 概述

            本文引用地址:http://www.biyoush.com/article/201710/367067.htm

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

              2 多級菜單的結構

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

              

              圖1 多級菜單的結構圖

              3 多級菜單的程序設計

              3.1 循環(huán)方式

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

              將所有需要顯示的界面其所對應的執(zhí)行函數(shù)和按鍵索引號以結構體的形式列表存儲。具體實現(xiàn)如下:

              typedef struct{

              uchardown_index;

              ucharup_index;

              ucharenter_index;

              ucharesc_index;

              void (*operate)();

              }Key_index_struct;

              假設菜單分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ù)按鍵按下的類型,返回在當前界面下其所對應的跳轉索引號,并執(zhí)行相應的函數(shù)。

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

              3.2 查詢方式

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

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

              菜單參數(shù)的結構體定義如下:

              typedef struct Lcd_menu_content{

              uchar *lpIcon;//顯示圖標

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

              uchar nTextCount; //菜單對應的文本信息的個數(shù)

              }Lcd_menu_content;

              每個界面對應一個節(jié)點,節(jié)點都定義成如下結構體的變量:

              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é)點只有一個父節(jié)點和若干個子節(jié)點。所以,對整個叉樹進行遍歷即可準確地查找到菜單界面所在的節(jié)點。

              結構體實現(xiàn)的鏈表如圖2所示。

              

              圖2 結構體鏈表

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

              3.3 方式

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

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

              

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

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

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

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

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

              

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

              

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

              結語

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



            評論


            相關推薦

            技術專區(qū)

            關閉