单片机的按键与菜单系统,该如何写?

[复制链接]
5377|14
 楼主| cov0xt 发表于 2015-12-19 08:15 | 显示全部楼层 |阅读模式
本帖最后由 cov0xt 于 2015-12-19 08:19 编辑

在单片机中,按一次键,响应一次活动,看似很简单,可是功能多了以后,就复杂了,写着写着,自己就乱了……

如果只有一级菜单,那还简单

switch(按键)
{
  case(0):
    做点什么;
    break;
  case(1):
    做点什么;
    break;
}

如果有二级菜单,那么嵌套switch,也还凑合。

但是,如果有N级菜单,这简直是噩梦……

比如说,有一个时钟的程序,主界面显示时间,在主界面下有以下功能:
1、开关显示
2、开关声音
3、设置

在设置下面有以下功能:
1、设置小时
2、设置分钟
3、返回到主界面

在设置小时下面有以下功能:
1、小时+1
2、小时-1
3、返回到设置界面

等等……

这才三级菜单,就已经很复杂了,将来要是还有别的什么功能,switch嵌套switch还不乱套了,有什么好主意吗?




dirtwillfly 发表于 2015-12-19 08:28 | 显示全部楼层
菜单复杂一点的可以用数组来存储,用状态转移来选择就可以了。
diy1997 发表于 2015-12-19 09:30 | 显示全部楼层
定义一些变量存储状态标志,

下一级菜单根据标志执行。


1261867136 发表于 2015-12-19 15:36 | 显示全部楼层
嗯~~总结楼上几位,就是叫做 状态机..
BitFu 发表于 2015-12-19 17:38 来自手机 | 显示全部楼层
本帖最后由 BitFu 于 2015-12-21 10:33 编辑

----
emyhello 发表于 2015-12-19 22:29 | 显示全部楼层
本帖最后由 emyhello 于 2015-12-20 17:04 编辑

/*  这是定义每个显示页面的最小元素--Icon, 每个Icon有图片和文本两种,对应不同的底层调用;  */
/*  有些功能可以按需求去掉。                                                                                                        */

typedef struct
{
    enIconType_t                  enIconType;    //当前 Icon的 类型
    stcImgIcon_t                   stcImg;           // 图片类型的信息,比如图片大小、源位置等等         
    stcTextIcon_t                  stcText;          // 文本类型的信息,比如有几个字,字体,放大等
    stcValidArea_t                  stcIconArea;    // 当前Icon触摸的有效果范围
    stcDispLocation_t            stcImgDisp;     // 图片类型显示的特殊调用,如是为NULL,则为普通调用
    stcDispLocation_t            stcTextDisp;    // 文本类型显示的特殊调用,如是为NULL,则为普通调用
    boolean_t                        EnLock;           // 该Icon是否允许被上锁(若为TRUE,则上锁后其不允许操作)
    boolean_t                        EnDisp;            // 该Icon是否允许显示(False的话,显示隐藏,但触摸有操作有效果)
    boolean_t                        EnJmp;            // 该Icon是否允许跳转页面
    boolean_t                        EnMove;          // 该Icon是否支持移动功能
    boolean_t                        EnTouch;         // 该Icon是否允许触摸,若为TRUE,下面的TouchHandle才有效果
    boolean_t                        EnChgAlpha;    // 该Icon是否允许改变透明度
    uint32_t                          JmpPage;         // 若EnJmp为TRUE,默认pSigRls后,会跳转到相应的页面
    enIconSlect_t                  enIconSlect;     // 该Icon是否支持选择(默认有触摸时,其透明度有变化)
    uint8_t                            Alpha;              // 透明度变化的值
    TouchHandle                   pDisp;              // 进入时,显示是否需要有特殊处理
    TouchHandle                   pOther;            // 进入时,是否需要有其它特殊处理
    TouchHandle                   pDropOut;       // 退出时,是否需要有其它特殊处理
    TouchHandle                   pNoTouch;       // 无触摸时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pSigTouch;      // 单触摸时,是否有其它特殊处理;若为NULL,默认处理   
    TouchHandle                   pSigHold;         // 单长触摸时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pSigMove;       // 单拖动时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pSigRls;           // 单触摸release时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pSigHoldRls;    // 单长触摸release时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pSigMoveRls;   // 单拖动release时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pMultiTouch;   // 多点触摸时,是否有其它特殊处理;若为NULL,默认处理
    TouchHandle                   pMultiRls;        // 多点触摸release时,是否有其它特殊处理;若为NULL,默认处理
}stcDispIconAttr_t;

/*  显示页信息  */
typedef struct
{
    uint32_t                    BgImgAddr;       // 背景图片的源地址
    uint32_t                    BgImgWidth;     // 背景图片的宽度
    uint32_t                    BgImgHeight;     // 背景图片的长度
    uint32_t                    IconTotal;          // 显示页的Icon数目  
    PageHandle               pPageHandle;     // 进入页时,是否需要特殊处理
    stcDispIconAttr_t      stcIconArray[ITEM_MAX_NUM];   // Icon数组
    stcMoveEvent_t        stcMoveEvent;   // 移动事件              
    stcDialogBoxPage_t   stcDialogBox;    // 对话框事件
}stcPageAttr_t;

可以参考下这个思路。

评分

参与人数 1威望 +1 收起 理由
cov0xt + 1 大哥,能不能来点注释啊 =。=

查看全部评分

linyu1983 发表于 2015-12-20 08:02 来自手机 | 显示全部楼层
你可以不用看成是三级菜单  把他做成同级的就行了   不同的是标志位  应该蛮简单的

评论

一语道破天机,感谢~  发表于 2015-12-20 08:41
dirtwillfly 发表于 2015-12-20 09:00 来自手机 | 显示全部楼层
emyhello 发表于 2015-12-19 22:29
typedef struct
{
    enIconType_t                 enIconType;

感谢分享
dirtwillfly 发表于 2015-12-20 09:00 来自手机 | 显示全部楼层
linyu1983 发表于 2015-12-20 08:02
你可以不用看成是三级菜单  把他做成同级的就行了   不同的是标志位  应该蛮简单的 ...

也是好办法
gaoxueyan 发表于 2015-12-28 11:01 | 显示全部楼层
理清你的思路,找出各自的功能特点就可以清楚分开了
tsb151 发表于 2016-1-9 09:56 | 显示全部楼层
楼主可以参考下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +1 收起 理由
cov0xt + 1 好主意,值得借鉴~

查看全部评分

1261867136 发表于 2016-1-12 11:15 | 显示全部楼层
最近去专了下按键,特别是单键的复用...发现不是那么简单的事...在下手前一定要理清自己的按键目的才行
wentmile 发表于 2016-1-26 15:11 | 显示全部楼层
曾经用switch写过三级的菜单,看见自己的代码都想吐
dang2959809956 发表于 2016-2-5 22:29 | 显示全部楼层
用中断写按键,省的老是反复读取按键是否被按下,这样有助于思路清晰,我是用HD7279来控制按键,不用去抖,比较方便
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

200

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部