驱动层的另外一个功能是为了上层提供消息接口 。 我们用了类似window程序的消息的概念 。 这里可以提供一些按键消息 , 例如:按下消息 , 松开消息 , 长按键消息 , 长按键的时候的步进消息 , 等等 。
应用层属于最上层的程序 , 这里就是根据项目的不同分别写按键功能程序 。 它使用的是驱动层提供的消息接口 。 在应用层写程序的思想就是 , 我不管下层是怎么工作的 , 我只关心按键消息 。 有按键消息来的时候我就执行功能 , 没有消息来的时候 , 我就什么也不做 。
下面用一个简单的常用的例子 , 说明我们这个设计思想的用法 。
秒表调整时间的时候 , 要求按着某个按键不放 , 时间能连续的向上增加 。 这个东西很实用 , 实际的家电中用途很广泛 。
在看下面的东西之前 , 大家可以想一下 , 这东西难吗?相信大家都会很响亮的回答 , “不难!!” , 然而我再问:“这东西麻烦吗?”我相信很多人肯定会说“很麻烦!!” 这不禁让我想起开始学单片机的时候写这种按键的那程序 , 乱七八糟的结构 。 如果不相信的话 , 可以自己用51写一下哦 , 那样就更加能体会本文说的分层结构的优越性 。
项目要求:
两个按键 , 分别分配在P10 和P20 , 分别是“加”“减”按键 , 要求长按键的时候实现连续加和连续减的功能 。
实战:
假设按键上拉 , 没有按键的时候高电平 , 有按键的时候低电平 , 另外 , 为了突出问题 , 这里没有将延时消抖的程序写上去 , 在实际项目中应该加上 。 C语言函数参数的传递多种多样 , 这里作为例子 , 用了最简单的全局变量来传递参数 , 当然你也可以用 unsigned charReadPort(void)返回一个读键结果 , 甚至还可以 void ReadPort(unsigned char*pt) 用一个指针变量传递地址而达到直接修改变量的目的 。 方法是多种多样的 , 这个决定于每个人的程序风格 。
1)开始写硬件层程序 , 完成映射
#defineKYE_MIN 0X01#defineKEY_PLUS 0X01unsignedchar KeyDat;voidReadPort(void){if (P1 & KEY_PLUS == 0 ) { KeyDat |= 0x01 ; if (P2 & KEY_MIN == 0 ) { KeyDat |= 0x02 ;
C语言应该很容易看懂吧?如果 KEY_PLUS 按下 , P10口读到低电平 , 则 P1 &KEY_PLUS 的结果为 0 (xxxx xxx0 & 0000 0001) , 满足if 的条件 , 进入KeyDat |=0x01 是将 KeyDat 的bit0 置一 , 也就是说 , 将 KEY_PLUS 映射到 KeyDat 的 bit0
KEY_MIN是同样的道理映射到 KeyDat 的 bit1 , 如果 KeyDat 的 bit0 为 1, 则说明 KEY_PLUS 按下 , 反则亦然 。
不需要想的很神秘 , 映射就是这么一回事 。 如果还有其他按键的话 , 用同样办法 , 将他们全部映射到 KeyDat 上面 。
2)驱动层程序编写
如果将 KeyDat想象成 P1 口 , 那么这个跟学习板那标准的扫描程序不就是一样了吗?对的 , 这个就是底层映射的目的了 。
3)应用层程序编写
根据消息 , 硬件层是必须分离出来 , 然而驱动层和应用层的要求就不那么严格了 , 事实上一些简单的项目没有必要将这两层分离开来 , 根据实际应用灵活应对就可以了 。
其实这样写程序是很方便移植的 , 根据板子的不同而适当的修改一下硬件层那个 ReadPort 函数就完成了 , 驱动层和应用层很多代码可以不经过修改直接用 , 很能提高开发效率的 。 当然这个按键程序会存在一定的问题 , 特别是遇到常闭按键和点触按键的混合使用的场合 。 这个留给大家自己去想了 , 反正问题总是能找到解决办法的 , 尽管方法有好有坏 。
时间片轮设计思想
先用一个小例子引出今天的主题 , 想象一下 , 一个基本的家电控制板 , 肯定或多或少的会包含 :LED 或者 数码管显示 , 按键 ,继电器或者可控硅的输出 这3部分 。 数码管需要 10ms到20ms的动态扫描 , 按键也需要20ms左右的延时消抖 , 有没有意识到 , 其实这些时间是同时在进行的 。
回想一下咱们的教科书怎么教 按键 的延时消抖的?没错 , 死循环 , 绝对是原地踏步死循环 , 用指令来计时 。 这样很自然的引发一个问题 , 单片机在原地踏步死循环的话 , 那么其它的工作怎么办?如数码管的动态扫描怎么办?
唯有等按键扫描之后再进行了 , 这样出来的效果 , 数码管肯定会闪烁的 , 扫描时间过长了 , 缩短按键消抖时间也不是解决办法 , 想象如果咱们还有其它很多工作也是同时做的呢?解决办法之一 , 就是今天的主题 , 分时扫描的思想 。 当然不会是唯一的办法 , 只不过俺一直在用 , 觉得这个是非常不错的思想 , 可以解决很多实际问题 。 大胆妄言一下 , 分时扫描的思想也是单片机编程最核心的思想了 , 信不信就由你自己判断了 。
- apache|虚拟现实+眼动追踪精选实战分享:认知“新”健康
- USB|一个月天挣了624,每天看书30分钟,分享我是怎么做的
- oppo k10|618咱来一波游戏旗舰分享,1K-2K价位——OPPO K10!
- CPU|两种实用用的变频器维修方法
- shopee|Shopee怎么做?电霸来教你,转化率提升多维度易忽视细节分享
- 私有云|外观别致,硬件配置越级,零基础也能快速上手,绿联私有云DH2600详测分享
- 操作系统|美国限制分享安全漏洞将捧起石头砸自己的脚,国产系统获发展契机
- 硬盘|6T硬盘只卖260元?二手服务器硬盘值得买吗?经验分享
- 自媒体|分享一个自媒体副业,认真做可以月入6000+
- 操作系统|美出台新规:禁止向我国分享安全漏洞!国内院士:是时候了
