一種單片機(jī)多級(jí)菜單的模塊化設(shè)計(jì)方法
引言
在單片機(jī)設(shè)計(jì)中,往往需要在顯示屏上顯示多級(jí)操作菜單,每級(jí)菜單都有一些菜單項(xiàng)和對(duì)應(yīng)的按鍵操作,以及為響應(yīng)各種操作而執(zhí)行的后續(xù)處理程序。參考文獻(xiàn)以函數(shù)指針為結(jié)構(gòu)元素,把整個(gè)菜單結(jié)構(gòu)拉伸成一個(gè)結(jié)構(gòu)數(shù)組,內(nèi)部包含了全部菜單項(xiàng)。這種方法沒(méi)有將菜單項(xiàng)數(shù)據(jù)與功能函數(shù)分開(kāi)設(shè)計(jì),而把菜單項(xiàng)數(shù)據(jù)寫(xiě)在功能函數(shù)中,當(dāng)菜單項(xiàng)數(shù)據(jù)需要改變時(shí),必須修改功能函數(shù),這在很大程度上限制了程序的通用性,不利于程序的維護(hù)。參考文獻(xiàn)在前者的基礎(chǔ)上略加改進(jìn),在原結(jié)構(gòu)體中增加了菜單項(xiàng)顯示文字和按鍵復(fù)用標(biāo)識(shí),這使得結(jié)構(gòu)體較為龐大,且菜單項(xiàng)的文字內(nèi)容非常固定,保存在EEPROM中,無(wú)法靈活改變顯示內(nèi)容和位置。參考文獻(xiàn)引入Windows系統(tǒng)下的窗口和消息機(jī)制實(shí)現(xiàn)多級(jí)菜單設(shè)計(jì),該方法需要維護(hù)堆棧、消息隊(duì)列和窗口定時(shí)器等,設(shè)計(jì)過(guò)于復(fù)雜。
本文旨在提供一個(gè)輕量級(jí)的單片機(jī)多級(jí)菜單實(shí)現(xiàn)方法,以較少的系統(tǒng)資源消耗和簡(jiǎn)單方便的方法完成菜單設(shè)計(jì)??紤]到菜單程序需要具備3個(gè)基本要素:一是每個(gè)菜單窗口要顯示的內(nèi)容;二是每個(gè)窗口對(duì)應(yīng)的按鍵定義與響應(yīng);三是窗口內(nèi)菜單項(xiàng)之間切換和窗口之間的切換機(jī)制。因此,將菜單分為菜單窗口模塊和鍵盤(pán)處理模塊兩部分,獨(dú)立進(jìn)行設(shè)計(jì)。
1 菜單窗口模塊設(shè)計(jì)
菜單窗口模塊主要功能是按照菜單窗口切換機(jī)制,實(shí)時(shí)完成窗口的顯示控制。
1.1 菜單窗口切換機(jī)制
菜單窗口切換機(jī)制包括兩點(diǎn):一是不同窗口之間切換效果的實(shí)現(xiàn);二是窗口內(nèi)的同級(jí)菜單項(xiàng)之間滾動(dòng)切換效果的實(shí)現(xiàn)。為實(shí)現(xiàn)上述功能,定義了兩個(gè)結(jié)構(gòu)體MenuState和MenuItems。MenuState定義如下:
MenuState是一個(gè)與窗口跳轉(zhuǎn)和窗口顯示有關(guān)的結(jié)構(gòu)體數(shù)組,用于全局調(diào)度各窗口之間的切換。其中,CurIndex是窗口的索引值,用來(lái)標(biāo)識(shí)當(dāng)前窗口。UpIndex、DnIndex、BackIndex用來(lái)標(biāo)識(shí)當(dāng)有“上頁(yè)”、“下頁(yè)”、“返回”按鍵操作時(shí),程序應(yīng)轉(zhuǎn)向的窗口。其取值為255時(shí),表示無(wú)轉(zhuǎn)向窗口,取值在0~254時(shí)表示要轉(zhuǎn)向的窗口索引,因此本設(shè)計(jì)可支持255個(gè)菜單窗口,足以滿(mǎn)足工程應(yīng)用需要。CurOperate是函數(shù)指針,用來(lái)指向當(dāng)顯示當(dāng)前窗口時(shí),應(yīng)執(zhí)行的窗口顯示控制程序,以實(shí)現(xiàn)窗口的顯示。
MenuItems是一個(gè)菜單項(xiàng)結(jié)構(gòu)體,用以保存當(dāng)前窗口的全部菜單項(xiàng)的顯示位置和內(nèi)容,這個(gè)結(jié)構(gòu)體的內(nèi)容是隨著窗口的切換,在新窗口初始化過(guò)程中被更新的。這樣就滿(mǎn)足了窗口的切換和菜單項(xiàng)之間反顯滾動(dòng)的需要。由于只保存與當(dāng)前窗口有關(guān)的菜單項(xiàng),因此,該結(jié)構(gòu)體的系統(tǒng)資源消耗很小。
Items包含了當(dāng)前窗口內(nèi)的所有菜單項(xiàng),考慮到有的菜單項(xiàng)是沒(méi)有轉(zhuǎn)向窗口的,所以對(duì)應(yīng)這種菜單項(xiàng)設(shè)置該值為255。當(dāng)顯示一個(gè)窗口時(shí),Items會(huì)被填入當(dāng)前窗口的菜單項(xiàng)信息,并且填寫(xiě)時(shí)是按照菜單項(xiàng)的先后順序依次構(gòu)建的。這樣當(dāng)有“上移”、“下移”按鍵操作時(shí),就可迅速找到目標(biāo)行,并反顯該行。
1.2 菜單窗口顯示控制
窗口顯示部分是將每一個(gè)菜單窗口都以一個(gè)獨(dú)立命名的函數(shù)形式封裝,函數(shù)里包括對(duì)Items進(jìn)行賦值,在顯示屏指定位置顯示當(dāng)前窗口的菜單項(xiàng),以及根據(jù)需要完成畫(huà)點(diǎn)、畫(huà)線、畫(huà)按鈕等繪圖操作。這些函數(shù)彼此功能獨(dú)立,分別對(duì)應(yīng)不同的菜單窗口,僅在窗口切換時(shí)賦予CurOperate即可,因此非常適合多人合作開(kāi)發(fā)。
需要說(shuō)明的是,菜單窗口的顯示控制是基于顯示屏的,工程中常用的是TFT屏或點(diǎn)陣液晶屏,使用時(shí)需要實(shí)現(xiàn)顯示屏的驅(qū)動(dòng)程序,對(duì)屏進(jìn)行初始化、讀、寫(xiě)等操作,由于不是本文重點(diǎn),因此這部分內(nèi)容略過(guò)。
評(píng)論