热度 17
2014-12-18 16:20
950 次阅读|
2 个评论
系统节拍 系统节拍这个概念我见还是挺多人提起的,下面我想讲讲我所理解的系统节拍。 开撸之前我们先来扯扯按键扫描,我相信玩过单片机的基本上都调过按键,行列扫描或是反转扫描。按键的编程工作我个人分为三步,扫描按键、消抖、等待按键结束,我第一次了解delay这个概念就是为按键消抖的时候接触的,消抖时间延时10Ms,从此走上不归路!!!哈哈,开个玩笑,继续撸。当我们外接设备不多,准确的说应该是输入设备不多的时候,delay的弊端不是很明显,但是当输入设备多了而且都是需要经常的进行扫描的时候,像延时10Ms这种让CPU白白空转的行为是非常深痛恶绝的,因为很可能在扫描按键的时候另一个输入设备进来一个比较重要的消息,而我们的单片机还在delay或者等待按键结束里面。但是扫描按键没有消抖以及等待一次按键结束就对键值进行处理的话,弊端不用我说,大家应该也是知道的。那有什么办法解决这个问题呢,我们的解决思路是不是应该考虑怎么去利用好这消抖和等待按键结束的时间,让CPU在这个时间内不是白白空转,而是去做其他的事情。这个时候,系统节拍就该上场了。 面对上面的问题,我们可以在单片机里面开一路定时器,让他每隔一段时间(我们这里设置为10Ms)触发一次中断,而在中断服务程序里面我们进行按键扫描,判断是否有按键动作发生(如在51单片机上时,没有按键动作I/O口电平为0xFF,若按键值为0xFF,则说明没有按键动作发生),若有按键动作发生,将得到的按键值用一个静态变量保存起来,然后去扫描其他输入设备,输入设备都扫描完毕之后退出中断服务函数,如果在中断服务中其他输入设备有消息进来,则对这个消息进行处理,然后10Ms的间隔到之后,继续进入中断服务程序里面,再次对按键进行扫描,得到按键值之后先判断按键值跟上一次的按键值进行对比,若相同,按键值有效,若不相同,先判断是不是0xFF,如果是0xFF则说明按键动作结束,在退出中断服务后将按键值进行处理。若不相同,则上一次的按键值无效,保存当前的按键值。 大家注意到没有,我们原来用于消抖的10Ms以及用于等待按键动作结束所浪费的时间现在就很好的利用起来了。上述所说的每隔一段时间(10Ms,这个值可根据实际情况设定)我们称为系统节拍,相应的中断服务程序叫做系统节拍服务程序。 撸完了,讲的不是很详细,大伙看心情拍砖吧