| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /*
- * @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;
- }
- }
- }
|