按键按下都会发出一声响,虽然有的按键声音很轻微,但这都是金属导体碰撞产生的震动,这种现象称为键盘抖动。如果不对键盘的抖动进行处理,按键会对系统电路或程序产生意外的干扰。
按键按下产生的抖动现象持续的时间不会很久,因此在按键按下后,可延时一段时间跳过抖动,再对按键的状态检测,从而利用延时的方法也可以实现键盘输入。本案例通过两个按键设计,实现对数码管显示数据的调整。利用延时函数消除键盘抖动实现键盘输入电路如图所示:

图中,KEY1、KEY2两个键盘一端分别接P3.0、P3.1,另一端接地,数码管仍使用共阳极数码管。在Proteuse软件中,按键的英文名字为BUTTON,在Switches& Relasy下的Switches里。现在实现两个按键控制数码显示的数字,其中KEY1按下使数字增加,数字到9后变为0,依次循环;KEY2按下使数字减小。
验证程序如下:
#include<reg51.h>#define uchar unsigned charuchar code seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit key1 = P3^0;sbit key2 = P3^1;uchar key1_state,key2_state; //按键按下的状态变量void delay(uchar i){while(i) i--;}void key_scan(void) //键盘扫描函数{if(key1 == 0) //如果按键按下{delay(200); //延时一段时间,消除键抖while(key1 == 0);key1_state = 1; //再对按键检测,如果确实按下,按键状态变量为1}if(key2 == 0){delay(200);while(key2 == 0)key2_state = 1;}}void main(void){char i;while(1){key_scan(); //调用键盘扫描函数if(key1_state == 1) //判断键盘状态变量,如果为1,说明有按键按下{i++; //显示数据增加key1_state = 0; //数据增加后,键盘状态变量清零if(i>9) i = 0; //数据增加超过9后,回到0}if(key2_state == 1){i--;key2_state = 0;if(i < 0) i = 9;}P0 = seven_seg[i]; //显示键盘调整数据P2 = 0xfe; //数码管SEG0显示}}
如果按键按下不放开,程序一直执行语句while(key1==0),这时程序在此处死循环,不能执行其它程序,所以本案例按键抬起后数据才能得到调整。
仿真电路如图:

该博客介绍了如何通过延时方法消除键盘抖动,以实现按键控制数码管显示数字的调整。在Proteus环境中,使用两个按键(KEY1和KEY2)分别控制数码管数字的增加和减少,当按键按下时,数字会在0到9之间循环变化。程序中包含了键盘扫描函数key_scan()和延时函数delay(),确保在按键抬起后数据才会得到更新。通过仿真电路验证了程序的正确性。

9641

被折叠的 条评论
为什么被折叠?



