南山小千 发表于 2020-7-6 13:41:55

求助!使用外部中断改变led的亮、灭和闪烁

使用按键外部中断改变变量来控制led的不同状态,正常来讲,每一次按键,flag的值会按顺序012012012……,但实际情况是有时会出现不按顺序的情况,特别是2~0的时候,请大神看看问题在哪?拜托!代码如下:
#define buttonpin 2    //定义按键引脚、外部中断0
#define LEDpin 3       //定义led引脚
int flag = 0;

void setup()
{
Serial.begin(9600);
pinMode(buttonpin, INPUT_PULLUP);   //内部上拉
pinMode(LEDpin, OUTPUT);
attachInterrupt(0, inter, FALLING); //外部中断,下降沿触发
}

void inter(){   //调用的中断函数
flag++;
delay(500);
if(flag==3){
flag=0;
}
}

void loop(){   //主程序
switch (flag){
case 0: digitalWrite(LEDpin, HIGH);Serial.println("0");break;    //0,亮
case 1: digitalWrite(LEDpin, LOW);Serial.println("1");break;   //1,灭
case 2: breath();Serial.println("2");break;   //2,呼吸灯
default: Serial.println("error");
}
}

void breath(){      //呼吸灯
for (int a=0; a<=255;a++)
{
    analogWrite(LEDpin,a);
    delay(8);   
}
for (int a=255; a>=0;a--)
{
    analogWrite(LEDpin,a);
    delay(8);
}
}

南山小千 发表于 2020-7-7 08:22:27

问题解决了,PO上程序,方便和我一样有该问题的查看。

#define buttonpin 2    //定义按键引脚、外部中断0
#define LEDpin 3       //定义led引脚
int flag = 0;
int k=0;
void setup()
{
Serial.begin(9600);
pinMode(buttonpin, INPUT_PULLUP);   //内部上拉
pinMode(LEDpin, OUTPUT);
attachInterrupt(0, inter, FALLING); //外部中断,下降沿触发
}

void inter(){   //调用的中断函数
if(k<1){
flag++;
k=1;
}
if(flag==3){
flag=0;
}
}

void loop(){   //主程序
switch (flag){
case 0: digitalWrite(LEDpin, HIGH);k=0;Serial.println("0");break;    //0,亮
case 1: digitalWrite(LEDpin, LOW);k=0;Serial.println("1");break;   //1,灭
case 2: breath();Serial.println("2");break;   //2,呼吸灯
default: Serial.println("error");
}
}

void breath(){      //呼吸灯
for (int a=0; a<=255;a++)
{
    analogWrite(LEDpin,a);
    delay(8);   
}
for (int a=255; a>=0;a--)
{
    analogWrite(LEDpin,a);
    delay(8);
}
delay(500);
k=0;
}
页: [1]
查看完整版本: 求助!使用外部中断改变led的亮、灭和闪烁