STM32按键长按短按控制LED灯闪烁 同时可以按一下键切换一下状态

STM32程序:按键长按和短按的判断,用来控制LED灯,有借鉴了其他程序,但是有细节上的不同。短按是切换灯亮的状态,每按一下换一个状态,长按led灯快闪并且指示灯向4靠近,直到等于4是慢闪。如果只做长短按不需要注重里面内容。这里就不细说了,不懂可以评论。

(因为这里做的按键是速度,所以写的SP,根据自己情况自己定义就好)

用定时器中断定时,配置部分就不写了,都差不多
time_key.c

 void TIM3_IRQHandler(void)   //TIM3ÖжÏ
  {
	if (TIM_GetITStatus(TIM3, TIM_IT_Update)==1)  
		{ 	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);	 
							 SP_nTime=1;//用于判断长按短按的定时	
							 SP_delay=1;//用于做灯闪烁延迟的标志位
		}
	}
	

这里是重点,判断长按还是短按,这里程序只写主要的部分,一些配置部分就不写了
key.c

u8 Key_SP_state()
{
	 if( (SP_nTime_count == 0) && (SP_key_value != ANG_KEY_NULL))
	 {
//		SP_key_value = SP_KEY_NULL;    //因为这里我要在主函数里面做循环用来让led灯闪烁,所以这里不可以清零键值,但是不需要闪烁的话最好可以清零
	 }
	 if(SP_nTime==1) //5ms     是一个5ms 源自定时器
	 {
		 SP_nTime=0;     //归零用于判断是否是下一个5ms
		 if((SP_SELECT==0))  //按键按下的状态
		 {
			 SP_nTime_count++;    //计数5ms的次数 用于定时
		 }
	 else                 //按键松开  可以看计时的时间
	 {
	 if((SP_nTime_count > 0) && (SP_nTime_count <=100))  //5ms次数在0到100  就是按键时间在0到500ms  是短按
			{
				SP_key_value = SP_KEY_SHORT;//赋键值
				SP_nTime_count = 0;   //计数清零
			}
			else if( SP_nTime_count > 400) //按键时间大于2s
			{
			 SP_key_value = SP_KEY_LONG; //赋键值
			 SP_nTime_count = 0; //计数清零
			}
			else  //用于去抖动 
			{
//			  SP_key_value = SP_KEY_NULL; //因为这里我要做循环用来让了led灯闪烁,所以这里不可以清零键值,但是不需要闪烁的话最好可以清零(同上)
				SP_nTime_count = 0; //
			}
			SP_nTime_count = 0; //清零
		}
	}
	 return SP_key_value;	//返回键值
}

接下来就是主函数当中的调用了,同样,配置部分就不写了。
main.c

		Key_SP_state();
		//短按你要执行的程序
		if(SP_key_value==SP_KEY_SHORT)    
		{
			if(SP_key_count==0)
			{
				SP_key_value=SP_KEY_NULL;
				SP_key_count=1;
			  SP_LED_G_H;
		 	  SP_LED_R_L;
			}
    else if(SP_key_count==1)
			{
			SP_key_value=SP_KEY_NULL;
			SP_key_count=0;
			SP_LED_G_H;
			SP_LED_R_H;
		}
		}
//长按 写你要执行的程序   这里是要循环 所以键值不能变化 确保下次还是成立IF  
// 下面程序目的为标准速度指示灯为标志4,当长按时,led灯快闪并且指示灯向4靠近,
//直到等于4是慢闪。如果只做长短按不需要注重里面内容。这里就不细说了,不懂可以评论。
 else if(SP_key_value==SP_KEY_LONG)
		{
			SP_key_count=1;
			if(SP_delay==1)
			{
			  SP_delay_count++;
				SP_delay=0;
			}
//			ANG_key_value=ANG_KEY_NULL;
				if(led_SP==4)//led灯号标志位=4
				{
				if(SP_delay_count==200)
				{
				SP_LED_R_H;
				SP_LED_G_L;		
				}
				if(SP_delay_count==400)
				{
				SP_delay_count=0;
				SP_LED_R_L;
				SP_LED_G_L;
				}
				if(SP_delay_count>400)
				{
				SP_key_value=SP_KEY_NULL;
				SP_delay_count=0;
				}
        }
			if(led_SP>4)
	   	{
				if(SP_delay_count==60)
				{
				SP_LED_R_H;
				SP_LED_G_L;	
				}
				if(SP_delay_count==120)
				{
					SP_delay_count=0;
				SP_LED_R_L;
				SP_LED_G_L;	
				led_SP--;//led灯号标志位
				}
				if(SP_delay_count>120)
				{
				SP_key_value=SP_KEY_NULL;
				SP_delay_count=0;
				}
			}
			if(led_SP<4)
				{

				if(SP_delay_count==60)
				{
				SP_LED_R_H;
				SP_LED_G_L;		
				}
				if(SP_delay_count==120)
				{
				SP_delay_count=0;
				SP_LED_R_L;
				SP_LED_G_L;	
				led_SP++;//led灯号标志位
				}
				if(SP_delay_count>120)
				{
				SP_key_value=SP_KEY_NULL;
				SP_delay_count=0;
				}
				}

		}

这次的程序就写到这里。

发布了2 篇原创文章 · 获赞 5 · 访问量 37

猜你喜欢

转载自blog.csdn.net/qq_43255107/article/details/105441259