#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
esp32-s3-devkitc-1