1

我有一个程序有许多不同的长时间运行的部分(一次可以是 15 分钟),它使用“IF”语句来决定要执行的部分。

我的问题是我希望能够按下一个按钮并让它立即移动到另一个部分,而不必等待当前部分完成。

我以为我可以使用外部中断,但我看到中断只是导致程序停止执行中断代码并继续从调用中断之前的相同位置运行。

然后我想我可以使用“goto”语句,但这不起作用,因为编译器会抱怨如果您的标签超出了您正在使用“goto”语句的函数。

我已经在下面发布了我的代码,我基本上希望能够按下按钮并让代码移动到下一个“IF”语句,无论当我按下按钮时它在做什么。

延迟只是为了模拟程序会做什么。该程序实际上适用于具有许多不同模式的机器人。在模式 1 中只是导航。在模式 2 中,它可以由控制器控制。在模式 3 中,它会一直停留,直到 PIR 传感器看到一些东西,然后它就会开始四处漫游。

所以你看到机器人可以在任何时间处于任何状态做任何事情。我想按下一个按钮让它停止并改变模式。

示例代码

volatile int state = LOW;
int mode = 0;

void setup()
{ 
  Serial.begin(9600);  
  attachInterrupt(0, blink, RISING);
}

void loop()
{  
  Serial.println();
  Serial.print("##########################");
  Serial.println();
  Serial.print("Start it again");
  Serial.println();
  Serial.print("##########################");

 if(mode==0)
  {Serial.println();
  Serial.print("0");
  Serial.println();
  delay(30000);}

if(mode==1)
  {Serial.println();
  Serial.print("1");
  Serial.println();
  delay(30000);}

if(mode==2)
  {Serial.println();
  Serial.print("2");
  Serial.println();
  delay(30000);}

 if(mode==3)
  {Serial.println();
  Serial.print("3");
  Serial.println();
  delay(30000);}

 if(mode==4)
  {Serial.println();
  Serial.print("4");
  Serial.println();
  delay(30000);}

}

void blink()
{ delay(800); // This is just a delay to allow for the button press 
  if(mode >= 4)
    {mode = 0;}
  else{mode = ++mode ;}
}
4

2 回答 2

1

您应该对代码进行结构化,以便子例程不会花费很长时间。

while(1){
    switch(mode){
         case 0: //one cycle of case 0
         break;
         case 1: //one cycle of case 1
         break;
    }
}

然后,在您的中断服务程序中,您可以设置模式。

于 2013-06-26T21:09:36.983 回答
0

用一个新函数替换所有出现的delay(3000);,该函数执行以下 30 次:如果按钮已被按下,则返回,否则,延迟 100。

于 2013-06-26T20:45:06.710 回答