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;
				}
				}

		}

這次的程序就寫到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章