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