基于stm32f4的按键检测
所谓按键检测,即是检测按键是长按,还是短按。(长按、短按由按键的时间的长短来衡量)通过查阅相关资料,找到了两种比较好理解的按键检测方法。一种是通过输入捕获的方式检测按键按下前后的电平转换时间,来判断按键是长按还是短按;另外一种是通过将按键扫描函数放在定时器中断里,检测按键按下前后的电平转换时间,进而判断按键状态 。但总的来说,以上这两种方式所用的方法是类似的,即通过检测电平转换时间的长短,从而确定按键是长按还是短按。 第一种方式对应部分源码如下:
long long temp=0;
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=0XFFFFFFFF;
temp+=TIM5CH1_CAPTURE_VAL;
printf("HIGH:%lld us\r\n",temp);
if(temp>=500000)
{
switch_flag=1;
}
else if(temp>=100000)
{
switch_flag=0;
}
第二种方式对应部分源码如下:
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
Key_scan();
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
void Key_scan(void)
{
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) )
{
delay_ms(20);
count++;
}
else
{
if(count>100)
{
switch_flag= 1;
}
else if(count>10 && count <100)
{
switch_flag= 0;
}
else
{
delay_ms(20);
}
count=0;
}
...
}
而在判断出按键状态之后,可以简单地实现检测单个按键连续两次按下的相关状态。如一个按键短按一次,长按一次,控制LED翻转;随后再短按一次,长按一次,控制LED翻转。部分代码如下;
unsigned int switch_flag=1;
unsigned int switch_flag_old=1;
unsigned int switch_flag_state=0;
static unsigned int switch_flag_old=1;
if((switch_flag==1)&&(switch_flag_old==0))
{
if(switch_flag_state==0)
switch_on();
else
switch_off();
}
switch_flag_old=switch_flag;
void switch_on(void)
{
LED1=!LED1;
switch_flag_state=1;
}
void switch_off(void)
{
LED1=!LED1;
switch_flag_state=0;
}
在实际调试过程中,参照了之前产生上升沿波形的例子。而对switch_flag,及switch_flag_old的初值设置为1,可以避免在第一次按键长按时,就会进入按键判断语句,从而使功能有误。完整代码已通过正点原子stm32f407开发板检测。欢迎各位指正。
|