蓝桥杯嵌入式按键长按双击
直接上代码这个代码里面我们简单实现了如果按键按下时间超过0.8秒K1的值增加,短按只增加一次,按键2长按K2值增加,按键3双击K1的值减1,按键4双击K2的值减1
#include "fun.h"
#define long_press_time 800//定义长按时间
#define double_click_time 1000//定义双击时间
u32 pre,cpature_value;
u32 pre1;
u8 lcd_buff[30];
u8 k1=0;
u8 k2=0;
u32 k1_press__start_tick=0;//按键按下开始计时
u32 k2_press__start_tick=0;
u32 k3_press__last_tick=0;
u32 k4_press__last_tick=0;
u8 key_long_flag=0;//长按标志位
u8 key_value=0;
u32 key_tick=0;
u8 key_down,key_up,key_old=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM17)
{
cpature_value=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
TIM17->CNT=0;
pre=80000000/(80*cpature_value);
}
if(htim->Instance==TIM16)
{
cpature_value=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
TIM16->CNT=0;
pre1=80000000/(80*cpature_value);
}
}
void LCD_proc(void)
{
sprintf((char *)lcd_buff," fre:%d ",pre);
LCD_DisplayStringLine(Line1,lcd_buff);
sprintf((char *)lcd_buff," fre:%d ",pre1);
LCD_DisplayStringLine(Line2,lcd_buff);
sprintf((char *)lcd_buff," K1:%d ",k1);
LCD_DisplayStringLine(Line3,lcd_buff);
sprintf((char *)lcd_buff," K2:%d ",k2);
LCD_DisplayStringLine(Line4,lcd_buff);
}
void key_read(void)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
key_value=1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
key_value=2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)
key_value=3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
key_value=4;
else
key_value=0;
key_down=key_value&(key_value^key_old);
key_up=~key_value&(key_value^key_old);
key_old=key_value;
}
void KEY_proc(void)
{
if(uwTick-key_tick<50)
return ;
key_tick=uwTick;
key_read();
if(key_down==1)//按键按下
{
k1_press__start_tick=uwTick;//开始计时
key_long_flag=0;//刚开始未达到时间要求
}
else if(key_value==1)//按键1按下
{
if(uwTick-k1_press__start_tick>=long_press_time)//超过时间判定为长按
{
key_long_flag=1;//长按标志位置1
k1++;
}
}
else if(key_up==1)//按键短按
{
k1+=1;
// if(key_long_flag)
// {
//
//
// }
// else
// {
// k1+=1;
//
// }
}
if(key_down==2)
{
k2_press__start_tick=uwTick;
key_long_flag=0;
}
else if(key_value==2)
{
if(uwTick-k2_press__start_tick>=long_press_time)
{
key_long_flag=1;
k2++;
}
}
if(key_down==3)//按键3按下
{
if(uwTick-k3_press__last_tick<=double_click_time)//小于设置时间内如果再次检测到按键按下判定为双击按键
{
if(k1>0)
k1--;
}
k3_press__last_tick=uwTick;//更新时间为了下一次按键双击判断
}
if(key_down==4)
{
if(uwTick-k4_press__last_tick<=double_click_time)
{
if(k2>0)
k2--;
}
k4_press__last_tick=uwTick;
}
}