#define KEY1_PIN 20
#define KEY2_PIN 21
#define LED_PIN 14
SemaphoreHandle_t on = NULL; // 二进制信号量
SemaphoreHandle_t off= NULL; // 二进制信号量
volatile TickType_t key1Deounce = 0; // 按下按钮的时间
volatile TickType_t key2Deounce = 0; // 按下按钮的时间
void led_task(void *param_t){
pinMode(LED_PIN, OUTPUT);
while(1){
// 这种去抖方式是很Low的,正确的方式要使用定时器。
if((xSemaphoreTake(on, 1000) == pdTRUE) && ((xTaskGetTickCount() - key1Deounce) < 200)){
digitalWrite(LED_PIN,HIGH);
//digitalWrite(LED_PIN,!digitalRead(LED_PIN));
vTaskDelay(500);
}
if((xSemaphoreTake(off, 1000) == pdTRUE) && ((xTaskGetTickCount() - key2Deounce) < 200)){
digitalWrite(LED_PIN,LOW);
//digitalWrite(LED_PIN,!digitalRead(LED_PIN));
vTaskDelay(500);
}
}
}
// 中断服务函数
void IRAM_ATTR ON() {
key1Deounce = xTaskGetTickCountFromISR(); // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
xSemaphoreGiveFromISR(on, NULL);
}
void IRAM_ATTR OFF() {
key2Deounce = xTaskGetTickCountFromISR(); // 记录下按下的时间,用于放抖动,正式开发中不要这样写,有Bug
xSemaphoreGiveFromISR(off, NULL);
}
void setup() {
Serial.begin(115200);
on = xSemaphoreCreateBinary(); //创建二进制信号量
off = xSemaphoreCreateBinary(); //创建二进制信号量
xTaskCreate(led_task, "LED-DSP", 1024, NULL, 1, NULL);
//xTaskCreate(off_task, "LED-DSP", 1024, NULL, 1, NULL);
// 安装中断
pinMode(KEY1_PIN, INPUT_PULLUP);
attachInterrupt(KEY1_PIN, ON, FALLING);
pinMode(KEY2_PIN, INPUT_PULLUP);
attachInterrupt(KEY2_PIN, OFF, FALLING);
}
void loop() {
delay(10);
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1