单按键扫描扩展至支持3个按键
#define SHORT_KEY_DELAY 2 // 短按延时 #define LONG_KEY_DELAY 200 // 长按延时 #define DOUBLE_KEY_DELAY 30 // 双击两次触发之间的最大延时 typedef struct { uint16_t cnt; //计数 uint8_t scan_flag; //单击标志位 uint8_t dluble_flag; //双击计时标志 uint8_t key_num; // 按键数量 }key_scan_t; // 按键扫描 void key_scan(void) { uint8_t input = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11); if ( input == RESET ) { key.cnt++; if ( key.cnt == SHORT_KEY_DELAY ) { key.scan_flag = 1; } else if( key.cnt == LONG_KEY_DELAY ) { //长按 key.scan_flag = 0; printf("长按\r\n"); } if( key.dluble_flag ) { if( key.cnt == SHORT_KEY_DELAY && key.dluble_flag < DOUBLE_KEY_DELAY) { //双击 key.scan_flag = 0; key.dluble_flag = 0; printf("双击\r\n"); } } } else { if( key.scan_flag ) { key.cnt = 0; key.dluble_flag++;
if( key.dluble_flag > DOUBLE_KEY_DELAY ) //双击超时
{
key.scan_flag = 0;
key.dluble_flag = 0;
//单击
printf("单击\r\n");
}
}
key.cnt = 0;
}
}
// 将按键扫描函数修改为支持3个按键的版本 void key_scan(void) { uint8_t input1 = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11); uint8_t input2 = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_12); uint8_t input3 = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_13); if (input1 == RESET || input2 == RESET || input3 == RESET) { key.cnt++; if (key.cnt == SHORT_KEY_DELAY) { key.scan_flag = 1; } else if (key.cnt == LONG_KEY_DELAY) { //长按 key.scan_flag = 0; printf("长按\r\n"); } if (key.dluble_flag) { if (key.cnt == SHORT_KEY_DELAY && key.dluble_flag < DOUBLE_KEY_DELAY) { //双击 key.scan_flag = 0; key.dluble_flag = 0; printf("双击\r\n"); } } } else { if (key.scan_flag) { key.cnt = 0; key.dluble_flag++;
if (key.dluble_flag > DOUBLE_KEY_DELAY) //双击超时
{
key.scan_flag = 0;
key.dluble_flag = 0;
//单击
printf("单击\r\n");
}
}
key.cnt = 0;
}
原文地址: http://www.cveoy.top/t/topic/ibEI 著作权归作者所有。请勿转载和采集!