需求:
按键分短按、长按,需要带消抖。
key.h
#ifndef __KEY_H_
#define __KEY_H_
#include "main.h"
#define KEY_ST PORT_GetBit(KEY_GPIO_PORT,KEY_GPIO_PIN)
typedef enum
{
NULL_KEY = 0,
SHORT_KEY = 1,
LONG_KEY
}KEY_TYPE;
extern KEY_TYPE key_type;
unsigned char KEY_Scan(void);
#endif /* __KEY_H_ */
key.c
#define key_st_0 0 //按键初始的状态
#define key_st_1 1 //按键按下的状态
#define key_st_2 2 //按键状态判断
#define key_st_3 3 //按键释放的状态
KEY_TYPE key_type;
//按键长按、短按检测
unsigned char KEY_Scan(void)
{
static uint32_t cnt = 0;
static char key_st = 0; //按键状态
unsigned char key_relase ,key_return;
key_relase = KEY_ST; //按键未按下时为高电平,按下为低电平
key_return = NULL_KEY;
switch(key_st)
{
case key_st_0: //按键初始态
if(!key_relase) //如果按下
{
key_st = key_st_1;
cnt = 0;
}
break;
case key_st_1: //按键确认态,消抖
if(!key_relase) //如果仍为按下
key_st = key_st_2;
else
key_st = key_st_0;
break;
case key_st_2: //判定按键状态
if(key_relase)
{
if(cnt > 300) //短按3s
{
key_return = SHORT_KEY;
key_st = key_st_0;
}
else
key_st = key_st_0;
}
else
{
cnt++;
if(cnt > 500) //长按5s
{
key_return = LONG_KEY;
key_st = key_st_3;
}
}
break;
case key_st_3: //等待按键释放
if(key_relase)
{
key_st = key_st_0;
}
break;
default:
break;
}
return key_return;
}
tim.c
static void Timer0A_CallBack(void)
{
key_scan_task();
}
void key_scan_task(void)
{
static uint32_t time_cnt =0;
uint8_t key_status =0;
time_cnt++;
if(time_cnt == 10)
{
time_cnt =0;
KEY_Scan();
}
}
|