#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;
}
单按键扫描扩展至支持3个按键

原文地址: http://www.cveoy.top/t/topic/ibEI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录