您的位置 首页 新品

C51按键程序编写的根底

从这一章开始,我们步入按键程序设计的殿堂。在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。输入可以分很多种情况,譬

从这一章开端,咱们步入按键程序设计的殿堂。在根据单片机为中心构成的运用体系中,用户输入是必不可少的一部分。输入能够分很多种状况,比如有的体系支撑PS2键盘的接口,有的体系输入是根据编码器,有的体系输入是根据串口或许USB或许其它输入通道等等。在各种输入途径中,更常见的是,根据单个按键或许由单个键盘依照必定摆放构成的矩阵键盘(队伍键盘)。咱们这一华章首要评论的目标便是根据单个按键的程序设计,以及矩阵键盘的程序编写

◎按键检测的原理
常见的独立按键,信任咱们并不生疏,各种常见的开发板学习板上到处能够看到他们的身影。

总共有四个引脚,一般状况下,处于同一边的两个引脚内部是衔接在一同的,怎么分辩两个引脚是否处在同一边呢?能够将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们衔接一同,以标明它们俩是相连的。假定无法调查得到,用数字万用表的二极管挡位检测一下即可。搞清楚这点十分重要,关于咱们画PCB的时分的封装很有利。
它们和咱们的单片机体系的I/O口衔接一般如下:

关于单片机I/O内部有上拉电阻微操控器而言,还能够省掉外部的那个上拉电阻。简略剖析一下按键检测的原理。当按键没有按下的时分,单片机I/O经过上拉电阻R接到VCC,咱们在程序中读取该I/O的电平的时分,其值为1(高电平); 当按键S按下的时分,该I/O被短接到GND,在程序中读取该I/O的电平的时分,其值为0(低电平) 。这样,按键的按下与否,就和与该按键相连的I/O的电平的改变相对应起来。定论:咱们在程序中经过检测到该I/O口电平的改变与否,即能够知道按键是否被按下,然后做出相应的呼应。全部看起来很夸姣,是这样的吗?

◎实践并非抱负
在咱们经过上面的按键检测原理得出上述的定论的时分,其实疏忽了一个重要的问题,那便是实践中按键按下时分的电平改变状况。咱们的定论是根据抱负的状况得出来的,就如同下面这幅按键按下时分对应电平改变的波形图相同:

而实践中,因为按键的弹片触摸的时分,并不是一触摸就紧紧的闭合,它还存在必定的颤动,虽然这个时刻十分的时刻短,可是关于咱们履行时刻以us为核算单位的微操控器来说,
它太漫长了。因此,实践的波形图应该如下面这幅示意图相同。
这样便存在这样一个问题。假定咱们的体系有这样功用需求:在检测到按键按下的时分,将某个I/O的状况取反。因为这种颤动的存在,使得咱们的微操控器误以为是屡次按键的按下,然后将某个I/O的状况不断取反,这并不是咱们想要的作用,假定该I/O操控着体系中某个重要的履行的部件,那成果更不是咱们所等候的。所以乎有人便提出了软件消除颤动的思维,道理很简略:颤动的时刻长度是必定的,只需咱们避开这段颤动时期,检测安稳的时分的电平不久能够了吗?听起来的确不错,并且实践运用起来作用也还能够。所以,各式各样的书本中,在说到按键检测的时分,总也不忘说道软件消抖。就像下面的伪代码所描绘的相同。(假定按键按下时分,低电平有用)

If(0 == io_KeyEnter) //假定有键按下了
{
Delayms(20) ; //先延时20ms避开颤动时期
If(0 == io_KeyEnter) //然后再检测,假定仍是检测到有键按下
{
return KeyValue ; //是真的按下了,回来键值
}
else
{
return KEY_NULL //是颤动,回来空的键值
}
while(0 == io_KeyEnter) ; //等候按键开释
}

乍看上去,的确挺不错,实践中呢?在实践的体系中,一般是不允许这么样做的。为什么呢?首要,这儿的Delayms(20) , 让微操控器在这儿白白等候了20 ms 的时刻,啥也没干,考虑我在《学会开释CPU》一章中所提及的几点,这是不可取的。其次while(0 == io_KeyEnter) ;更是程序设计中的大忌(很少的特殊状况破例)。任何非极点状况下,都不要运用这样句子来阻塞微操控器的履行进程。原本是等候按键开释,成果CPU就一向死死的盯住该按键,其它工作都不管了,那其它工作不干了吗?你赞同他人可不会赞同所以合理的分配好微操控的处理时刻,是编写按键程序的根底。

◎消除颤动有必要吗?

的确,软件上的消抖的确能够确保按键的有用检测。可是,这种消抖的确有必要吗?有人提出了这样的疑问。颤动是按键按下的进程中发生的,假定按键没有按下,颤动会发生吗?假定没有按键按下,颤动也会在I/O上呈现,我会马上把这个微操控器锤了,永久不必这样一款微操控器。所以颤动的呈现即意味着按键现已按下,虽然这个电平还没有安稳。所以只需咱们检测到按键按下,即能够回来键值,问题的关键是,在你履行完其它使命的时分,再次履行咱们的按键使命的时分,颤动进程还没有完毕,这样便有或许形成重复检测。所以,怎么在回来键值后,避免重复检测,或许在按键一按下就履行功用函数,当功用函数的履行时刻小于颤动时刻时分,怎么避免再次履行功用函数,就成为咱们要考虑的问题了。这是一个仁者见仁,智者见智的问题,就留给咱们去考虑吧。所以消除颤动的意图是:避免按键一次按下,屡次呼应。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/258921.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部