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;
}
}
}
這次的程序就寫到這裏。