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

2019-12-26 18:55发布

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

我急切希望有一种比较好的状态机编程思路,让我重新“改造”这段程序。
还望大神提供思路(或者资料,或者书籍都行),最好举个简单的例子,在此先拜谢大神(这种按键程交互很多项目都能使用到,此处帮助了我,也顺便帮助了其它初学者,算是功德无量。。。)。。。再次感谢。。。
6条回答
jssk01
1楼 · 2019-12-26 22:26.采纳回答
磊磊映画 发表于 2017-8-1 16:30
你参考一下我师傅设计的“状态机”
我看你的需求更像是菜单管理系统,建议你搜一下"傻孩子"大神的按键菜单 ...

恩,是的,使用结构体的方法,用作菜单及各子菜单,简单实用,而且方面管理。
磊磊映画
2楼-- · 2019-12-26 20:47
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

xf331785508
3楼-- · 2019-12-27 03:13
 精彩回答 2  元偷偷看……
磊磊映画
4楼-- · 2019-12-27 07:20
jssk01 发表于 2017-8-1 17:30
恩,是的,使用结构体的方法,用作菜单及各子菜单,简单实用,而且方面管理。 ...

菜单修改维护比较方便
擦鞋匠
5楼-- · 2019-12-27 08:23
我寻思着有什么比较巧妙的方法。。。

目前,我就是采用结构体+函数回调(按键轮训,如果某个按键被按下,触发回调函数)的方式实现的
zouzhichao
6楼-- · 2019-12-27 11:58

一周热门 更多>