外部中断的按键抖动(按键消抖)

当我们写完一个外部中断程序测试时,例如按键计数和按键点亮led灯,我们可能会遇到一次按键按下松开却触发了多次外部中断,这是因为按键抖动的存在。

一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次,这就是按键抖动。为了避免产生这种现象的方法就是按键消抖。

按键消抖分为两种方式:硬件消抖和软件消抖。

硬件消抖:

RS触发器为常用的硬件去抖。下图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为0;当键按下时,输出为1。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。

外部中断的按键抖动(按键消抖)_第1张图片  

软件消抖: 

方法1:使用延时

检测出按键按下后执行一个延时程序(5ms~10ms的延时),让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

方法2:检测多次

 可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下。

软件延时方法1代码:

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit led_sel=P2^3;
sbit key1=P3^2;
uchar led;

void Init()
{
	P0M1=0x00;
	P0M0=0xff;
	P2M1=0x00;
	P2M0=0xff;
	EA=1;        //打开总中断
	EX0=1;       //打开外部中断0
	IT0=1;       //设置为下降沿触发
	led_sel=1;	
}

void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	Init();
	led=0x01;
	while(1)
	{
		P0=led;
	}
	
}
void ex0() interrupt 0
{
	Delay5ms();
	if(key1==0)
	{
		while(!key1);
		Delay5ms();
		if(led==0x80)
			led=0x01;
		else
			led=led<<1;
	}
}

(若有不足和错误,还请各位斧正)

你可能感兴趣的:(STC-B,单片机)