FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

  • 东方青
  • LV4工程师
  • |      2015-09-28 09:48:52
  • 浏览量 1417
  • 回复:1

**************************************************************************

                                       东方青学FireBle

                                        ———————转载请注明ICKey————————

**************************************************************************




FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

-----东方青

在前两篇文章《FireBLE裸奔之四欣赏Firefly精心设计之作-五向按键的驱动电路》和《FireBLE裸奔之无五向按键的使用分析》分别详细分析了五向按键电路和五向按键AD键值的采集,本文将使用五向按键作为用户接口来搭建一个简易的MCU软件程序框架!

先解释一下,何为用户接口,其实我们通常遇到的用户接口无非几个按键、触摸、手机端、遥控、显示屏(数码管、LCD等)等等,通过这些东西和MCU建立通信,从而使得用户能对产品或者作品的控制,那么用户会什么时候去操作,MCU是完全不得而知的,所以通常在裸奔代码中,最常用的就是轮询方式检测,这样就可以得到相应的效果!但是,轮询方式我认为只适合小工程,小量处理的代码,在稍微大的工程代码中,如果要用数码管显示数据,采用while轮询显示,很显然是很不靠谱的,显示效果绝对很差。所以MCU裸奔时,一个高效率的软件架构还是很必须的。

OK!言归正传!先看图:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

上图为我总结的一个MCU的简易的程序设计的框架图了!呵呵!咋看着有点像是操作系统呢?呵呵!通常虽然是跑裸机,但是当要处理的信息量足够大的时候,就需要建立一个叫消息池或者也可以用消息队列/栈这些数据结构的东西来获取并保存从外部或者内部自发需要处理的消息,当有消息连续出现时,先将其存放在消息池(下面都叫消息池)中,在while循环中,没轮询玩一次,都向消息池获取消息,然后在根据获取到的消息执行相应的分支处理。这就是大致的思想了。

因为需要由用户进行操作才能产生的消息,不知道是什么时候用户会操作,所以这样的外部的消息通常是放在中断里检测的。比如用户按下按键,将产生外部中断,识别键值,(也有可能是这样的,开启一个定时器,每2ms产生一次中断,在中断里进行按键的扫描,比如矩阵按键,AD按键都可以这样处理),然后发送相应的消息到消息池。就完事了,至于在mian中的while里什么时候获取消息,就有需要处理的数据的量来确定了。

OK!基本上就已经描述清楚了这样的一个简易的MCU裸奔的代码框架。下面就利用FireBLE的五向按键作为用户接口来操作MCU的执行,就是如此简单!

1.获取用户操作产生消息

在此实验中,作为用户,应该操作的是五向按键,所以,用户操作之后,需要识别五向按键的方向键值,然后产生相应的消息。

(1)获取键值,依据如下图:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

所以有如下定义和处理:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

如上图框1即为五向按键的每个方向的AD键值了,最后再根据实际情况定义一下最小值和最大值。框2的宏定义其实就是做键值区间的处理啦!基本上就可以区分出在每个区间内是哪一个按键按下,比较常用的处理方式就是:键值相邻的不同两个按键的AD键值之差除2,再加上小键值,这样就能达到键值相邻的两个按键的区间。然后再将宏定义定义成为一个数组,如下:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

如上图,数组adkey_check_table为五向按键键值区间的定义;adkey_msg_music_table数组为按键对应的消息定义,它对应于按键的键值区间。消息的定义如下:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

没错!就是个枚举!不用解释!你懂的!定义搞定了!

2)那么咱就要处理了。如下:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

以上的两个函数在上一篇文章已经讲过了!没错!我就是在中断里处理键值并产生消息。思路很简单,当有按键按下,采集50AD键值,然后求平均值,然后做按键扫描!所以红框中的按键扫描函数Key_scan(ADC_Value);成为了亮点。且看它如何实现:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

分成两部分!先根据区间识别所按下的是哪一个方向的按键,然后将对于的消息传给msg_key全局变量。嘿嘿!就这么完事了!键值就是这样区分的!

2.消息池和获取消息

关于消息池的实现,在这里我只是简单的介绍!通常我们的消息池的实现是用数据结构中的队列(FIFO)或者栈(LIFO)来实现的,啥意思呢?FIFO就是先进先出,LIFO就是后进先出,这其实就是一段可设定的缓存空间,这样的实现可以用来保存消息数据。

因为在此比较简单,而我也只着重介绍框架!所以在此先不实现消息池,本文以一个全局变量msg_key来存放和传递消息,实现如下:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

这种就是简单的传递了!值得注意的是,闲时我们会将0xff作为无有效消息。

3.任务/分支处理

说白了!其实就是如何调用!我只是示例一下下!如下图:

FireBLE裸奔之六五向按键的键码识别和MCU裸机软件程序框架的设计

获取消息,因为没有消息池,所以直接读取全局变量msg_key的值,但是,也是因为没有消息池的原因,必须干完事后,手动的清消息,即将其赋值为无消息msg_key=NO_MSGmsg_key0xff。然后,蓝色框的123···就是任务/分支123···了。就是这么简单!就是这么完事了。

总结:本文讲述了一个裸机的程序框架的设计!尽管简单,但是这有的框架却可以提高很多相比直接扫描的效率,还有代码的臃肿!

声明:以上内容均为自己的理解,如若有误或者不足,还请赐教!

QQ641251565

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
听雨落凡尘 2015-09-28
学习
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子