基本思想就是监测,延时,监测。。。,放进循环中可进行扫描式操作
/**
* 函数功能: 读取按键KEY1的状态
* 输入参数:无
* 返 回 值: KEY_DOWN:按键被按下;
* KEY_UP :按键没被按下
* 说 明:无。
*/
KEYState_TypeDef KEY1_StateRead(void)
{
/* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
{
/* 延时一小段时间,消除抖动 */
HAL_Delay(10);
/* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
{
/* 等待按键弹开才退出按键扫描函数 */
while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
/* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
return KEY_DOWN;
}
}
/* 按键没被按下,返回没被按下状态 */
return KEY_UP;
}
中断模式(利用io口回调中断中处理)
/**
* 函数功能: 按键外部中断服务函数
* 输入参数: GPIO_Pin:中断引脚
* 返 回 值: 无
* 说 明: 无
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY1_GPIO_PIN)
{
HAL_Delay(20);/* 延时一小段时间,消除抖动 */
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
{
BEEP_TOGGLE;
LED1_ON;
LED2_ON;
LED3_ON;
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
}
else if(GPIO_Pin==KEY2_GPIO_PIN)
{
HAL_Delay(20);/* 延时一小段时间,消除抖动 */
if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
{
BEEP_TOGGLE;
LED1_OFF;
LED2_OFF;
LED3_OFF;
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
}
}