近日学习单片机,做按键时加了防抖,但是一不小心就变成了连按,如果防抖时间再加长,又影响程序执行。最后加了个按钮释放检测,解决了不小心变成连按的问题。
//----------------------独立按键-------------------------------------------------------------------
//4位独立按钮测试,带防抖功能及防止长按功能
//--------------------------------------------------------------------------------------------------
#include <pic.h>
#include "Keyboard.h"
void Key_Init()
{
TRISC=0xF0; //高4位输入,检测按键,低4位输出,输出声音
//Beep=0;
}
//---------------------------------------------------------------------------------------------------
//按键提示音
//n是响几声,l=0时响约50ms,l>0时响约500ms。
//---------------------------------------------------------------------------------------------------
void Beep_Beep(INT8U n,INT8U l)
{
do
{
Beep=1;
if(l>0)
__delay_ms(500);
else
__delay_ms(50);
Beep=0;
if(l>0)
__delay_ms(500);
else
__delay_ms(50);
}while(1<n--);
}
//---------------------------------------------------------------------------------------------------
//检测按键,防止长按。长按也是只显示按一次。
//---------------------------------------------------------------------------------------------------
char Key()
{
if(Key1==0) //如果按键按下
{
__delay_ms(10); //延时10ms
if(Key1==0) //继续检测是否按下,如果是就是代表按钮按下了,如果否就是抖动
{
while(!Key1); //等待按钮释放后返回按钮值,以防止释放不及时产生连按
return 1;
}
}
if(Key2==0)
{
__delay_ms(10);
if(Key2==0)
{
while(!Key2);
return 2;
}
}
if(Key3==0)
{
__delay_ms(10);
if(Key3==0)
{
while(!Key3);
return 3;
}
}
if(Key4==0)
{
__delay_ms(10);
if(Key4==0)
{
while(!Key4);
return 4;
}
}
return 0;
}
头文件
//----------------------独立按键--------------------------------------------
//4位独立按钮测试,带防抖功能
//--------------------------------------------------------------------------
#define Beep RC3
#define Long_Beep 1
#define Short_Beep 0
#define Key1 RC4
#define Key2 RC5
#define Key3 RC6
#define Key4 RC7
#define _XTAL_FREQ 4000000UL
#define INT8U unsigned char
//----------------------------------------------------------------------------
//函数申明
//----------------------------------------------------------------------------
void Beep_Beep(INT8U n,INT8U l);
void Key_Init();
char Key();