#define KEY_PIN1 20
#define KEY_PIN2 45
#define KEY_PIN3 41
#define LED_PIN1 14
#define LED_PIN2 10
#define LED_PIN3 15
SemaphoreHandle_t led1 = NULL; // 二进制信号量
SemaphoreHandle_t led2 = NULL; // 二进制信号量
SemaphoreHandle_t led3 = NULL; // 二进制信号量
volatile TickType_t keyDeounce1 = 0;   // 按下按钮的时间
volatile TickType_t keyDeounce2 = 0;   // 按下按钮的时间
volatile TickType_t keyDeounce3 = 0;   // 按下按钮的时间

void led_task1(void *param_t){
  pinMode(LED_PIN1, OUTPUT);
  while(1){
    // 这种去抖方式是很Low的,正确的方式要使用定时器。
    if((xSemaphoreTake(led1, 1000) == pdTRUE) && ((xTaskGetTickCount() - keyDeounce1) < 200)){
      digitalWrite(LED_PIN1,!digitalRead(LED_PIN1));
      vTaskDelay(500);
    }
  }
}

void led_task2(void *param_t){
  pinMode(LED_PIN2, OUTPUT);
  while(1){
    // 这种去抖方式是很Low的,正确的方式要使用定时器。
    if((xSemaphoreTake(led2, 1000) == pdTRUE) && ((xTaskGetTickCount() - keyDeounce2) < 200)){
      digitalWrite(LED_PIN2,!digitalRead(LED_PIN2));
      vTaskDelay(500);
    }
  }
}

void led_task3(void *param_t){
  pinMode(LED_PIN3, OUTPUT);
  while(1){
    // 这种去抖方式是很Low的,正确的方式要使用定时器。
    if((xSemaphoreTake(led3, 1000) == pdTRUE) && ((xTaskGetTickCount() - keyDeounce3) < 200)){
      digitalWrite(LED_PIN3,!digitalRead(LED_PIN3));
      vTaskDelay(500);
    }
  }
}

// 中断服务函数
void IRAM_ATTR ISR1() {
  keyDeounce1 = xTaskGetTickCountFromISR();    // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
  xSemaphoreGiveFromISR(led1, NULL);
}
void IRAM_ATTR ISR2() {
  keyDeounce2 = xTaskGetTickCountFromISR();    // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
  xSemaphoreGiveFromISR(led2, NULL);
}
void IRAM_ATTR ISR3() {
  keyDeounce3 = xTaskGetTickCountFromISR();    // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
  xSemaphoreGiveFromISR(led3, NULL);
}

void setup() {
  Serial.begin(115200);
  led1 = xSemaphoreCreateBinary(); //创建二进制信号量
  led2 = xSemaphoreCreateBinary(); //创建二进制信号量
  led3 = xSemaphoreCreateBinary(); //创建二进制信号量
  xTaskCreate(led_task1, "LED-DSP", 1024, NULL, 1, NULL);
  xTaskCreate(led_task2, "LED-DSP", 1024, NULL, 1, NULL);
  xTaskCreate(led_task3, "LED-DSP", 1024, NULL, 1, NULL);
  // 安装中断
  pinMode(KEY_PIN1, INPUT_PULLUP);
  pinMode(KEY_PIN2, INPUT_PULLUP);
  pinMode(KEY_PIN3, INPUT_PULLUP);
  attachInterrupt(KEY_PIN1, ISR1, FALLING);
  attachInterrupt(KEY_PIN2, ISR2, FALLING);
  attachInterrupt(KEY_PIN3, ISR3, FALLING);
}

void loop() {
  delay(100);
}
Loading
esp32-s3-devkitc-1