我在上一篇文章写了一段用于获取系统状态的Python代码,同时还放出了一个Demo视频,在本篇文章中我就将介绍一下实现这一系统的主要思路和代码框架。首先,下面上正式版的视频:

看完了成品,那么我们就来一步步分析,这个东西是如何做出来的,Adafruit提供的LCD Key Pad的驱动程序提供了一些很基本的使用这个板子的方法,其中最为核心的就是:

  • 在屏幕上显示文字
  • 清空屏幕上的文字
  • 获取按钮的使用状态

有了这些,我们就具备了对这块屏幕几乎于完整的操控能力,那么实现一个有菜单、能调用相关功能的UI就变成了纯粹的软件问题。考虑到这个程序只是简单的调用系统指令,并不具备复杂的功能,所以我采用状态机来实现UI的整体逻辑,关于选用它的优点,也会在下文中提到的。先不要被状态机三个字吓到,来看下面这个图:

1

不要觉得这个复杂哟,跟我一起来解读一下你就能理解了。这个图描述的是LCD UI的前两个菜单项,从左边的圆圈开始:

程序一启动,首先是进入主菜单,第一个菜单项是SYSTEM INFO,如果在这个界面按下SELECT按键,程序就会进入具体的功能,来显示出系统信息,这其中包含了CPU/MEMORY INFO,当我们不需要看这个信息,想要返回主菜单的时候,按LEFT按键,就会返回到SYSTEM INFO菜单项。

而在处于SYSTEM INFO菜单项界面时按RIGHT键,就会切换到第二个菜单项NETWORK INFO,此时若是再按一下LEFT键,就会再次切换回第一个菜单项,这样使用者使用的感受就像是通过LEFT和RIGHT按键来选择菜单一样。

这样看这个图就很明了了吧?更具体的,上述过程在实际LCD Key Pad上就是这样的:

2

理解了上面的内容,我们就来稍微增加一点难度,当进入某个功能后,我需要有翻页功能怎么办?我们来看第一张图的右半部分:和第一个菜单一样,按下SELECT按键后,就会进入这个菜单的功能页面,这里叫DEFAULT NETWORK,这个页面显示第一条网卡信息,在这个页面按下UP或者DOWN按键后,就会进入UP状态页面或者DOWN状态页面,在进入这些状态的时候,程序需要选择“上一条”网卡信息或者“下一条”网卡信息来显示,在UP页面下再按UP键则会再次激活一下进入这个状态的程序,也就是会显示更上一条的网卡信息,而按下DOWN按键呢,就会进入DOWN状态的流程了……希望我没有把你说晕。再这些子界面下按LEFT的话就能退回到主菜单,这样一来,就实现了在菜单功能页面的翻页功能。

说了半天,其实这张图就是一个用来描述状态机的状态转移图,我们用这张图描述了整个UI的界面逻辑以及在接收用户操作后显示/执行的内容,是不是很简单?通过构造这个图,我们就可以把我们的功能一点点的整合进来。

在程序中构造状态转移图的一种方法就是,构造状态转移表,例如上面图中的状态转移可以用下面的表来描述:

3

二维的表格是很容易用代码来表达的,这里就不过多赘述,大家可以参考源代码中的写法。

构造好这个表,我们就只需要一段代码就可以让我们的用户界面跑起来:

这一小段代码的关键点就是,在程序运行过程中,需要不断的捕获按键的信息,当产生了按键操作的时候,就按照已经够造好的状态转移表进行状态转移,同时通过show()方法刷新LCD。

最后额外提及一点,和上一次的视频不同的是,除了功能更加完善之外,还有一些特殊的自定义字符的应用,这些字符的应用使得整个UI看上去更加友好,也更加的高大上了,其实Adafruit的驱动提供了创建自定义字符的方法,但是却没有详细说明自定义字符的数据结构……不过心里痒痒,所以查找了很多资料,现在把使用方法总结如下:

需要注意的是,1602LCD只支持最多8个自定义字符,也就是说你每次显示的时候最多出现8个自定义的字符,虽然有这个限制,但是你可以随时随地地更改这一自定义字符集,也就是说做个动画是不成问题的,关于自定义字符更强大的使用,我将在下一篇文章中进行介绍。

详细的代码可以猛击https://github.com/Blueve/RaspberryPiKit

说点什么

您将是第一位评论人!

提醒
wpDiscuz