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

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

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