#define KEY_DOWN_return 1 //单击
#define KEY_Double_return 2 //双击
#define KEY_Long_return 3 //长按
#define KEY_LONG_FREE_return 6 //长按结束#define double_time_MIN 80 //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX 120 //长按,超过这个时间则认为是长按;
#define Dithering_MIN 5 //消抖值
#define UP_KEY_Count 5 //抬起值#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 Read_Key1_Value GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)//读取按键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)//消抖值{if(KEY_Count_time[i] >= Long_press_time_MAX){KEY_event[i] = KEY_Long_return;}else{KEY_Count_time[i]++;}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//按键松开{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;}else if((KEY_Count_time[i] > 1)&&(KEY_Count_time[i] < Long_press_time_MAX)){ //单击KEY_event[i] = KEY_DOWN_return ;KEY_up_clsse_time[i] = UP_KEY_Count;}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;}}}
}
调用
KEY_Detect();if(KEY_event[KEY1_adder] == KEY_DOWN_return ){printf("单击\r\n");KEY_event[KEY1_adder]=0;}else if(KEY_event[KEY1_adder] == KEY_Double_return ){printf("双击\r\n");KEY_event[KEY1_adder]=0;}else if(KEY_event[KEY1_adder] == KEY_Long_return ){printf("长按\r\n");KEY_event[KEY1_adder]=0;}