【单片机C语言】编写一个菜单 | 您所在的位置:网站首页 › c语言控制台菜单 › 【单片机C语言】编写一个菜单 |
目录
前言 一、菜单分级和功能的编写 二、菜单的切换 三、结语 前言本文讲解了如何用C语言实现一个菜单。本菜单的选项切换、确认、返回逻辑与菜单中选项具体要实现的功能分离开,让菜单的代码更加清晰,避免了一般状态机编写中状态机功能切换逻辑与具体功能写在一起造成混乱的情况。 一、菜单分级和功能的编写一个菜单首先要分不同的层级,这些层级可以通过切换键(如左右键)、确定键、返回键进行同层级和不同层级的选择,这样就可以实现用菜单选择执行不同的程序了。 首先,根据菜单的结构,我们使用如下的菜单结构体: typedef struct Menu { int mode1; // 0-代表主菜单,选择进入对应二级菜单 1、2、3...代表二级菜单 int mode2; // 0-代表二级菜单,选择进入对应三级菜单 1、2、3...代表三级菜单 int mode3; // 0-代表三级菜单,选择进入对应四级菜单 1、2、3...代表四级菜单 int mode4; // 同理 }sMenu;这个菜单的结构可以用下图表示: 接下来,要编写进入每一级菜单时要执行的内容,以及进入最后一级时所要执行的程序。如下图所示: 建立文件menu.c、menu.h、main.c。 在menu.c中添加如下代码: #include "menu.h" //将传入字符串显示出来,并播报一遍 extern void Output(char* str); //创建一个菜单 sMenu menu = {0,0,0,0}; //放在主循环中扫描 void Menu_Scan() { switch(menu.mode1) { /* 主菜单,选择进入对应二级菜单 */ //进入主菜单时显示“主菜单”,并播报一遍 case 0: Output("主菜单"); break; /* 二级菜单1 */ case 1: switch(menu.mode2) { /* 二级菜单,选择进入对应三级菜单 */ //进入二级菜单时显示“二级菜单1”,并播报一遍 case 0: Output("二级菜单1"); break; /* 三级菜单1,进入可运行App1 */ case 1: Output("现在运行App1"); break; /* 三级菜单2,进入可运行App2 */ case 2: Output("现在运行App2"); break; /* 三级菜单3,进入可运行App3 */ case 3: Output("现在运行App3"); break; } break; /* 二级菜单2 */ case 2: break; /* 二级菜单3 */ case 3: break; } }将Menu_Scan()放在主循环中扫描,每当所选的菜单改变时,就会执行相应的程序了。这里最后一级菜单所要执行的程序比较简单,只是显示一段文字和播报一遍该文字的音频。其中二级菜单2和二级菜单3的结构类似,这里就省略不写。在每次进入菜单时,都会进行一次的显示和播报,代表进入该菜单。第四级菜单结构也类似,这里就不写了。 在menu.h中添加如下代码: #ifndef __MENU_H #define __MENU_H typedef struct Menu { int mode1; // 0-代表主菜单,选择进入对应二级菜单 1、2、3...代表二级菜单 int mode2; // 0-代表二级菜单,选择进入对应三级菜单 1、2、3...代表三级菜单 int mode3; // 0-代表三级菜单,选择进入对应四级菜单 1、2、3...代表四级菜单 int mode4; // 同理 }sMenu; void Menu_Scan(); #endif在main.c中添加如下代码: #include "menu.h" int main() { Some_Init(); //一些初始化操作 while(1) { Menu_Scan(); //扫描菜单 } return 0; } 二、菜单的切换,菜单的分级问题解决了菜单有了最基本的一个框架,在这个框架中可以填入相应要运行的程序。现在要解决的是菜单同层级和不同层级的选择和切换问题。 以按键切换为例,按键有切换键(左右键)、确定键、返回键。 建立文件button.c、button.h。 在button.c中添加如下代码,代码有点多,重点在Button_Scan()函数中的内容: #include "button.h" //将传入字符串显示出来,并播报一遍 extern void Output(char* str); int btnState[4] = {1,1,1,1}; //按键状态 0-按下 1-未按下 int btnFlag[4] = {0,0,0,0}; //防止按键重复检测 //获得所有按键状态 static void Button_GetAllState() { ... } //复位btnFlag static void resetBtnFlag() { for(int i=0; i1) chooseBuf--; }else if(isBtnN()){ //右键 if(chooseBuf1) chooseBuf--; }else if(isBtnN()){ //右键 if(chooseBuf |
CopyRight 2018-2019 实验室设备网 版权所有 |