文档详情

单片机按键处理技巧及编程方式.pdf

发布:2017-05-05约9.73千字共9页下载文档
文本预览下载声明
2016-8-6 排版 单片机按键处理技巧及编程方式 By:XiaoHe 单片机按键处理技巧及编程方式 2010-10-23 15:01 从这一章开始,我们步入按键程序设计的殿堂。在基于单片机为核心构成的应用系统中,用户输入是 必不可少的一部分。输入可以分很多种情况,譬如有的系统支持PS2 键盘的接口,有的系统输入是基于编 码器,有的系统输入是基于串口或者USB 或者其它输入通道等等。在各种输入途径中,更常见的是,基于 单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘) 。我们这一篇章主要讨论的对象就是基于 单个按键的程序设计,以及矩阵键盘的程序编写。 ◎按键检测的原理 常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身 影。 总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否 处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示 它们俩是相连的。如果无法观察得到,用数字万用表的二极管挡位检测一下即可。搞清楚这点非常重要, 对于我们画PCB 的时候的封装很有益。 它们和我们的单片机系统的I/O 口连接一般如右图所示: 对于单片机I/O 内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电 阻。简单分析一下按键检测的原理。当按键没有按下的时候,单片机I/O 通过上拉电阻 R1 接到VCC ,我们在程序中读取该I/O 的电平的时候,其值为1(高电平); 当按键S1 按下的时候,该I/O 被短接到GND,在程序中读取该I/O 的电平的时候,其值为0(低 电平) 。这样,按键的按下与否,就和与该按键相连的I/O 的电平的变化相对应起来。 结论:我们在程序中通过检测到该I/O 口电平的变化与否,即可以知道按键是否被按下, 从而做出相应的响应。一切看起来很美好,是这样的吗? ◎现实并非理想 在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中 按键按下时候的电平变化状态。我们的结论是基于理想的情况得出来的,就如同下面这幅按键按下时候对 应电平变化的波形图一样: 1 / 9 2016-8-6 排版 单片机按键处理技巧及编程方式 By:XiaoHe 而实际中,由于按键的弹片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这 个时间非常的短暂,但是对于我们执行时间以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) ; //等待按键释放  }  乍看上去,确实挺不错,实际中呢?在实际的系统中,一般是不允许这么
显示全部
相似文档