微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 当程序执行到音乐子程序后怎样让其退出并返回

当程序执行到音乐子程序后怎样让其退出并返回

时间:10-02 整理:3721RD 点击:
用红外遥控控制蜂鸣器播放音乐,在执行到音乐播放程序后,怎样才能在接收到红外中断信号后返回主程序,以实现待机或者暂停功能?大神帮忙解答一下

用goto语句

goto 语句能跳出子程序到主程序?

小编采用何种语言写的 是C还是汇编

当然是C,汇编要累死人

用标志位比较好实现吧,个人看法。workState == music_on   workState == music_off

恩,这是个好的建议,
可能是我描述不够清楚,如果是同一个C文件中的子程序是可以实现的;但是该音乐子程序要是在“soundplay.h”的子文件中;要怎样使用外部中断令其返回呢?一直无解

你的音乐子程序是死循环?

如果是死循环while就用个break退出就行了。在哪个文件里并没有啥影响啊……小编可能想多了

如果是死循环while就用个break退出就行了。在哪个文件里并没有啥影响啊……小编可能想多了

不是死循环,但是得将乐谱数组执行完毕才能推出呀。

我没有用break; 我用的是return;但是中断的后参数就算重新赋值,也给不到子文件里面;
#include"reg51.h"
#include"music.h"
#include"SoundPlay.h"
#include"lcd.h"
void main()
{       
       IrInit();
        LcdInit();
        InitialSound();
        while(1)
        {       
    LCD_Display();
                if(KeyValue[2]==0x44&&mark1==1)
                {
                        Play(Music_Girl,0,3,360,mark1);
                        delay(2500);
                        Play(Music_Same,0,3,360,mark1);
                        delay(2500);
                        Play(Music_Two,0,3,360,mark1);                       
                }                                   
        }               
}
我的主程序就如上面那样;但是Play(Music_Two,0,3,360,mark1)的子程序在“SoundPlay.h”中,不在“main.c”中;就是外部红外传感器中断重新改变mark1的参数值,对main.c中子程序进行全局变量的定义有用;但不能对#include"SoundPlay.h"中的子程序Play(Music_Two,0,3,360,mark1)进行重新赋值吧。

你的意思是mark1这个变量是全局变量,但是在红外中断中修改后,SoundPlay.C文件里的mark1并没有被改变对吧?如果是这样的话。 首先你要明白一点,函数的参数是怎么回事?例如下面这个示例
u8 a = 5;
void test(u8 a)
{
        a = 6;
}
void main(void)
{
        test(a);
}
主函数中test(a);执行完以后全局变量a等于多少呢? 答案是:5,并没有改变。函数传参数仅仅是将变量拷贝了一份传到函数内部去操作,所以并没有改变这个参数的数值。在你的例子里,你希望play函数在执行过程中因为某个参数的改变还改变运行状态,那这个mark1就不能以传参数的形式传入,直接操作全局变量mark1就可以。
那什么情况下传参数可以改变呢?以地址的形式传入,你修改这个地址上的内容就可以实现。
综上所述,小编好好学习一下C语言,扎实的语言功底事半功倍。

你说的我多少明白一些。但是mark1作为全局变量仍然无法到达soundplay.h子程序中,这就是我纠结的地方呀。

mark1不能作为子程序的参数传进去啊,直接使用,不要传参,不然中断更改的数值确实不能传入子程序,不知你是否想明白了

如果需要全部project 的话,我可以上传;



没有作为传参,我已经删掉了;作为传参只是我之前无解的时候实验一下而已;现在就是将mark1作为全局变量仍然无法在soundplay.h生效


你的意思是mark1这个变量是全局变量,但是在红外中断中修改后,SoundPlay

对呀,mark1是全局变量,在红外中断修改参数值后,无法的soundplay.h中生效,需要重新定义,这样该怎么办?请指导

你在子程序中声明这个变量了吗?
在最上面加一句 extern u8 mark1;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top