1.基础知识
cubemax配置和原来一样。age加一次代表10ms,抖动时长为20ms,age从0到2。
2.单击
#include "key.h"
struct keys key[5]={0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv()
{
uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].flag=1;
}
else{
for(int i=0;i<5;i++)key[i].age=0;
}
}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
uint8_t age;
uint8_t flag;
};
void key_serv(void);
#endif
extern struct keys key[];
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
key_serv();
}
}
void key_proc()
{
if(key[1].flag==1)
{
count++;
key[1].flag=0;
}
}
3.长按键-长按后抬起执行
#include "key.h"
struct keys key[5]={0,0,0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv_long()
{
uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].press=1;
}
else{
for(int i=0;i<5;i++)
{
if(key[i].age>69)key[i].long_flag=1;
if(key[i].press==1&&key[i].long_flag==0)
key[i].short_flag=1;
key[i].age=0;
key[i].press=0;
}
}
}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
uint8_t age;
uint8_t short_flag;
uint8_t long_flag;
uint8_t press;
};
void key_serv_long(void);
#endif
extern struct keys key[];
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
key_serv_long();
}
}
void key_proc()
{
if(key[1].short_flag==1)
{
count++;
key[1].short_flag=0;
}
if(key[1].long_flag==1)
{
count--;
key[1].long_flag=0;
}
}
4.长按键-长按快速增加功能
#include "key.h"
struct keys key[5]={0,0,0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv_long()
{
uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].press=1;
}
else{
for(int i=0;i<5;i++)
{
if(key[i].press==1&&key[i].long_flag==0)
key[i].short_flag=1;
key[i].age=0;
key[i].press=0;
key[i].long_flag=0;//不一样的地方,因为长按快速增加,不需要在main函数中标志位置为0,在这里置零
}
}
if(key[key_val].age>69)key[key_val].long_flag=1;
}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
uint8_t age;
uint8_t short_flag;
uint8_t long_flag;
uint8_t press;
};
void key_serv_long(void);
#endif
extern struct keys key[];
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
key_serv_long();
}
}
void key_proc()
{
if(key[1].short_flag==1)
{
count++;
key[1].short_flag=0;
}
if(key[1].long_flag==1)
{
count--;
}
}