极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11075|回复: 3

怎样在一个函数时,有中断来后跳转到主程序,而不再执行这个函数的剩余部分。

[复制链接]
发表于 2016-4-13 22:48:02 | 显示全部楼层 |阅读模式
如题:怎样在一个函数时,有中断来后跳转到主程序,而不再执行这个函数的剩余部分。

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语句,在这里应该行不通,我试了,它只能在一个函数内部跳转,而不能跨函数跳转。
回复

使用道具 举报

发表于 2016-4-14 20:05:25 | 显示全部楼层
你可以尝试一下break函数
回复 支持 反对

使用道具 举报

发表于 2016-4-14 23:54:14 | 显示全部楼层
也许 可以用循环短延时来达到播放时间的目的,在循环中放标记变量使用break 中断循环。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-16 08:48:50 | 显示全部楼层
谢谢各位,上面的都不行,不过我最近找到了一个比较可靠的方法:只写主要部分了: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
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 13:17 , Processed in 0.045655 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表