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;
}
}
}
这次的程序就写到这里。