基于STM32HAL库的按键扫描算法

先把代码打在下面,我们以PB0引脚为例,配置为上拉输入,即没有按键时是高电位,按键时是低电位。

unsigned key_A=0,key_B=0,key_C=0;
void Key_Saomao(){
	key_A=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)^1;
	key_B=key_A&(key_A^key_C);
	key_C=key_A;
}

接下来我们分情况讨论。

未按下时

HAL_GPIO_ReadPin()函数的返回值是GPIO_PIN_SET,即为1,与1异或为0,key_A为0,所以key_C也为0;key_A与key_C异或为0,在与key_A位与也为0,所以key_B=0。故key_A=0,key_B=0,key_C=0。

第一次按下时

HAL_GPIO_ReadPin()函数的返回值是GPIO_PIN_RESET,即为0,与1异或为1,key_A为1;key_A与key_C异或为1,在与key_A位与也为1,所以key_B=1,又key_C=key_A=1。故key_A=1,key_B=1,key_C=1。

长按时

HAL_GPIO_ReadPin()函数的返回值是GPIO_PIN_RESET,即为0,与1异或为1,key_A为1;key_A与key_C异或为0,在与key_A位与也为0,所以key_B=0,又key_C=key_A=1。故key_A=1,key_B=0,key_C=1。

按下松开时

HAL_GPIO_ReadPin()函数的返回值是GPIO_PIN_SET,即为1,与1异或为0,key_A为0;key_A与key_C异或为1。在与key_A位与为0,所以key_B=0, 又key_C=key_A=1 。故key_A=0,key_B=0,key_C=0。很显然,当按键松开时,三个变量回到了初始状态,也就是没有按键按下的状态。

通过上述讨论可以看出,无论按下的时间有多长,只要出现一次按下,就会产生一次 key_B=1,而key_A可以判断按键当前的状态。

© 版权声明
THE END
喜欢就支持以下吧
点赞7 分享