/* * @Description: * @Version: 2.0 * @Author: Seven * @Date: 2022-06-14 17:48:09 * @LastEditors: Seven * @LastEditTime: 2022-06-15 09:18:09 */ #include "key.h" #include "includes.h" uint8_t hd_id = 0; enum KEY_STATE{KEY_IDLE=0,FILTER,PRESS,RELEASE}; key_info_t key_info[KEY_NUM]; void HD_ID_Init(void) { GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE, GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5, GPIO_Mode_IPU, GPIO_Speed_50MHz); } uint8_t get_HD_ID(void) { uint8_t data = 0; if(HD_ID_0) data |= 1; if(HD_ID_1) data |= 1<<1; if(HD_ID_2) data |= 1<<2; if(HD_ID_3) data |= 1<<4; return data; } void key_init(void) { //KEY,PA8 GPIO_COMM_Init(RCC_APB2Periph_GPIOA, GPIOA, GPIO_Pin_8, GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz); } //读取按键状态 //按键按下为低电平,抬起为高电平 uint8_t get_key_bit(uint8_t key) { uint8_t ret = 0; if(key == KEY0_PRES) { ret = KEY0(); } else { ret = 1; } return ret; } /*按键消抖函数 输入:key:按键编号; time_press:按键按下的延时(ms),按键连续按下的时间 time_release:按键松开的延时(ms),按键松开到再次按下的时间间隔 time_delay:按键延时(ms),第一次按键后延时时间,延时阶段可以多次按键,延时结束后判断按键次数 */ void key_down(uint8_t key,uint32_t time_press, uint32_t time_release, uint32_t time_delay) { switch(key_info[key-1].key_state) { case KEY_IDLE: if(0 == get_key_bit(key)){//有按键 if(key_info[key-1].key_state_tmp == PRESS) { if(timeout_isOut(&key_info[key-1].tt_key_release)) { key_info[key-1].key_state = FILTER; timeout_setValue(&key_info[key-1].tt_key_press,time_press,1); } else { key_info[key-1].key_state = PRESS; } } else { key_info[key-1].key_state = FILTER; timeout_setValue(&key_info[key-1].tt_key_press,time_press,1); } key_info[key-1].key_state_tmp = KEY_IDLE; } break; case FILTER: if(0 == get_key_bit(key)) {//判断是否为按键 key_info[key-1].key_state_tmp = FILTER; if(timeout_isOut(&key_info[key-1].tt_key_press)) {//按键时间大于50ms。 //按键按下后的任务处理 if(key_info[key-1].flag==0) { key_info[key-1].flag = 1; timeout_setValue(&key_info[key-1].tt_key,time_delay,1); } key_info[key-1].pres_num++; key_info[key-1].pres_total_num++; printf("key:%d, key num:%d, key total num:%u\n",key,key_info[key-1].pres_num,key_info[key-1].pres_total_num); key_info[key-1].key_state = PRESS; } } else {//按键的去抖动 key_info[key-1].key_state = KEY_IDLE; key_info[key-1].key_state_tmp = FILTER; } break; case PRESS: if(0 != get_key_bit(key)){ //key release 松手 key_info[key-1].key_state = KEY_IDLE; timeout_setValue(&key_info[key-1].tt_key_release,time_release,1); key_info[key-1].key_state_tmp = PRESS; } break; default: key_info[key-1].key_state = KEY_IDLE; key_info[key-1].key_state_tmp = RELEASE; break; }//end swtich; } //按键处理函数 void key_press(void) { uint32_t time_press = 100; uint32_t time_release = 100; uint32_t time_delay = 5000; key_down(KEY0_PRES,time_press,time_release,time_delay); if(key_info[KEY0_PRES-1].flag) { if(timeout_isOut(&key_info[KEY0_PRES-1].tt_key)) { if(device_fixed_info.Work_State == DEV_WORK_STATE_NORMAL || device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT) { //正常模式或未配置模式下执行按键功能 key_task_handle(key_info[KEY0_PRES-1].pres_num); } key_info[KEY0_PRES-1].flag = 0; key_info[KEY0_PRES-1].pres_num = 0; } } }