




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机多级菜单编程实现单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现 链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。采用这种办法,可以方便的添加或删减菜单。并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。具体结构定义 我的定义,做个参考:#define MENU_HLP_EN /菜单帮助信息使能typedef structvoid (*pMenuTaskInit)(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 *pParent; /指向上层菜单的指针struct MenuTyp *pChild; /指向子菜单的指针struct MenuTyp *pRight; /指向右菜单的指针struct MenuTyp *pLeft; /指向左菜单的指针MENU_TYP;我根据网上的资料做的一个菜单: /*菜单数据结构*/struct KeyTabStructuint8 MenuIndex; /当前状态索引号uint8 MaxItems; /本级菜单最大条目数uint8 ShowLevel; /菜单显示内容uint8 PressOk; /按下回车键时转向的状态索引号uint8 PressEsc; /按下返回键时转向的状态索引号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=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, 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, *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_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_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_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(!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;iKeyTabMenuNextID.MaxItems+1;i+)ShowString(MenuEditShowji.Lin,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.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;ResetFlag = 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;MenuNextID = 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:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 牧草栽培工工艺考核试卷及答案
- 矿山安全设备监测检修工设备调试考核试卷及答案
- 技术类咨询培训方案
- 咨询公司差别定价方案
- 解决方案咨询部
- 漯河定制镀铜门施工方案
- 差异化产品营销方案模板
- 建筑方案设计理由简短
- 贵州建筑装饰方案设计公司
- 琼海互联网营销推广方案
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- GB/T 14365-2017声学机动车辆定置噪声声压级测量方法
- 2022年东台市城市建设投资发展集团有限公司招聘笔试试题及答案解析
- 保险金信托基础知识课件
- 高中必修人教A版高中数学必修1指数函数一 完整版课件PPT
- QC080000有害物质管理评审报告
- DB35∕T 2023-2021 生猪无抗饲养技术规范
- 倪海厦人纪之针灸 全
- 防空应急疏散演练方案防空应急疏散演练方案
- 《结构化学》课件第二章-原子的结构与性质
- 2022藤椒油炒饭抖音推广方案-57P
评论
0/150
提交评论