利用状态机控制按键

按键消抖:
1.硬件消抖

  • 利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度,所以实际中使用的并不多。

2.软件消抖

  • 当检测到按键状态变化后,先等待一个10ms左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。

一、选择时钟源
在这里插入图片描述
二、配置调试接口
在这里插入图片描述
三、引脚分配
单击对应引脚,在这里
PA5:输出模式,控制指示灯
PC13:输入模式,控制按键
在这里插入图片描述
四、GPIO口–外设配置
在这里插入图片描述
五、定时器–外设配置

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
六、时钟配置

配置成下图所示的时钟频率即可
在这里插入图片描述
七、工程配置

第一步:
在这里插入图片描述
第二步:
在这里插入图片描述
八、生成工程
在这里插入图片描述
九、程序编写

第一步:(数据类型及变量的定义)

/* USER CODE BEGIN PTD */

typedef enum 
{
    KEY_CHECK=0,  //按键检测状态
	KEY_COMFIRM,  //按键确认状态
	KEY_RELEASE   //按键释放状态
}KEY_STATE;

/* USER CODE END PTD */
/* USER CODE BEGIN PV */

KEY_STATE KeyState = KEY_CHECK;  //按键状态,初值为按键检测状态
uint8_t KeyFlag = 0;             //按键值有效标志,1:有效   0:无效

/* USER CODE END PV */

第二部:(主程序代码的编写)

/* USER CODE BEGIN 2 */
	
	HAL_TIM_Base_Start_IT(&htim10);          //使能定时器10更新中断,启动定时器10

  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		if(KeyFlag==1)                                     //检测按键有效标志
		{
		  KeyFlag=0;                                       //清除标志
			HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);  //按键执行任务:翻转LED2的状态
		}
  }
  /* USER CODE END 3 */
}

第三步:(定时中断回调函数的编写)

/* USER CODE BEGIN 4 */
//定时器定时中断的回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM10)  //判断更新中断来源
	{
	  switch(KeyState)
		{
		  case KEY_CHECK:
			{
				//读到低电平,进入按键确认状态
			  if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
				{
				  KeyState=KEY_COMFIRM;
				}
				break ;
			}
			
			case KEY_COMFIRM:
			{
				//读到低电平,进入按键释放状态
			  if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_RESET)
				{
				  KeyState = KEY_RELEASE;
					KeyFlag = 1;  //设置有效按键标志,表示按键按下后立即执行按键任务
				}
				//读到高电平,可能是干扰信号,返回初始状态:按键检测状态
				else 
				{
				  KeyState = KEY_CHECK;
				}
				break ;
			}
			
			case KEY_RELEASE:
			{
				//读到高电平,说明按键释放,返回初始状态:按键检测状态
			  if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)==GPIO_PIN_SET)
				{
				KeyState = KEY_CHECK;
				//KeyFlag = 1
				//设置有效按键标志,表示按键释放后执行按键任务
				}
				break ;
				
			}
			default: break ;
		}
	}
	
	
}

/* USER CODE END 4 */

十、运行代码
在这里插入图片描述
详情请关注亿航创客官方抖音账号:EhangGroup

发布了11 篇原创文章 · 获赞 9 · 访问量 3356

猜你喜欢

转载自blog.csdn.net/qq_44343584/article/details/104949893