当程序执行到音乐子程序后怎样让其退出并返回
用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;