單片機多級菜單編程實現(xiàn)_第1頁
單片機多級菜單編程實現(xiàn)_第2頁
單片機多級菜單編程實現(xiàn)_第3頁
單片機多級菜單編程實現(xiàn)_第4頁
單片機多級菜單編程實現(xiàn)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

單片機多級菜單編程實現(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ù)組的指針操作菜單模塊需要的按鍵操作有:左、右、確認(rèn)、退出。采用這種辦法,可以方便的添加或刪減菜單。并且只需要在其頭文件中修改初始變量就可以實現(xiàn),完全無須修改C文件中的任何函數(shù)。具體結(jié)構(gòu)定義我的定義,做個參考:#defineMENU_HLP_EN//菜單幫助信息使能typedefstruct{void(*pMenuTaskInit)(void);//指向菜單任務(wù)初始化函數(shù)的指針void(*pMenuTaskEnd)(void);//指向菜單任務(wù)結(jié)束函數(shù)的指針}MENU_TASK_TYP;typedefstructMenuTyp{INT8U*MenuName;//菜單名稱字符串WORK_MODWorkMod;//工作狀態(tài)編號MENU_TASK_TYP*pMenuTask;//指向菜單任務(wù)的指針void(**pTaskKeyDeal)(void);//指向菜單任務(wù)按鍵處理函數(shù)數(shù)組的指針#ifdefMENU_HLP_ENINT8U*MenuHlp;//菜單幫助字符串#endifstructMenuTyp*pParent;//指向上層菜單的指針structMenuTyp*pChild;//指向子菜單的指針structMenuTyp*pRight;//指向右菜單的指針structMenuTyp

*pLeft;//指向左菜單的指針}MENU_TYP;我根據(jù)網(wǎng)上的資料做的一個菜單:/****************菜單數(shù)據(jù)結(jié)構(gòu)/****************菜單數(shù)據(jù)結(jié)構(gòu)a**—/structKeyTabStruct{uint8MenuIndex;//當(dāng)前狀態(tài)索引號uint8MaxItems;//本級菜單最大條目數(shù)uint8ShowLevel;//菜單顯示內(nèi)容uint8PressOk;//按下"回車"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8PressEsc;//按下"返回"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8PressDown;//按下"向下"鍵時轉(zhuǎn)向的狀態(tài)索引號uint8PressUp;//按下"向上"鍵時轉(zhuǎn)向的狀態(tài)索引號void(*CurrentOperate)();//當(dāng)前狀態(tài)應(yīng)該執(zhí)行的功能操作};uint8MenuID;//菜單ID號uint8MenuNextID;//下級菜單ID號//CurMenuID=本菜單ID//MaxMenuItem=同級菜單最大項數(shù)//OkMenuID=子菜單層所對應(yīng)的菜單ID,ID=999為菜單已經(jīng)到底了//EscMenuID=父菜單層所對應(yīng)的菜單ID,ID=999為菜單已經(jīng)到頂了//DownMenuID=弟菜單層所對應(yīng)的菜單ID,ID=999為菜單是獨生子//UpMenuID=兄菜單層所對應(yīng)的菜單ID,ID=999為菜單是獨生子//CurFunction=本菜單所對應(yīng)的菜單函數(shù)指針conststructKeyTabStructKeyTab[MAX_KEYTABSTRUCT_NUM]={//CurMenuID,axMenuItem,MenuShowLevel,OkMenuID,EscMenuID,DownMenulD,UpMenulD,CurFunction{MENU_EDIT,0,0,MENU_DATA_VIEW,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_DATA_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},{MENU_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_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,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,MENU_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,*MenuPrintDataln},{MENU_PRINTER_CHECK,4,MENU_NO,MENU_NO,MENU_PRINT_DATA,MENU_PRINT_SET,MENU_PRINT_DATA_TROUBLE,*MenuPrintDataIn,{MENU_PRINT_SET,4,MENU_NO,MENU_NO,MENU_PRINT_DATA,MENU_PRINT_DATA_FIRE,編程菜單顯示數(shù)據(jù)MENU_PRINTER_CHECK,*MenuPrintSet,編程菜單顯示數(shù)據(jù)/********************************************************************/conststructMenuDispDataMenuEditShow[][MENU_MAX]

