收藏 分销(赏)

单片机多级菜单编程实现.doc

上传人:w****g 文档编号:4125239 上传时间:2024-07-30 格式:DOC 页数:10 大小:41.62KB
下载 相关 举报
单片机多级菜单编程实现.doc_第1页
第1页 / 共10页
单片机多级菜单编程实现.doc_第2页
第2页 / 共10页
单片机多级菜单编程实现.doc_第3页
第3页 / 共10页
单片机多级菜单编程实现.doc_第4页
第4页 / 共10页
单片机多级菜单编程实现.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

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

2、Init)(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 MenuTyp

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

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

5、9为菜单是独生子/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, MENU_NO, MENU_NO, MENU_NO, *MenuEdit,MENU_DATA_VIEW

6、, 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

7、, *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,

8、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_

9、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,

10、 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_TROU

11、BLE, 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_DATA_TROUBLE, *MenuPrintDataIn,MENU_PRINT_SET, 4, MENU_

12、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, 6, 系统编程,MENU_PRINT_DATA , 3, 6, 数据打印,MENU_NO , 0, 0, 数据查看: 消音退出, /数据查看MENU_

13、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 , 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

14、_LD_DELAY , 2,12, 模块延时,MENU_TIME_SET , 3,12, 时钟调整,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_NONE;while(!EscFl

15、ag)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;iKeyTabMenuNextID.MaxItems+1;i+)ShowString(MenuEditShowji.Li

16、n,MenuEditShowji.Column,MenuEditShowji.Pdata,0); /初始化显示oldid = 0; /没有原先选择的项elseif(WhichKey = KEY_UP)oldid = KeyTabMenuNextID.PressDown; elseoldid = KeyTabMenuNextID.PressUp; /指示原先的项for(i=1;iKeyTabMenuNextID.MaxItems+1;i+)if(MenuEditShowji.Id = oldid)ShowString(MenuEditShowji.Lin,MenuEditShowji.Colum

17、n,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;ResetFlag = FALSE;ChangeFlag

18、= 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;MenuNextID = NowKeyTab.MenuInd

19、ex;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)(); /执行当前按键的操作

20、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(MenuNextID != MENU_NO) & (KeyTabMenuNextID.PressDown != MENU_NO)Now

21、KeyTab.PressOk = KeyTabMenuNextID.PressDown;MenuNextID = KeyTabMenuNextID.PressDown;(*NowKeyTab.CurrentOperate)(); /执行当前按键的操作break;case KEY_RESET: ResetFlag = TRUE;break;default : break; while(!ResetFlag & !EscFlag & !escflag); if(ChangeFlag & !EscFlag & !ResetFlag)EditDataChange(); if(ResetFlag)return SYS_RESET;else return 0; 关于这个菜单的说明: 1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsigned char。2.在网上的资料中,结构体数组是存在RAM中的,我把它放在也flash中了,然后再定义一个结构体变量,就样就可以省很多RAM,比较适合51.3.在网上资料中,因为保存了原来的选择,当你离开编程状态重新进行后,会发现选择上会是原来进行的顺序,我改动之后,退出上一级菜单还是你选的那一项,但重新进入后就是第一个指定项。4.增加UP和DOWN显示,可以反显最新选定的选项,正常显示原来的选项。

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服