一、准备
原理图
板子上共有四个按键,PB0-3和PA0。按键没有按下时引脚为高电平,按下后电路接通,此时引脚为低电平。
二、原理
按键的机械触点断开、闭合时,由于弹性作用,按键在闭合时不会马上稳定接通,在断开时也不会马上断开。在闭合及断开的瞬间都会有一连串的抖动,消除抖动的方法就是按键消抖。
按键抖动的持续时间一般在5ms~10ms,我们只需要在
三、CubeMX配置
基础配置与之前相似。然后只需将需要用到的按键配置为input模式即可。
四、代码
主程序
代码的实现方式比较基础,并且采用的是延时函数,还有很大的改进空间。
if(0 == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))//判断按键是否按下
{
HAL_Delay(10);//延时10ms
if(0 == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0))//再次判断按键是否按下
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关闭锁存器
}
}
else if(0 == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))//判断按键是否按下
{
HAL_Delay(10);//延时10ms
if(0 == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1))//再次判断按键是否按下
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关闭锁存器
}
}
HAL_Delay函数
这个延时函数就是重复执行空语句,浪费运算资源。程序不会继续向下执行,加入延时时间很长还会导致程序卡顿。
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
HAL_GetTick函数
这个函数返回uwTick,uwTick是由systick计数的,systick会让uwTick每ms加1,uwTick的数据类型是uint32_t的所以他的计数时间很长,理论上是2的32次方ms。
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}