#include"FreeRTOS.h"#include"task.h"#include"queue.h"#include"stm32f4xx_hal.h"#defineKEY_DEBOUNCE_TIME_MS20
QueueHandle_t key_event_queue;voidkey_scan_task(void*pvParameters){for(;;){// Scan the state of the keysuint8_t key_state =HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);// Wait for the debounce timevTaskDelay(pdMS_TO_TICKS(KEY_DEBOUNCE_TIME_MS));// Check if the key is still pressedif(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)== key_state){// Send the key event to the queueif(key_state == GPIO_PIN_SET){uint8_t key_event =1;xQueueSend(key_event_queue,&key_event,0);}}}}voidhandle_key_event_task(void*pvParameters){for(;;){// Wait for a key event to be receiveduint8_t key_event;xQueueReceive(key_event_queue,&key_event, portMAX_DELAY);// Handle the key eventprintf("Key pressed\n");}}voidinit_key_scan(void){// Initialize the key event queue
key_event_queue =xQueueCreate(10,sizeof(uint8_t));// Create the key scan taskxTaskCreate(key_scan_task,"KeyScanTask", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY,NULL);// Create the handle key event taskxTaskCreate(handle_key_event_task,"HandleKeyEventTask", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY,NULL);}
2、多按键的情况
#include"FreeRTOS.h"#include"task.h"#include"queue.h"#include"stm32f4xx_hal.h"#defineKEY_DEBOUNCE_TIME_MS20#defineKEY_NUM3typedefenum{
KEY_NONE =0,
KEY1,
KEY2,
KEY3
}key_t;
QueueHandle_t key_event_queue;
GPIO_TypeDef* key_ports[KEY_NUM]={GPIOA, GPIOB, GPIOC};uint16_t key_pins[KEY_NUM]={GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2};key_t key_state[KEY_NUM]={KEY_NONE};key_t key_enter_state[KEY_NUM]={KEY_NONE};voidkey_scan_task(void*pvParameters){for(;;){for(int i =0; i < KEY_NUM; i++){// Scan the state of the keyuint8_t state =HAL_GPIO_ReadPin(key_ports[i], key_pins[i]);// Wait for the debounce timevTaskDelay(pdMS_TO_TICKS(KEY_DEBOUNCE_TIME_MS));// Check if the key is still pressedif(HAL_GPIO_ReadPin(key_ports[i], key_pins[i])== state){if(state == GPIO_PIN_SET && key_state[i]!= KEY1 && key_state[i]!= KEY2 && key_state[i]!= KEY3){// Send the key event to the queuekey_t key = KEY_NONE;switch(i){case0:
key = KEY1;break;case1:
key = KEY2;break;case2:
key = KEY3;break;}if(key != KEY_NONE){
key_state[i]= key;xQueueSend(key_event_queue,&key,0);}}while(HAL_GPIO_ReadPin(key_ports[i], key_pins[i])== state &&(key_state[i]== KEY1 || key_state[i]== KEY2 || key_state[i]== KEY3));
key_state[i]= KEY_NONE;}}}}voidhandle_key_event_task(void*pvParameters){for(;;){// Wait for a key event to be receivedkey_t key_event;xQueueReceive(key_event_queue,&key_event, portMAX_DELAY);// Handle the key eventswitch(key_event){case KEY1:printf("Key 1 pressed\n");if(key_enter_state[0]!=KEY1){
key_enter_state[0]=KEY1;//这里写按键按下需要处理的事件}else{
key_enter_state[0]=KEY_NONE;//这里写按键按下需要处理的事件}break;case KEY2:printf("Key 2 pressed\n");break;case KEY3:printf("Key 3 pressed\n");break;default:break;}}}voidinit_key_scan(void){// Initialize the key event queue
key_event_queue =xQueueCreate(10,sizeof(key_t));// Create the key scan taskxTaskCreate(key_scan_task,"KeyScanTask", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY,NULL);// Create the handle key event taskxTaskCreate(handle_key_event_task,"HandleKeyEventTask", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY,NULL);}