单片机上按键程序的写法– 以轻触开关为例- The One's Blog

我是电子科大计算机专业的,刚学单片机不久,想写几篇文章出来和大家一起探讨。对于一个由单片机为核心构成的系统而言,输入通道是相当重要的。所以就写了这篇文章出来。

我想对于图片中的这个轻触开关大家应该都不会陌生。一般情况下,开关与单片机的连接电路是如下图所示的这种情况:

图中的电阻R的阻值一般取4.7K~10K之间,对于端口内部有上拉电阻的单片机来说,这个电阻可以省略。对于图中的这种情况,当开关S按下时,P17引脚上的电平为低电平,就表明开关已经按下;反之,为高电平时,说明开关没有按下。从理论上来讲,当我们按下按键时,P17上的波形应该是这样的:

?????????????? 当按键按下时,波形马上就变为0了。看似挺简单,但实际上,事情不仅仅如此。这只是理想状态下的理想波形图。下面这个波形图才是真实的情况。我想大家应该都能看出来这幅图片与上面那幅的区别。由于按键的机械特性。当按键闭合时,并不能马上保存良好的接触,而是来回弹跳。这个时间很短,我们的手根本感觉不出来。但是对于一秒钟执行百万条指令的单片机而言,这个时间是相当的长了。那么在这段抖动的时间内,单片机可能读到多次高低电平的变化。如果不加任何处理的话,就会认为已经按下,或者松开很多次了。而事实上,我们的手一直按在按键上,并没有重复按动很多次。要想能够正确的判断按键是否按下就要避开这段抖动的时间。根据一般按键的机械特点,以及按键的新旧程度等而言,这段抖动的时间一般在5MS~20MS之间。

我想看到这里,大家应该明白该怎么做了。看看下面这幅流程图:
Click Here To EnLarge

这是很多教科书上的做法,可惜这个方法没有全面考虑到实际情况,我们根据这幅流程图的代码看看:

unsigned char v_ReadKey_f( void )
{
????????unsigned char KeyPress ;
????????if( P17 == 0)
????????{
????????????????Delay(20) ;??????????????? //延时20MS
????????????????If( P17 == 0)
?????????????? {
???????????????????????? KeyPress = 1 ;
???????????????????????? While( !P17) ;????????? //等待释放
?????????????? ?}
?????????????? else
?????????????? KeyPress = 0 ;
?????????}
}

一旦有键按下,它先是浪费了CPU的大部分时间(就是那个什么事情都没做的延时20MS函数)然后,又霸占CPU( 就是哪个死死等在那里的while(P17);语句)直到按键释放。对于这种情况我们是忍无可忍的,那么就让我们彻底的抛弃它吧。那么到底按键扫描函数改如何写呢……..所谓众里寻她千百度,蓦然回首,那人却在灯火阑珊处。如果我们把CPU延时的那20MS拿出来去做其它事情,那么不就充分利用CPU的时间了吗。而一般情况下我们只要前沿去抖动就可以了。也就是说了,我们只需在按键按下后去抖就可以了,对于按键的释放抖动可以不必要过于关注。当然这主要和应用的场合有关。一个能有效识别按键按下并支持连发功能的按键已经能够应用到大多数的场合了。

(未完待续……….www.wangcongyu.com O(∩_∩)O~)

, ,

郑重声明:资讯 【单片机上按键程序的写法– 以轻触开关为例- The One's Blog】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——