前言:
在之前的博客按键短按里,我已经介绍了按键短按,在这里,记录一下按键长按的代码
代码部分:
首先在原有的按键结构体变量的基础上,我们先加入几个成员变量
struct keys
{
unsigned char judge_sta;
bool key_sta;
bool single_flag;
unsigned int key_time;
bool long_flag;
};
然后,我们进入到中断回调函数中,简单修改一下,因为在我的STM32Cubemx里,我是定义了1ms中断,所以在这个回调函数里,key_time的识别,我就设定到了1000ms
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM4)
{
if(++TIM4_count == 1000)TIM4_count = 0;
key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i = 0;i<4;i++)
{
switch(key[i].judge_sta)
{
case 0:
{
if(key[i].key_sta == 0)
{
key[i].judge_sta = 1;
key[i].key_time = 0;
}
}break;
case 1:
{
if(key[i].key_sta == 0)
{
key[i].judge_sta = 2;
}
else
{
key[i].judge_sta = 0;
}
}break;
case 2:
{
if(key[i].key_sta == 1)
{
key[i].judge_sta = 0;
if(key[i].key_time< 1000)
{
key[i].single_flag = 1; //松开手的时候再确认
}
}
else //在没有松手的时候,让时间不停的累加
{
if(++key[i].key_time == 1000)//按下时长达到1秒后,判定位长按
{
key[i].long_flag = 1;
}
}
}break;
}
}
}
}
按键服务函数没啥大的区别,无非是多了一点东西:
void key_serve(void)
{
if(key[0].single_flag == 1)
{
sprintf(text,"key0down ");
highlight((unsigned char *)text,Line8,3);
// LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_disp(0x01);
key[0].single_flag = 0;
}
else if(key[1].single_flag == 1)
{
sprintf(text,"key1down ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);
highlight((unsigned char *)text,Line8,3);
LED_disp(0x02);
key[1].single_flag = 0;
}
else if(key[2].single_flag == 1)
{
sprintf(text,"key2down ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);
highlight((unsigned char *)text,Line8,3);
LED_disp(0x04);
key[2].single_flag = 0;
}
else if(key[3].single_flag == 1)
{
sprintf(text,"key3down ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);
highlight((unsigned char *)text,Line8,3);
LED_disp(0x08);
key[3].single_flag = 0;
}
else if(key[0].long_flag == 1)
{
sprintf(text,"key5down");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_disp(0x10);
key[0].long_flag = 0;
}
else if(key[1].long_flag == 1)
{
sprintf(text,"key6down");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_disp(0x20);
key[1].long_flag = 0;
}
else if(key[2].long_flag == 1)
{
sprintf(text,"key7down");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_disp(0x40);
key[2].long_flag = 0;
}
else if(key[3].long_flag == 1)
{
sprintf(text,"key8down");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_disp(0x80);
key[3].long_flag = 0;
}
}