单片机多级菜单编程实现.docx
- 文档编号:12890389
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:9
- 大小:19.76KB
单片机多级菜单编程实现.docx
《单片机多级菜单编程实现.docx》由会员分享,可在线阅读,更多相关《单片机多级菜单编程实现.docx(9页珍藏版)》请在冰豆网上搜索。
单片机多级菜单编程实现
单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状得菜单结构,用链表实现
链表中包含:
bl、指向同级左右菜单与指向父菜单、子菜单得四个菜单结构体指针;
2、进入该菜单时需要执行得初始化函数指针3b、退出该菜单时需要执行得结束函数指针
4、该菜单内得按键处理函数指针数组得指针操作菜单模块需要得按键操作有:
左、右、确
认、退出・b采用这种办法,可以方便得添加或删减菜单•并且只需要在其头文件中修改初始变量就可b以实现,完全无须修改C文件中得任何函数.
具体结构定义b我得定义,做个参考:
#defineMENU_HLP_EN//菜单帮助信息使能
typedefstruetb{
void(^pMenuTasklnit)(Void):
〃指向菜单任务初始化函数得指针
void(^pMenuTaskEnd)(void):
〃指向菜单任务结束函数得指针
}MENU_TASK_TYP;
typedefstructMenuTypb{bINT8U*MenuName;//菜单名称字
符串bWORK_MODWorkMod:
//工作状态编号
MENU_TASK_TYP*pMenuTask;//指向菜单任务得指针
void(**pTaskKeyDeal)(void);//指向菜单任务按键处理函数数组得指针
#ifdefMENUHLP_ENbINT8U次MenuHlp;〃菜单帮助字符串
#endif
structMenuTyp*pParent;//指向上层菜单得指针
structMenuTyp*pChiId:
//指向子菜单得指针
structMenuTyp次pRight;〃指向右菜单得指针
structMenuTyp*pLeft;〃指向左菜单得指针b}MENUTYP:
b我根据网上得资料做得一个菜单:
/****************菜单数据结构**********次********
***/bst「uctKeyTabstruct{
uint8Menulndex;〃当前状态索引号
uint8MaxItems:
//本级菜单最大条目数buint8ShowLeveI;//菜单显示内容buint8PressOk:
//按下“回车”键时转向得状态索引号uint8PressEsc;//按下"返回"键时转向得状态索引号
uint8PressDown:
〃按下”向下"键时转向得状态索引号buint8PressUp;〃按下"向上“键时转向得状态索引号
void(*Current0perate)();〃当前状态应该执行得功能操作b};
uint8MenuID:
〃菜单ID号
uint8MenuNextID;〃下级菜单ID号b//CurMenulD=本菜单IDb//MaxMenuItem=同级菜单最大项数
//OkMenuID二子菜单层所对应得菜单ID,ID=999为菜单已经到底了
//EscMenUID=父菜单层所对应得菜单ID,ID=999为菜单已经到顶了b〃DownMenuID=弟菜单层所对应得菜单ID,ID=999为菜单就是独生子b//UpMenuID二兄菜单层所对应得菜单ID,ID=999为菜单就是独生子
//CurFunction二本菜单所对应得菜单函数指针
conststructKeyTabStructKeyTab[MAXKEYTABSTRUCT_NUM]=S〃Cu「MenuID,axMenuItem,MenuShowLevel,OkMenuID,EscMenuID,DownMenuID,UpMenuID,CurFunction{MENU_EDIT,
0,0zMENUDATAVIEW,MENUNO,MENUNO,MENUNO,
*MenuEdit},
{MENU_DATA一VIEW,3,1,MENUDATA_VIEW_FIRE,MENUE
DIT,MENUSYSEDIT,MENUPRINTDATA,*MenuEdit},(MENU_DATA^VIEW_FIREZ5,MENU_NO,MENU_NO,MEN
UDATAVIEW,MENUDATAVIEWTROUBLE,MENUSTEPFOLLOW,*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,bMENU_NO,MENUDATAVIEW,MENUFACECHECK,bMENUDATAVIEWTROUBLE,*MenuDataViewin},
{MENUFACECHECK,5,MENUNO,bMENUNO,MENUDATA_VIEW,MENUSTEP_FOLLOW,
MENU_DATA_VIEW_REPEAT,*MenuFaceCheck},b{MENU_STEP
FOLLOW,5,MENUNO,bMENUNO,MENUDATAVIEW,
MENU_DATA_VIEWFIRE,MENU_FACECHECKMenuStepFoiiow},
{MENUSYS_EDIT,3,
2,MENU_SUMSET,MENU_EDITZ
MENU_PRINT_DATAZMENU_DATA_VIEW,*MenuEdit},{MENU_SUM_SET,6,MENU_NO,bMENU_NO,MENU_SYSEDIT,
MENU_EDIT_INSULATE,
MENU_TIME_SET,*MenuSumSet},
(MENU_EDIT_INSULATE,6,MENU_N0,
MENUNO,MENUSYSEDIT,MENUEDITHZ,MENUSUMSET,*MenuEditlnsulate},b{MENUEDIT_HZ,6,MENU_NO,
MENU_NO,MENU_SYS_EDITzMENU_LD_CONTROL,MENU_EDIT_INSULATE,*MenuEditHZ},
{MENU_LDCONTROL,6,
MENUNO,MENUNO,MENUSYSEDIT,MENULDDELAYMENUEDIT_HZ,*MenuLDControl},
{MENULDDELAY,6,bMENUNO,MENUNO,MENUSYSEDIT,MENU_TIME_SET,bMENULD_CONTROL,*MenuLDDelay}q{MENU_TIME_SET,6,MENU_NO,
MENUNO,MENUSYSEDIT,MENUSUMSET,MENULDDELAY,b*MenuTimeSet},
{MENU_PRINT_DATA,3,3,bMENU_PRINTDATAFIRE,MEN
U_EDIT,MENU_DATAVIEW,bMENU_SYS_EDIT,*MenuEdit}z{MENU_PRINTDATA_FIRE,4,
MENUNO,MENUNO,MENUPRINTDATA,bMENUPRINTDATA_TROUBLE,MENU_PRINT_SET,*MenuPrintDataIn},b{MENU_PRINT_DATA_TROUBLE,4,MENUNO,
MENU_NO,MENU_PRINT_DATA,MENU_PRINTER_CHECK,bMENUPRINT_DATA_FIRE,*MenuPrintDataln},
{MENU_PRINTERCHECK,4,MENU_NO,
MENUNO,MENUPRINTDATA,MENUPRINTSET,bMENUPRINTDATA_TROUBLE,*MenuPZntDataIn},b{MENU_PRINT
SET,4,MENU_NOZ
MENUNO,MENUPRINTDATA,MENUPRINTDATAFIRE,bMENU_PRINTER_CHECK,*MenuPrintSet},
}:
/"k**'k*******次**次次**'k'k'k*****************编程菜单显示数据
******************************/
conststruetMenuDispDataMenuEditShow[][MENU_MAX]=
{{MENU_NO,0,0,〃选择:
消音一退出”},//主菜单
{MENU_DATA_VIEW,1,6,"1•数据查瞧〃},b{MENU_SYS_E
DIT,2,6,”2.系统编程"}q{MENUPRINT_DATA,3,6Z"3.
数据打印”}}q{(MENU_NO,0,0,"数据查瞧:
消音一退出“},//数据查
瞧^{MENU_DATA_VIEW_FIRE,1,4,"1•火警}b{MENU_DATA_V
{MENUDATA_VIEW_REPEAT,3,4,"3.重码”},
{MENUFACE_CHECK,1,12,“4.面板检测)
{MENUSTEP_FOLLOW,2,12,“5.单步跟踪"}}q{{MENU_NO,0,
0z“系统编程:
消音一退出”},〃系统编程
(MENU_SUM_SET,1,0,"1.容量设置号,
{MENU_EDITINSULATE,2,0,“2.隔离点“},
(MENU_EDIT_HZ,3,0,"3.汉字描述"}q{MENU_LD_CONTROL,
1,12,“4.联动控制“},
{MENU_LDDELAY,2,12,"5.模块延时“}q{MENU_TIME_SET,
3,12,"6.时钟调整"}},b{(MENU_NO,0,0,”数据打印:
消音
-退出”},〃数据打印b{MENU_PRINT_DATA_FIRE,lz0,"1.火警数据”},
{MENUPRINT_DATA_TROUBLE,2,0,"2.故障数据“}z
{MENU_PRINTER_CHECK,3,0,“3.打印机自检”},
{MENU_PRINT_SET,1,12,"4.打印设置"}},b};b/******
*****************************等待按键********
*********次*次*次*次**********/
voidWaitKey(void)
{buint32time;
time=RTCFlag:
WhichKey=KEY_NONE:
bwhi1e(!
EscFlag){
if(RTCFIag—time>=EDIT_TIME>EscFlag=TRUE;bif(WhichKey!
=KEYNONE){bKeySound(300);//按键音return;
}
**/
}b/***'k'k******'k'k***********'k'k*******显示多级菜单b
*******夫*******夫夫*********夫
voidMenuEdit(陆{buint32i,j=0;buint32oIdid;j=KeyTab[MenuID]、ShowLevel:
bif(WhichKey==KEY_ESCII
WhichKey==KEY_OK){
C1earSereen():
bfor(i=0:
i ShowString(MenuEditshow[j][i]、Lin,MenuEditShow[j]b[i]、Column,MenuEditShow[j][i]、PdatazO);〃初始化显示boldid=bO: b//没有原先选择得项b}else{ if(WhichKey==KEYUP) o1did=KeyTab[MenuNextID]、PressDown; elseoldid=KeyTab [MenuNextID]、PressUp;b〃指示原先得项b}bfor(i=1: i [MenuNextID]、MaxItems+l;i++){bif(MenuEditShow[j][i]、Id==oldid) ShowString(MenuEditShow[j][订、LinzMenuEditShow[j]b[i]、Column,MenuEditShow[j][i]、Pdataz0);〃正常显示原先得项beIse{bif(MenuEditShow[j][订、Id==MenuNextID)howString(MenuEditShow[j][i]、Lin,MenuEditShow [j][i]、Column,MenuEditShow[j][i]、Pdata,1);//反显当前选择得项b} } WhichKey=KEYNONE; } /**********火夫夫夫****************系统编程******* **********夫************ uint32Edit(void)b{ structKeyTabStructNowKeyTab;〃指示当前得菜单值buint32 escfIag=FALSE;bResetFlag=FALSE: bChangeFIag=FALSE; bEscFlag=FALSE;bMenuID=MENU_EDIT: NowKeyTab=KeyTab[MenuID];bMenuNextID=NowKeyTab.PressOk: (^NowKeyTab.CurrentOperate)();〃显示主菜单 do{ if(WhichKey==KEY_NONE) WaitKey(): 〃等待按键bswitch(WhichKey){ caseKEYESC: if(NowKeyTab、PressEsc! =MENU_NO)b{ MenuID=bNowKeyTab、PressEsc; MenuNextID=bNowKeyTab、MenuIndex; NowKeyTab=KeyTabb[MenuID]; NowKeyTab.PressOk= MenuNextID;b(*NowKeyTab、CurrentOperate) O: //显示当前菜单b}else escflag= TRUE;//退出编程状态 break;bcaseKEY_OK: if(NowKeyTab>PressOk! =MENU_NO)b{bMenuID= NowKeyTab>PressOk; NowKeyTab=KeyTab^[MenuID]; MenuNextID=bNowKeyTab、PressOk;^} (*NowKeyTab、CurrentOperate) ();〃执行当前按键得操作bb「eak;bcaseKEY_UP: if((MenuNext ID! =MENU_NO)&& (KeyTab[MenuNextID].PressUp! =MENU_NO)){bNowKeyTab、Pr essOk=JiKeyTabfMenuNextID].PressUp: MenuNextID=KeyTabb[MenuNextlD]、PressUp;b (*NowKeyTab>CurrentOperate)();〃执行当前按键得操作b} break;bcaseKEY_DOWN: if((MenuNextlD! =MENU_NO)&&b (KeyTab[MenuNextID]、PressDown! =MENU一NO))owKeyTab、PressOk=^KeyTab[MenuNextID]、PressDown;bMenuNextID=KeyTab [MenuNextID].PressDown; (水NowKeyTab、Current0perate)();〃执行当前按键得操作b} break;bcaseKEY_RESET: ResetFlag=TRUE; break; defau1t: break: } }while(! ResetF1ag&&! EscFla吕&&! escfIag);bif(ChangeF1ag&&! EscFlag&&! ResetFleg)bEditDataChange(); if(ResetFIag)breturnSYS_RESET: belse{ return0;b}b} b关于这个菜单得说明: 1、我用得就是ARM处理器,所以5i得时候把const改成code,uint32改成unsignedcharo 2、在网上得资料中,结构体数组就是存在RAM中得,我把它放在也f1ash中了,然后再定义一个 结构体变量,就样就可以省很多RAM,比较适合51、b3、在网上资料中,因为保存了原来得选择,当您离开编程状态重新进行后,会发现选择上会 就是原来进行得顺序,我改动之后,退出上一级菜单还就是您选得那一项,但重新进入后就就是第 一个指定项・4b、增加UP与DOWN显示,可以反显最新选定得选项,正常显示原来得选项。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 多级 菜单 编程 实现