stm32----定时器中断实现按键的长按,短按效果

这次来分享按键的长按和短按的方法

按键消抖一般分为4步:
1、判断按键是否按下
2、消抖
3、再次判断按键是否按下
4、等待按键松开

实现效果:
1.短按-------LED1状态取反
2.长按-------LED0状态取反

下面就直接根据代码来解释

key.c

u8 KeyAge=0,KeyPressed=0,KeyProssed=0;
#define Short_Time  1  //100ms
#define Long_Time   9  //500ms

void KEY_Scan1(void)
{	
   if(KEY0==0)   
	 {
			KeyAge++;
			if(KeyAge>Short_Time) //消抖
			{
				KeyPressed=1; 
			}
	 }
	 else
	 {
		 //按键松开
		 if((KeyPressed)&&(KeyProssed==0))  //按键处理过长按了  就不再执行其他动作
		 {
			 Key_Short_Pro(); // 短按处理进程
		 }
		 		 
		 KeyPressed=0;
		 KeyAge=0;		 
		 KeyProssed=0;
	 }
	 
	if((KeyAge>Long_Time)&&(KeyProssed==0)) //消抖   
	{
		Key_Long_Pro(); // 长按处理进程
		KeyProssed=1; //按键已经处理过了
	}	 
}
void Key_Short_Pro(void)
{
	LED0_Toggle;
}

void Key_Long_Pro(void)
{
	LED1_Toggle;
}


这里是timer.c

//定时器3中断服务函数调用

u8 clock_50ms;
u8 key1_pressed;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==(&TIM3_Handler))
    {
     // LED1_Toggle;        //LED0反转		 
			clock_50ms++;
    }
}


main.c这样写

这里,定时器每50ms产生一次中断,进入这个while里面的if

		
    while(1)
    {
			if(clock_50ms>0)
			{
				clock_50ms=0;
				KEY_Scan1();
			}
	  }   

分享解决疑惑

1.之前没搞明白,长按了,不会触发短按的效果吗?
答:一起来分析代码就明白了

stm32----定时器中断实现按键的长按,短按效果_第1张图片
首先,key按下,就进入①处来判断,进行46行的if判断,发现不成立,跳出,这时候是跳出key_scan函数,过了50ms,又进入了一次中断,这时候的46行的if成立,只要我们不松手,都不会进入else,那假设我们还在按key,这时候64行的if慢慢的接近成立,直到它成立,43行的if这里就执行完了,就会执行64的if,这时候因为64的jf成立,所以LED状态会取反,这样就实现了长按的效果。

你可能感兴趣的:(C语言,STM32,stm32,单片机,arm)