1.按键扫描的基本原理
一般独立按键的原理图:
按键信号的识别:
一般来说,按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平。通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
按键去抖动的必要性:
有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
如何去抖动:
首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
2.HAL库中关于按键的常用函数
电平输出函数
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
电平翻转函数
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
电平输入函数
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
例题:
判断PB1引脚的输入信号,若为高电平,则将PB10引脚控制的LED灯的开关状态切换。
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);
}
3.实训案例:
在STM32F103C8T6开发板上, 利用STM32CubeMX和Keil5协同开发, 完成以下的功能:按下按键(PB1),切换PB10的电平。(独立按键原理图见文首)
(1)CubeMX配置
将PB1配置为上拉输入模式,并将用户名修改为KEY。
(2)Keil5编写代码
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define KEY HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
void Scan_Key()
{
if(KEY == GPIO_PIN_RESET)
{
HAL_Delay(5);
if(KEY == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);
}
while(KEY == GPIO_PIN_RESET);
}
}
/* USER CODE END 0 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Scan_Keys();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */