当前位置:   article > 正文

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

stm32长按短按控制灯亮代码

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;//用于做灯闪烁延迟的标志位
		}
	}
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里是重点,判断长按还是短按,这里程序只写主要的部分,一些配置部分就不写了
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;	//返回键值
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

接下来就是主函数当中的调用了,同样,配置部分就不写了。
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;
				}
				}

		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

这次的程序就写到这里。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/771265
推荐阅读
相关标签
  

闽ICP备14008679号