1 独立按键原理
单片机通过检测按键按下前后的高低电平变化,来判断按键是否按下。通过程序的控制,就可以实现不同的功能与设置。机械式按键在按下或者释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点稳定下来。抖动时间长短与开关的机械特性有关,一般为 5~10ms。在触点抖动期间检测按键的按下与否,可能会导致判断失误,为了克服机械抖动所产生的影响,必须采取消抖措施,可分为硬件消抖和软件消抖。
2 消抖措施
- 硬件消抖:硬件消抖一般会在按键两端并联电容,通过电容的充放电作用将按键按下时的高频振荡吸收掉。
- 软件消抖:软件消抖一般是通过延时。当检测到按键按下时,不会立即去检测电平,而是经过短暂的延时之后,再去检测当前引脚的电平。
3 软件消抖示例
可以在第一次检测到按键按下之后,延迟一定的时间,等按键稳定之后再次检测按键按下,即可以判断按键是按下状态。在按键按下之后就可以执行功能,比如点灯。在按键按下之后可以通过检测按键的引脚状态,判断按键是否松开。示例代码如下:
void key_scan(void)
{
if(gpio_input_bit_get(GPIOA,GPIO_PIN_0) == SET) // 检测 WK_UP 按键按下
{
/* 延迟消抖 */
delay_1ms(20);
if(gpio_input_bit_get(GPIOA,GPIO_PIN_0) == SET) // 再次检测 WK_UP 按键按下
{
/* WK_UP 按键按下执行功能 */
gpio_bit_toggle(GPIOE,GPIO_PIN_3); // LED1 电平状态翻转
printf("key press!\r\n");
while(gpio_input_bit_get(GPIOA,GPIO_PIN_0) == SET); // 检测 WK_UP 按键松开
printf("key release!\r\n");
}
}
}
注意:仅展示关键部分代码块。