打印

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

[复制链接]
5029|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 | 只看该作者
嗯~~总结楼上几位,就是叫做 状态机..

使用特权

评论回复
受到警告 5
BitFu| | 2015-12-19 17:38 | 只看该作者
本帖最后由 BitFu 于 2015-12-21 10:33 编辑

----

使用特权

评论回复
6
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 大哥,能不能来点注释啊 =。=
7
linyu1983| | 2015-12-20 08:02 | 只看该作者
你可以不用看成是三级菜单  把他做成同级的就行了   不同的是标志位  应该蛮简单的

使用特权

评论回复
来自android
评论
cov0xt 2015-12-20 08:41 回复TA
一语道破天机,感谢~ 
8
dirtwillfly| | 2015-12-20 09:00 | 只看该作者
emyhello 发表于 2015-12-19 22:29
typedef struct
{
    enIconType_t                 enIconType;

感谢分享

使用特权

评论回复
9
dirtwillfly| | 2015-12-20 09:00 | 只看该作者
linyu1983 发表于 2015-12-20 08:02
你可以不用看成是三级菜单  把他做成同级的就行了   不同的是标志位  应该蛮简单的 ...

也是好办法

使用特权

评论回复
10
gaoxueyan| | 2015-12-28 11:01 | 只看该作者
理清你的思路,找出各自的功能特点就可以清楚分开了

使用特权

评论回复
11
tsb151| | 2016-1-9 09:56 | 只看该作者
楼主可以参考下

12864多级菜单设计.pdf

392.68 KB

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cov0xt + 1 好主意,值得借鉴~
12
1261867136| | 2016-1-12 11:15 | 只看该作者
最近去专了下按键,特别是单键的复用...发现不是那么简单的事...在下手前一定要理清自己的按键目的才行

使用特权

评论回复
13
wentmile| | 2016-1-26 15:11 | 只看该作者
曾经用switch写过三级的菜单,看见自己的代码都想吐

使用特权

评论回复
14
dang2959809956| | 2016-2-5 22:29 | 只看该作者
用中断写按键,省的老是反复读取按键是否被按下,这样有助于思路清晰,我是用HD7279来控制按键,不用去抖,比较方便

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

200

帖子

3

粉丝