赞
踩
#define double_time_MIN 500 //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX 1000 //长按,超过这个时间则认为是长按;
#define Dithering_MIN 5 //消抖值
#define KEY_DOWN_return 1 //单击
#define KEY_Double_return 2 //双击
#define KEY_Long_return 3 //长按
#define KEY_LONG_FREE_return 6 //长按结束#define UP_KEY_Count 200 //抬起值
#define KEY_UP 1//按键抬起
#define KEY_Down 0//按键按下
#define KEY_Number_MAX 1 //按键个数,开辟多少字节数组
#define KEY1_adder 0 //按键计数数组地址
//#define KEY2_adder 1 //按键计数数组地址
//#define KEY3_adder 2 //按键计数数组地址
#define UP_KEY_Count 120
#define Read_Key1_Value GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)//读取按键1的值
unsigned int KEY_Count_time[KEY_Number_MAX];//按键计时,调用的时候,要填按键地址,避免重复
unsigned char KEY_up_clsse_time[KEY_Number_MAX];//按键抬起取消计时,
unsigned char KEY_Count_down[KEY_Number_MAX];//按键按下次数
unsigned char KEY_Dithering[KEY_Number_MAX];//按键消抖
unsigned char KEY_event[KEY_Number_MAX];//按键的事件
unsigned char KEY_Read[KEY_Number_MAX];//按键读取状态
/*
* @name Button_all_state
* @brief MUC按键检测
* @param
* @retval None
* othen: 历遍所有的按键
*/
void Button_all_state()
{
KEY_Read[KEY1_adder] = Read_Key1_Value;
// KEY_event[KEYX_adder]=Read_KeyX_Value;
}
/*
* @name KEY_Detect
* @brief
* @param
* @retval None
* othen:按键检查函数,传递不同的值,实现不同的按键按下
*/
void KEY_Detect()
{
unsigned char i = 0;
Button_all_state();//更新按键状态
for(i = 0; i < KEY_Number_MAX; i++) //历遍
{
if(KEY_Read[i] == KEY_Down) //按键按下
{
if(KEY_Dithering[i] > Dithering_MIN)//消抖值
{
time_num++;
if(KEY_Count_time[i] >= Long_press_time_MAX)
{
KEY_event[i] = KEY_Long_return;
}
else
{
if(time_num > 1000)
{
KEY_Count_time[i]++;
time_num = 0;
}
}
if(KEY_up_clsse_time[i] != 0)
{
KEY_up_clsse_time[i] = 0;
KEY_Count_down[i]++;
}
}
else
{
KEY_Dithering[i]++;
KEY_Read[i] = 0; //按键刷新
}
}
else//按键松开
{
KEY_up_clsse_time_num++;
if(KEY_up_clsse_time_num > 1000)
{
KEY_up_clsse_time_num = 0;
++KEY_up_clsse_time[i];
}
if(KEY_up_clsse_time[i] > UP_KEY_Count) //按键抬起
{
if((KEY_Count_time[i] < double_time_MIN) && (KEY_Count_down[i] >= 2)) //双击
{
KEY_event[i] = KEY_Double_return;
KEY_up_clsse_time[i] = UP_KEY_Count;
KEY_up_clsse_time[i] = 0;
KEY_Count_time[i] = 0; //按键计时更新
KEY_Dithering[i] = 0;//消抖更新
KEY_Read[i] = 0; //按键刷新
KEY_Count_down[i] = 0;
}
else if(KEY_Count_time[i] >= Long_press_time_MAX) //长按抬起
{
KEY_event[i] = KEY_LONG_FREE_return;
KEY_up_clsse_time[i] = UP_KEY_Count;
// KEY_up_clsse_time[i] = 0;
KEY_Count_time[i] = 0; //按键计时更新
KEY_Dithering[i] = 0;//消抖更新
KEY_Read[i] = 0; //按键刷新
KEY_Count_down[i] = 0;
}
else if((KEY_Count_time[i] > 10) && KEY_Count_down[i] < 2) //单击
{
KEY_event[i] = KEY_DOWN_return ;
KEY_up_clsse_time[i] = UP_KEY_Count;
KEY_up_clsse_time[i] = 0;
KEY_Count_time[i] = 0; //按键计时更新
KEY_Dithering[i] = 0;//消抖更新
KEY_Read[i] = 0; //按键刷新
KEY_Count_down[i] = 0;
}
else
{
KEY_up_clsse_time[i] = 0;
KEY_Count_time[i] = 0; //按键计时更新
KEY_Dithering[i] = 0;//消抖更新
KEY_Read[i] = 0; //按键刷新
KEY_Count_down[i] = 0;
}
}
}
}
}
char btn1_status1()
{
return KEY_event[KEY1_adder ];
}
void btn1_status1_clean()
{
KEY_event[KEY1_adder ] = 0;
}
调用:
KEY_Detect();
if(btn1_status1() == KEY_DOWN_return)
{
printf("单击\r\n");
btn1_status1_clean();
}
else if(btn1_status1() == KEY_Double_return)
{
printf("双击\r\n");
btn1_status1_clean();
}
else if(btn1_status1() == KEY_Long_return)
{
printf("长按\r\n");
btn1_status1_clean();
}
参考csdn某位大佬,一下子找不到链接了,等到找补上:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。