前言:最近找了好多写按键模块的方法,大部分都是延时和状态机方法,写了写不是很喜欢,于是找了半天才找到三行按键的代码。
众所周知,我们一般使用的都是机械按键,在我们触碰案件的时候都会出现抖动,所以消抖成了我们不可缺少的一部分,但是使用三行按键法可以完美解决此类问题。话不多说,上代码。
//第一步
uint8_t Key_Scan(void)
{
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
{
return 1;
}
else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
{
return 2;
}
else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
{
return 3;
}
else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
{
return 4;
}
return 0; // No key pressed
}
//第二步
void Key_Pro(void)
{
key_val = Key_Scan();
key_down = key_val&(key_val ^ key_old);
key_up = ~key_val&(key_val ^ key_old);
key_old = key_val;
if(key_down==1)
{
}
if( key_up==1)
{
}
第一步就是使用回调函数判断哪个按键被按下。
第二步,就是我们三行按键法本身,先读取我们的键值 key_val ,然后 key_down用于判断是否被按下,按下为对应键值,没有则是0,这里使用了^也就相异则为1相同为0,如果按键被按下了,产生了下降沿,那么前后keyval和keyold肯定是不一样的,再加上一条保险&keyval,那么keydown的值肯定是对应的键值
同理,key_up 则是记录按键是否被弹起。keyold则用于保存上次按键状态。如果按键弹起,keyup就会变成当前键值,比方说我这边的1。在我最后两个if语句中可以对按下,弹起进行操作。