{{MENU_NO,0,0,"選擇:消音一退出"},〃主菜單{MENU_DATA_VIEW,1,6,"1?數(shù)據(jù)查看"},{MENU_SYS_EDIT,2,6,"2?系統(tǒng)編程"},{MENU_PRINT_DATA,3,6,"3?數(shù)據(jù)打印"}},{{MENU_NO,0,0,"數(shù)據(jù)查看:消音一退出”},〃數(shù)據(jù)查{MENU_DATA_VIEW_FIRE,1,4,"??火警葉,{MENU_DATA_VIEW_TROUBLE,2,4,"2?故障"},{MENU_DATA_VIEW_REPEAT,3,4,"?重碼"{MENU_FACE_CHECK,1,12,"4?面板檢測"},{MENU_STEP_FOLLOW,2,12,"5?單步跟蹤"}},TOC\o"1-5"\h\z{{MENU_NO,0,0,"系統(tǒng)編程:消音一退出"},〃系統(tǒng)編程{MENU_SUM_SET,1,0,"?容量設(shè)置" ,{MENUEDITINSULATE,2,0,"2隔離點" ,{MENU_EDIT_HZ,3,0,"?漢字描述" ,{MENU_LD_CONTROL,1,12,"?聯(lián)動控制" ,{MENU_LD_DELAY,2,12,"?模塊延時" ,{MENU_TIME_SET,3,12,"6?時鐘調(diào)整”}},{{MENU_NO,0,0,"數(shù)據(jù)打印:消音一退出”},〃數(shù)據(jù)打印{MENU_PRINT_DATA_FIRE,1,0,"?火警數(shù)據(jù)”{MENU_PRINT_DATA_TROUBLE,2,0,"2故障數(shù)據(jù)"{MENU_PRINTER_CHECK,3,0,”?打印機自檢"{MENU_PRINT_SET,1,12,"?打印設(shè)置" ,}等待按鍵********************voidWaitKey(void){uint32time;time=RTCFlag;WhichKey=KEY_NONE;while(!EscFlag){if(RTCFlag-time>=EDIT_TIME)EscFlag=TRUE;顯示多級菜單if(WhichKey!=KEY_NONE){KeySound(300);//按鍵音return;顯示多級菜單/**********************************/**********************************/voidMenuEdit(){uint32i,j=0;uint32oldid;j=KeyTab[MenuID].ShowLevel;if(WhichKey==KEY_ESC||WhichKey==KEY_OK){ClearScreen();for(i=0;i<KeyTab[MenuNextID].MaxItems+1;i++)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j][i].Column,MenuEditShow[j][i].Pdata,0);//初始化顯示oldid=0;//沒有原先選擇的項else{if(WhichKey==KEY_UP)oldid=KeyTab[MenuNextID].PressDown;elseoldid=KeyTab[MenuNextID].PressUp;//指示原先的項}for(i=1;i<KeyTab[MenuNextlD].Maxltems+1;i++){if(MenuEditShow[j][i].Id==oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j].Column,MenuEditShow[j][i].Pdata,0);//正常顯示原先的項else{if(MenuEditShow[j][i].ld==MenuNextlD)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[i].Column,MenuEditShow[j][i].Pdata,1);//反顯當(dāng)前選擇的項}}WhichKey=KEY_NONE;}/************************************/一一、*************************/************************************/系統(tǒng)編程*************************uint32Edit(void){structKeyTabStructNowKeyTab;//指示當(dāng)前的菜單值uint32escflag=FALSE;ResetFlag=FALSE;ChangeFlag=FALSE;EscFlag=FALSE;MenulD=MENU_EDlT;NowKeyTab=KeyTab[MenulD];MenuNextlD=NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)();//顯示主菜單do{if(WhichKey==KEY_NONE)WaitKey();//等待按鍵switch(WhichKey){caseKEY_ESC:if(NowKeyTab.PressEsc!=MENU_NO){MenuID=NowKeyTab.PressEsc;MenuNextID=NowKeyTab.MenuIndex;NowKeyTab=KeyTab[MenuID];NowKeyTab.PressOk=MenuNextID;(*NowKeyTab.CurrentOperate)();//顯示當(dāng)前菜單}elseescflag=TRUE;//退出編程狀態(tài)break;caseKEY_OK:if(NowKeyTab.PressOk!=MENU_NO){MenuID=NowKeyTab.PressOk;NowKeyTab=KeyTab[MenuID];MenuNextID=NowKeyTab.PressOk;}(*NowKeyTab.CurrentOperate)();//執(zhí)行當(dāng)前按鍵的操作break;caseKEY_UP:if((MenuNextID!=MENU_NO)&&(KeyTab[MenuNextlD].PressUp!=MENU_NO)){NowKeyTab.PressOk=KeyTab[MenuNextlD].PressUp;MenuNextlD=KeyTab[MenuNextlD].PressUp;(*NowKeyTab.CurrentOpera

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論