怎样在一个函数时,有中断来后跳转到主程序,而不再执行这个函数的剩余部分。
如题:怎样在一个函数时,有中断来后跳转到主程序,而不再执行这个函数的剩余部分。void gate1()
{
time1 = micros();//毫秒
flag = 1;
}
void setup()
{
attachInterrupt(0, gate1, RISING);
Serial.begin(9600);
}
void loop()
{
if (flag == 1) {
music();
flag = 0;
}
}
void music() {
tone(7, 440);
delay(3000);
tone(7, 880);
delay(3000);
}
tone是发音440HZ,880HZ,我的要求是,当有中断时,中止music(),重新执行music()的440HZ。比如music执行了4s,这时在执行880HZ,,来了中断,那么它flag变成了1,它必须再880HZ2s,问题又来了,紧跟着的flag=0使得它不重新执行music,也就是说这次中断无效了。因此有什么方法使这个中断来了,重新且立即执行music的440HZ,
先声明, 有个goto语句,在这里应该行不通,我试了,它只能在一个函数内部跳转,而不能跨函数跳转。
你可以尝试一下break函数 也许 可以用循环短延时来达到播放时间的目的,在循环中放标记变量使用break 中断循环。 谢谢各位,上面的都不行,不过我最近找到了一个比较可靠的方法:只写主要部分了:void gate1()
{
time1 = micros();//毫秒
if( flag == 1){
timeT=0;
}
flag=1;
}
另一个函数改为:for(int i=0;i<10;i++){
tone(musicPin, z5);
delay(timeT / 40000);
}
tone(musicPin, g1);
for(int i=0;i<10;i++){
delay(timeT / 40000);
}
noTone(musicPin);
}
看懂了吗,就是引入timeT,如果触发,则让timeT变为0
页:
[1]