




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選文檔單片機多級菜單編程實現(xiàn)單片機多級菜單編程實現(xiàn)(ZT)建立一個樹狀的菜單結(jié)構(gòu),用鏈表實現(xiàn) 鏈表中包含:1、指向同級左右菜單和指向父菜單、子菜單的四個菜單結(jié)構(gòu)體指針;2、進入該菜單時需要執(zhí)行的初始化函數(shù)指針3、退出該菜單時需要執(zhí)行的結(jié)束函數(shù)指針4、該菜單內(nèi)的按鍵處理函數(shù)指針數(shù)組的指針操作菜單模塊需要的按鍵操作有:左、右、確認、退出。采用這種辦法,可以方便的添加或刪減菜單。并且只需要在其頭文件中修改初始變量就可以實現(xiàn),完全無須修改C文件中的任何函數(shù)。具體結(jié)構(gòu)定義 我的定義,做個參考:#define MENU_HLP_EN /菜單幫助信息使能typedef structvoid (*pMenu
2、TaskInit)(void); /指向菜單任務(wù)初始化函數(shù)的指針void (*pMenuTaskEnd)(void); /指向菜單任務(wù)結(jié)束函數(shù)的指針MENU_TASK_TYP;typedef struct MenuTypINT8U *MenuName; /菜單名稱字符串WORK_MOD WorkMod; /工作狀態(tài)編號MENU_TASK_TYP *pMenuTask; /指向菜單任務(wù)的指針void (*pTaskKeyDeal)(void); /指向菜單任務(wù)按鍵處理函數(shù)數(shù)組的指針#ifdef MENU_HLP_ENINT8U *MenuHlp; /菜單幫助字符串#endifstruct Men
3、uTyp *pParent; /指向上層菜單的指針struct MenuTyp *pChild; /指向子菜單的指針struct MenuTyp *pRight; /指向右菜單的指針struct MenuTyp *pLeft; /指向左菜單的指針MENU_TYP;我根據(jù)網(wǎng)上的資料做的一個菜單: /*菜單數(shù)據(jù)結(jié)構(gòu)*/struct KeyTabStructuint8 MenuIndex; /當(dāng)前狀態(tài)索引號uint8 MaxItems; /本級菜單最大條目數(shù)uint8 ShowLevel; /菜單顯示內(nèi)容uint8 PressOk; /按下"回車"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8
4、PressEsc; /按下"返回"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8 PressDown; /按下"向下"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8 PressUp; /按下"向上"鍵時轉(zhuǎn)向的狀態(tài)索引號void (*CurrentOperate)(); /當(dāng)前狀態(tài)應(yīng)該執(zhí)行的功能操作;uint8 MenuID; /菜單ID號uint8 MenuNextID; /下級菜單ID號/CurMenuID=本菜單ID/MaxMenuItem=同級菜單最大項數(shù)/OkMenuID=子菜單層所對應(yīng)的菜單ID,ID=999為菜單已經(jīng)到底了/EscMenuID=父菜單層所
5、對應(yīng)的菜單ID,ID=999為菜單已經(jīng)到頂了/DownMenuID=弟菜單層所對應(yīng)的菜單ID,ID=999為菜單是獨生子/UpMenuID=兄菜單層所對應(yīng)的菜單ID,ID=999為菜單是獨生子/CurFunction=本菜單所對應(yīng)的菜單函數(shù)指針const struct KeyTabStruct KeyTabMAX_KEYTABSTRUCT_NUM=/CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunctionMENU_EDIT, 0, 0, MENU_DATA_VIEW,
6、 MENU_NO, MENU_NO, MENU_NO, *MenuEdit,MENU_DATA_VIEW, 3, 1, MENU_DATA_VIEW_FIRE, MENU_EDIT, MENU_SYS_EDIT, MENU_PRINT_DATA,*MenuEdit,MENU_DATA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_TROUBLE, MENU_STEP_FOLLOW, *MenuDataViewIn,MENU_DATA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_D
7、ATA_VIEW, MENU_DATA_VIEW_REPEAT, MENU_DATA_VIEW_FIRE, *MenuDataViewIn,MENU_DATA_VIEW_REPEAT, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_FACE_CHECK, MENU_DATA_VIEW_TROUBLE, *MenuDataViewIn,MENU_FACE_CHECK, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_STEP_FOLLOW, MENU_DATA_VIEW_REPEAT, *MenuFaceCheck,MEN
8、U_STEP_FOLLOW, 5, MENU_NO, MENU_NO, MENU_DATA_VIEW, MENU_DATA_VIEW_FIRE, MENU_FACE_CHECK,*MenuStepFollow,MENU_SYS_EDIT, 3, 2, MENU_SUM_SET, MENU_EDIT, MENU_PRINT_DATA, MENU_DATA_VIEW, *MenuEdit,MENU_SUM_SET, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULATE, MENU_TIME_SET, *MenuSumSet,MENU_EDIT
9、_INSULATE, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,*MenuEditInsulate,MENU_EDIT_HZ, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL, MENU_EDIT_INSULATE, *MenuEditHZ,MENU_LD_CONTROL, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, *MenuLDControl,MENU_LD_DELAY
10、, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET, MENU_LD_CONTROL, *MenuLDDelay,MENU_TIME_SET, 6, MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,*MenuTimeSet,MENU_PRINT_DATA, 3, 3, MENU_PRINT_DATA_FIRE, MENU_EDIT, MENU_DATA_VIEW, MENU_SYS_EDIT, *MenuEdit,MENU_PRINT_DATA_FIRE, 4, MEN
11、U_NO, MENU_NO, MENU_PRINT_DATA, MENU_PRINT_DATA_TROUBLE, MENU_PRINT_SET, *MenuPrintDataIn,MENU_PRINT_DATA_TROUBLE, 4, MENU_NO, MENU_NO, MENU_PRINT_DATA, MENU_PRINTER_CHECK, MENU_PRINT_DATA_FIRE, *MenuPrintDataIn,MENU_PRINTER_CHECK, 4, MENU_NO, MENU_NO, MENU_PRINT_DATA, MENU_PRINT_SET, MENU_PRINT_DAT
12、A_TROUBLE, *MenuPrintDataIn,MENU_PRINT_SET, 4, MENU_NO, MENU_NO, MENU_PRINT_DATA, MENU_PRINT_DATA_FIRE, MENU_PRINTER_CHECK, *MenuPrintSet,;/*編程菜單顯示數(shù)據(jù)*/const struct MenuDispData MenuEditShowMENU_MAX = MENU_NO , 0, 0, "選擇: 消音退出", /主菜單MENU_DATA_VIEW , 1, 6, "數(shù)據(jù)查看",MENU_SYS_EDIT , 2,
13、 6, "系統(tǒng)編程",MENU_PRINT_DATA , 3, 6, "數(shù)據(jù)打印",MENU_NO , 0, 0, "數(shù)據(jù)查看: 消音退出", /數(shù)據(jù)查看MENU_DATA_VIEW_FIRE , 1, 4, "火警",MENU_DATA_VIEW_TROUBLE, 2, 4, "故障",MENU_DATA_VIEW_REPEAT , 3, 4, "重碼",MENU_FACE_CHECK , 1,12, "面板檢測",MENU_STEP_FOLLOW ,
14、2,12, "單步跟蹤",MENU_NO , 0, 0, "系統(tǒng)編程: 消音退出", /系統(tǒng)編程MENU_SUM_SET , 1, 0, "容量設(shè)置",MENU_EDIT_INSULATE , 2, 0, "隔離點",MENU_EDIT_HZ , 3, 0, "漢字描述",MENU_LD_CONTROL , 1,12, "聯(lián)動控制",MENU_LD_DELAY , 2,12, "模塊延時",MENU_TIME_SET , 3,12, "時鐘調(diào)整&
15、quot;,MENU_NO , 0, 0, "數(shù)據(jù)打印: 消音退出", /數(shù)據(jù)打印MENU_PRINT_DATA_FIRE , 1, 0, "火警數(shù)據(jù)",MENU_PRINT_DATA_TROUBLE,2, 0, "故障數(shù)據(jù)",MENU_PRINTER_CHECK , 3, 0, "打印機自檢",MENU_PRINT_SET , 1,12, "打印設(shè)置", ;/*等待按鍵*/void WaitKey(void)uint32 time;time = RTCFlag;WhichKey = KEY_N
16、ONE;while(!EscFlag)if(RTCFlag - time >= EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE)KeySound(300); /按鍵音return;/*顯示多級菜單*/void MenuEdit()uint32 i,j=0;uint32 oldid;j = KeyTabMenuID.ShowLevel;if(WhichKey = KEY_ESC | WhichKey = KEY_OK)ClearScreen();for(i=0;i<KeyTabMenuNextID.MaxItems+1;i+)Show
17、String(MenuEditShowji.Lin,MenuEditShowji.Column,MenuEditShowji.Pdata,0); /初始化顯示oldid = 0; /沒有原先選擇的項elseif(WhichKey = KEY_UP)oldid = KeyTabMenuNextID.PressDown; elseoldid = KeyTabMenuNextID.PressUp; /指示原先的項for(i=1;i<KeyTabMenuNextID.MaxItems+1;i+)if(MenuEditShowji.Id = oldid)ShowString(MenuEditSho
18、wji.Lin,MenuEditShowji.Column,MenuEditShowji.Pdata,0); /正常顯示原先的項elseif(MenuEditShowji.Id = MenuNextID)ShowString(MenuEditShowji.Lin,MenuEditShowji.Column,MenuEditShowji.Pdata,1); /反顯當(dāng)前選擇的項 WhichKey = KEY_NONE; /*系統(tǒng)編程*/uint32 Edit(void) struct KeyTabStruct NowKeyTab; /指示當(dāng)前的菜單值uint32 escflag = FALSE;R
19、esetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTabMenuID;MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); /顯示主菜單do if(WhichKey = KEY_NONE)WaitKey(); /等待按鍵switch(WhichKey)case KEY_ESC : if(NowKeyTab.PressEsc != MENU_NO)MenuID = NowKeyTab.PressEsc;Me
20、nuNextID = NowKeyTab.MenuIndex;NowKeyTab = KeyTabMenuID;NowKeyTab.PressOk = MenuNextID;(*NowKeyTab.CurrentOperate)(); /顯示當(dāng)前菜單elseescflag = TRUE; /退出編程狀態(tài)break;case KEY_OK : if(NowKeyTab.PressOk != MENU_NO)MenuID = NowKeyTab.PressOk;NowKeyTab = KeyTabMenuID;MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); /執(zhí)行當(dāng)前按鍵的操作break;case KEY_UP : if(MenuNextID != MENU_NO) && (KeyTabMenuNextID.PressUp != MENU_NO)NowKeyTab.PressOk = KeyTabMenuNextID.PressUp;MenuNextID = KeyTabMenuNextID.PressUp;(*NowKeyTab.CurrentOperate)(); /執(zhí)行當(dāng)前按鍵的操作break;case KEY_DOWN: if(MenuN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西師范高等??茖W(xué)校《人體寄生蟲學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西工商學(xué)院《數(shù)字影像后期》2023-2024學(xué)年第二學(xué)期期末試卷
- 光伏建筑模塊化快速安裝技術(shù)企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 人造板制造創(chuàng)新創(chuàng)業(yè)項目商業(yè)計劃書
- 國際貿(mào)易法培訓(xùn)行業(yè)跨境出海項目商業(yè)計劃書
- 敏感肌保濕噴霧行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 會服上墻管理制度
- 會計印鑒管理制度
- 廣東海洋大學(xué)《建筑藝術(shù)表現(xiàn)基礎(chǔ)二》2023-2024學(xué)年第二學(xué)期期末試卷
- 會記憑證管理制度
- 口腔實習(xí)生崗前培訓(xùn)課件
- 自動生成的文檔-202504081202-70
- 鋼結(jié)構(gòu)檢測管理制度
- T/SHPTA 030-2022民用航空器用聚氟乙烯基阻燃耐候復(fù)合裝飾膜
- 吊車吊籃高空作業(yè)施工方案
- 工資調(diào)整變更協(xié)議書
- 基于YOLOv5的目標(biāo)檢測算法優(yōu)化及其在工業(yè)場景的應(yīng)用研究
- 地鐵保安服務(wù)應(yīng)急預(yù)案
- 早產(chǎn)兒腸內(nèi)營養(yǎng)管理專家共識2024年解讀
- 商務(wù)談判實務(wù)-形考任務(wù)二-國開(ZJ)-參考資料
- GA 1812.1-2024銀行系統(tǒng)反恐怖防范要求第1部分:人民幣發(fā)行庫
評論
0/150
提交評論