测试板stm32f407,定时器采用10ms计数,总共三个按键,短按key_value 值为123按键长按2s以上key_value 值为456
主程序
u8 key_value = 0; //按键值
int main()
{
delay_init(168); //延时函数初始化
KEY_Init(); //按键IO口初始化
TIM3_Int_Init(100-1,8400-1);//0.1ms 计数100次 10ms溢出一次
Usart_Config(); // USART初始化函数
printf("ok\r\n");
while (1)
{
//每次按键按下对标志进行取反
if( key_value != 0 )
{
printf("key_value=%d\r\n",key_value);
key_value=0;
}
}
}
定时器逻辑代码
extern u8 key_value;
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
static u8 time_10ms=0,time_1s=0;
static u8 key_status = 0,key_Last10ms=0,key_short=0,key_long=0;
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
key_status = KEY_Scan();
if(key_Last10ms!=0&&key_status==key_Last10ms)//按下
{
key_short=key_status;
time_10ms++;
if(time_10ms >=100)
{
time_10ms = 0;
time_1s++;
if(time_1s>=2)//长按2s
{
time_1s=0;
if(key_short == 1)
key_long = key_short+3;
}
}
}else if(key_short!=0&&key_Last10ms!=key_status)//松开
{
if(key_long==0)
{
key_value = key_short;
}else
{
key_value = key_long;
}
key_short = 0;
key_long = 0;
time_10ms = 0;
time_1s = 0;
}else
{
key_short = 0;
key_long = 0;
time_10ms = 0;
time_1s = 0;
}
key_Last10ms=key_status;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}