我有一个程序,它有许多不同的长期运行部分(一次可以是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 ;}
}
答案 0 :(得分:1)
您应该构造代码,以便子程序不会花费很长时间。
while(1){
switch(mode){
case 0: //one cycle of case 0
break;
case 1: //one cycle of case 1
break;
}
}
然后,在您的中断服务程序中,您可以设置模式。
答案 1 :(得分:0)
用新函数替换所有出现的delay(3000);
,执行以下30次操作:如果按下按钮,则返回,否则延迟100。