当单片机系统使用的按键数量不多时,可以直接把按键连接在单片机的I/O与地之间,利用单片机I/O接口高电平的易失性实现按键的输入。单片机运行过程中,由于按下按键产生的抖动持续时间很短,程序先不对按键检测处理,可延时一段时间跳过按键的抖动时间,当按键按下达到稳定状态时再对按键的状态检测,从而实现按键的消抖。下面通过几个例子说明按键程序的处理过程。
单只按键测试电路如图3-12所示。其中,P1.4接口作为按键key1输入,完成对LED的闪烁控制。程序运行时,要求每次按下按键,LED闪烁一次。LED受按键控制的方式有两种情况:一种是按下按键后抬起有效;另一种是按下按键即有效。
图3-12 利用延时函数消除键盘抖动实现键盘输入电路
图3-13 按键按下抬起有效处理流程
1.按键抬起有效
不同的人对按下按键的时间长短有很大差别,按下按键抬起有效控制方式主要是为了避免按下按键所停留(粘滞)时间对控制结果的影响。在程序设计时,按下按键抬起有效控制编程时需要注意几个方面:首先,按键抖动时间一般在10ms以内,按键按下需要消除抖动;第二,按键按下不管时间有多长,LED都不受控制;第三,按键抬起的一瞬间LED状态才发生改变。按键按下程序处理过程如图3-13所示。
根据按下按键抬起控制有效的处理过程,我们可以编写下列程序:
本项目程序共含有3个函数,主函数调用按键函数,按键函数又调用了延时函数。在按键函数中,程序检测到按键按下后并不是马上处理,而是经过延时后再重新检测处理。程序设计完成后可以利用软件仿真验证。在仿真电路中,单片机采用80C51,按键采用Swhitches&Relays下的Button。
在系统对时间要求不是很精确的情况下,延时时间可通过运行一个延时函数得到,如项目中所用到的延时函数delay(unsigned int x),我们可以在Keil软件的调试过程观察延时时间与x大致关系。受C语言编译效率、系统执行速度等因素影响,利用确定的x去设置延时时间误差一般很大,如delay(300)实现的延时并不是delay(30)的10倍。(www.xing528.com)
2.按键按下有效程序
按下按键有效对LED控制方式,要求按键按下立即对LED的状态进行控制。根据人的控制习惯,按键的程序能够实现的功能有:①按下按键需要消除抖动;②按下按键就能改变LED状态,每按一次改变一次,速度不能限制;③按键长时间被按压,LED先在按键按下瞬间改变一次,然后等待一段时间(比如2s左右),LED状态自动转换;④按键抬起时不对LED控制。按键按下有效的程序设计,可以在按钮抬起有效的程序上修改,但本项目按键处理程序要比按键抬起有效的要复杂。下面我们通过分析按键功能,分别说明按键处理程序设计方法。
1)按下按键经过消抖后就应立即控制LED的状态,程序如下:
2)重复按压按键可立即控制LED,需要记录按键状态,程序如下:
由于单片机的程序是顺序执行的过程,程序运行时,按键检测速度很快,按下按键即可对LED进行控制,所以把以上3个处理过程结合起来,即可实现按键按下有效控制。本项目完整的程序如下:
程序设计完成后,其运行情况可以利用Proteus进行仿真验证,这个过程请读者自己进行。采用按键接地的输入方法在单片机系统中经常用到,其缺点是一个按键需要占用一个I/O资源。在复杂的单片机系统中,单片机的I/O资源一般很紧张,为了减少按键对I/O的占用,多按键输入常利用键盘编码器或矩阵式键盘。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。