单片机多级菜单编程实现_第1页
单片机多级菜单编程实现_第2页
单片机多级菜单编程实现_第3页
单片机多级菜单编程实现_第4页
单片机多级菜单编程实现_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选文档单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现 链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。采用这种办法,可以方便的添加或删减菜单。并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。具体结构定义 我的定义,做个参考:#define MENU_HLP_EN /菜单帮助信息使能typedef structvoid (*pMenu

2、TaskInit)(void); /指向菜单任务初始化函数的指针void (*pMenuTaskEnd)(void); /指向菜单任务结束函数的指针MENU_TASK_TYP;typedef struct MenuTypINT8U *MenuName; /菜单名称字符串WORK_MOD WorkMod; /工作状态编号MENU_TASK_TYP *pMenuTask; /指向菜单任务的指针void (*pTaskKeyDeal)(void); /指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U *MenuHlp; /菜单帮助字符串#endifstruct Men

3、uTyp *pParent; /指向上层菜单的指针struct MenuTyp *pChild; /指向子菜单的指针struct MenuTyp *pRight; /指向右菜单的指针struct MenuTyp *pLeft; /指向左菜单的指针MENU_TYP;我根据网上的资料做的一个菜单: /*菜单数据结构*/struct KeyTabStructuint8 MenuIndex; /当前状态索引号uint8 MaxItems; /本级菜单最大条目数uint8 ShowLevel; /菜单显示内容uint8 PressOk; /按下"回车"键时转向的状态索引号uint8

4、PressEsc; /按下"返回"键时转向的状态索引号uint8 PressDown; /按下"向下"键时转向的状态索引号uint8 PressUp; /按下"向上"键时转向的状态索引号void (*CurrentOperate)(); /当前状态应该执行的功能操作;uint8 MenuID; /菜单ID号uint8 MenuNextID; /下级菜单ID号/CurMenuID=本菜单ID/MaxMenuItem=同级菜单最大项数/OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了/EscMenuID=父菜单层所

5、对应的菜单ID,ID=999为菜单已经到顶了/DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子/UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子/CurFunction=本菜单所对应的菜单函数指针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,;/*编程菜单显示数据*/const struct MenuDispData MenuEditShowMENU_MAX = MENU_NO , 0, 0, "选择: 消音退出", /主菜单MENU_DATA_VIEW , 1, 6, "数据查看",MENU_SYS_EDIT , 2,

13、 6, "系统编程",MENU_PRINT_DATA , 3, 6, "数据打印",MENU_NO , 0, 0, "数据查看: 消音退出", /数据查看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, "系统编程: 消音退出", /系统编程MENU_SUM_SET , 1, 0, "容量设置",MENU_EDIT_INSULATE , 2, 0, "隔离点",MENU_EDIT_HZ , 3, 0, "汉字描述",MENU_LD_CONTROL , 1,12, "联动控制",MENU_LD_DELAY , 2,12, "模块延时",MENU_TIME_SET , 3,12, "时钟调整&

15、quot;,MENU_NO , 0, 0, "数据打印: 消音退出", /数据打印MENU_PRINT_DATA_FIRE , 1, 0, "火警数据",MENU_PRINT_DATA_TROUBLE,2, 0, "故障数据",MENU_PRINTER_CHECK , 3, 0, "打印机自检",MENU_PRINT_SET , 1,12, "打印设置", ;/*等待按键*/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); /反显当前选择的项 WhichKey = KEY_NONE; /*系统编程*/uint32 Edit(void) struct KeyTabStruct NowKeyTab; /指示当前的菜单值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)(); /显示当前菜单elseescflag = TRUE; /退出编程状态break;case KEY_OK : if(NowKeyTab.PressOk != MENU_NO)MenuID = NowKeyTab.PressOk;NowKeyTab = KeyTabMenuID;MenuNextID = NowKeyTab.PressOk;(*NowKeyTab.CurrentOperate)(); /执行当前按键的操作break;case KEY_UP : if(MenuNextID != MENU_NO) && (KeyTabMenuNextID.PressUp != MENU_NO)NowKeyTab.PressOk = KeyTabMenuNextID.PressUp;MenuNextID = KeyTabMenuNextID.PressUp;(*NowKeyTab.CurrentOperate)(); /执行当前按键的操作break;case KEY_DOWN: if(MenuN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论