搜索
bottom↓
回复: 6

如何编写基于按键的状态机程序,恳请大神提供思路

[复制链接]

出0入0汤圆

发表于 2017-8-1 16:09:45 | 显示全部楼层 |阅读模式
先大概介绍下:
A0 A1 A2 A3(A0代表A0项,即ItemA0;A0,A1,A2,A3共同组成一个页,即PageA;以此类推。。。)
B0 B1
C0 C1 C2
主要使用lcd12864显示+6个按键交互(上,下,左,右,确认,返回)。

主要要求:
1> 区分模式:待机模式(长时间不操作,固定在几个项之间循环显示)访问模式(可以通过按键上,下,左,右查阅所有可以显示项) 编辑模式(修改其中某一项的数值)。
2> 区分数值:整数项(直接显示数值,数值为整数)小数项(直接显示数值,数值为小数)  字符项(值=0显示“yes",值=1显示”OFF"等)。
3> 区分显示:常规项(数据不明感,用户可见) 特殊项(用户未输入密码前不显示)。
4> 区分读写:只读项(就算输入修改密码,也不能修改该项数据) 可读可写项(比如数据敏感项,先输入显示密码,让其可见,再输入修改密码,然后才可以修改该项数据)

我能想到的(也是最容易的)就是给每项设置标志,然后采用switch case的方式一个一个进行判断(如下举例,实际并非完全这样)。
if (”上“键被按下)
switch (模式)
{
        case 待机模式:break;
                switch (整数项/小数项/字符项)
                {
                        。。。。。。
                }
                switch (常规项/特殊项)
                {
                        。。。。。。
                }
                switch (只读项/可读可写项)
                {
                        。。。。。。
                }
        case 访问模式:break;
        case 编辑模式:break;
        default:
}

额,按这种方式,代码我已经写好了,并且经过调试,代码也已经初步可以使用了。
但是这种写法缺点是很明显的:
<1> 可移植程序不高(不容易修改,牵一发而动全身)
<2> 代码冗长,执行效率肯定不高
<3> 这种代码不能拿出来“装X",不利于”进步“。

PS: 解释下为什么说是基于按键的状态机程序,因为这里的每个按键其实有很多功能,需要在特定环境中才知道它的作用,例如“上”键,可以是项之间的切换,可以是输入密码的字符的选择等。

我急切希望有一种比较好的状态机编程思路,让我重新“改造”这段程序。
还望大神提供思路(或者资料,或者书籍都行),最好举个简单的例子,在此先拜谢大神(这种按键程交互很多项目都能使用到,此处帮助了我,也顺便帮助了其它初学者,算是功德无量。。。)。。。再次感谢。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-8-1 16:30:05 | 显示全部楼层
https://www.amobbs.com/forum.php?mod=viewthread&tid=5612146&highlight=%E7%8A%B6%E6%80%81%E6%9C%BA
你参考一下我师傅设计的“状态机”
我看你的需求更像是菜单管理系统,建议你搜一下"傻孩子"大神的按键菜单,更符合你的需求。
https://www.amobbs.com/thread-4001689-1-1.html

出0入0汤圆

发表于 2017-8-1 17:30:07 | 显示全部楼层
磊磊映画 发表于 2017-8-1 16:30
你参考一下我师傅设计的“状态机”
我看你的需求更像是菜单管理系统,建议你搜一下"傻孩子"大神的按键菜单 ...

恩,是的,使用结构体的方法,用作菜单及各子菜单,简单实用,而且方面管理。

出0入0汤圆

发表于 2017-8-1 17:34:22 | 显示全部楼层
回调函数的精神,定时器定时中断扫描,各按键长短时不同作用全可以作出来。

出0入0汤圆

发表于 2017-8-1 17:51:22 | 显示全部楼层
jssk01 发表于 2017-8-1 17:30
恩,是的,使用结构体的方法,用作菜单及各子菜单,简单实用,而且方面管理。 ...

菜单修改维护比较方便

出0入0汤圆

 楼主| 发表于 2017-8-1 18:09:16 | 显示全部楼层
我寻思着有什么比较巧妙的方法。。。

目前,我就是采用结构体+函数回调(按键轮训,如果某个按键被按下,触发回调函数)的方式实现的

出10入23汤圆

发表于 2017-8-1 19:42:57 | 显示全部楼层
https://www.amobbs.com/thread-5670258-1-1.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 06:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表