赞
踩
用定时器中断定时,配置部分就不写了,都差不多
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; } } }
这次的程序就写到这里。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。