单片机C语言,在main中调用某个函数成功,但是在子程序中调用该函数不成功,是不是不能在子程序中调用函数

具体是这样的:
被调用的函数是:void GetKey(void) {*********} 做矩阵键盘扫描
主函数是:
main()
{
********
GetKey();
switch(NUMCARS()/15)

{
case 0:{t=10;ewstate(t);break;}
case 1:{t=15;ewstate(t);break;}
case 2:
default:{t=20;ewstate(t);break;}
}
switch(NUMCARS()/15)
{
case 0:{t=10;nsstate(t);break;}
case 1:{t=15;nsstate(t);break;}
case 2:
default:{t=20;nsstate(t);break;}
}
}
在主函数中调用成功了,但是在void nsstate(unsigned char j)和void ewstate(unsigned char j)中调用都失败了,求解释怎么回事

第1个回答  2013-02-13
调用前,必须先声明函数,在所有函数之前加
void GetKey(void);

后面再调用就不会出错了追问

声明过了,不行啊

第2个回答  2013-02-13
是否在程序前部进行函数声明了。追问

声明过了,但是调用不成功啊

第3个回答  2013-02-13
在 nsstate和ewstate函数中调用GetKey吗?追问

对,而且之前已经进行了函数声明

追答

问题并没有那么简单,主函数中还有switch(NUMCARS()/15),调用GetKey的条件确定成立吗?怎样知道 nsstate和ewstate肯定有调用GetKey,仿真吗?NUMCARS()函数是什么,没把程序贴出来,调用GetKey的条件是否成立就无法分析了。

追问

nsstate和ewstate是液晶屏模拟交通灯的不同状态,GetKey扫描矩阵键盘,一旦有按键按下后就从nsstate,ewstate中跳出,执行显示当前时间的程序。调用GetKey还要条件吗?不是直接用就行了吗?

追答

nsstate和ewstate是在switch(NUMCARS()/15)下列的case里面的,如果switch的所有条件都不成立这两个函数怎么会被调用,如果这两个函数不被调用,GetKey又怎么被调用呢,你不是说在nsstate和ewstate调用GetKey不成功吗。

追问

switch的条件肯定会进入nsstate或者ewstate,不然液晶屏根本不会显示内容。现在的问题是,我发现,在main,nsstate和ewstate中,若只有任意一个程序调用GetKey没问题,可以运行,但是如果有2个或2个以上程序调用GetKey就失败了,用keil编译却是可以通过的。

追答

明白你的意思了,如体所述是不是声明太多的变量,又没有手动初始化过堆栈指针导致堆栈溢出,程序看不出有什么问题,只是不习惯case后面那些大括号。

本回答被提问者采纳
相似回答