方法一:
1.在主程序中检测按键状态是否发生变化,如果发生变化判断按键是否弹起,如果弹起则做相应的键值处理。
2.在定时器中断中获取按键状态并消抖。
参考:
unsigned char key_sta = 1; // 定义按键状态值为 1,抬起状态
void main(void)
{
unsigned char backup = 1;// 按键抬起为1
while(1·)
{
if(key_sta != backup)
{
if(backup ==0)// 判断按键是否已抬起
{
// 键值处理
}
backup = key_sta;
}
}
}
void interrupt_service() interrupt 1 // 定时器0中断服务函数 ,每2ms进入一次中断
{
static key_buf = 0xff;
key_buf = (key_buf <<1) | KEY1
if(key_buf == 0)// 如果连续8次检测都为0,即16ms内无抖动
{
key_sta = 0;
}
else if(key_buf == 0xff)// 如果连续8次检测都为1
{
key_sta = 1;
}
}
矩阵按键检测可用类似方法。
方法2:
不使用定时器,使用扫描。检测管脚为单片机一输入管脚,此管脚配置为下拉输入模式,正常情况下单片机一直检测到的是低电平,按键按下检测到高电平。
思路:
实现函数:
uint8_t Key_Scan(void)
{
static uint8_t KeySta = 0;
enum
{
KEY0;
KEY1;
KEY2;
};
if((KEY1_VAL == 0)&&(KEY2_VAL == 0)) // 处于待机状态
{
KeySta = KEY0;
}
if((KEY1_VAL == 1)&&(KeyHandle_Flag == 0))
{
KeySta = KEY1;
KeyHandle_Flag = 1;
}
else if((KEY2_VAL == 1)&&(KeyHandle_Flag == 0))
{
KeySta = KEY2;
KeyHandle_Flag = 1;
}
else
{
KeySta = KEY;
}
return KeySta;
}