读书人

请问:在中断里可以调用 原先定义的函

发布时间: 2012-03-31 13:13:26 作者: rapoo

请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢?
//功能: SD2,SD3,SD4 显示
//参数: LedNumber表示是数码管的个数
//参数: LedCoin 是显示的数码管内容

void SD234Display(int LedNumber ,uchar8 *LedCoin) //SD2,SD3,SD4 显示
{

int i; //数码管的个数
int j; //送出数据时的 8 次循环

int LedB; //真正的下标,是通过 Led 转换过来的
uchar8 *Led595s; //定义数码管内容指针
uchar8 Led; //要显示的数字,也是 数组 Led595NoDot 或 Led595Dot 中被
//选取元素的下标,不过这里得到的是字符
uchar8 LedN; //数组 Led595NoDot 或 Led595Do 中真正被选中的元素


i = 0; //初始化 i 为 LedNumber 表示从字符串的最后一个开始处理,
//也就是从最后一个开始输出
Led595s = LedCoin ; //使 Led595 和 LedCoin 指向同一个地址


while(i <LedNumber) //当 i 小于 数码管个数
{

Led = *(Led595s+i); //取出数据
LedB = Led - '0 ' ; //得到数组真正的下标 ,因为 Led 是 char 类型的
i=i++;

//*****************************处理 Led ****************
LedN = Led595Dot[LedB];

for (j=0; j <8; j++)
{
if (LedN & 0x01) //发送 1
{
CK1 = 0 ;
DIN2 = 1;


_nop_();
_nop_();
CK1 = 1;
}
else //发送 0
{
CK1 = 0 ;
DIN2 = 0;
_nop_();
_nop_();
CK1 = 1;
}
LedN = LedN > > 1; //LedN 右移
}

//****************************处理 Led ****************
}//whie(i <LedNumber)

//***************一次送出**********
_nop_();
_nop_();

LATCH2 = 0; //在时钟下降沿把数据送出
_nop_();
_nop_();
LATCH2 = 1;
//***************一次送出**********
}

void Jtimer1(void) interrupt 3 //喂狗中断程序
{
TH1 = 60536/256; //重载计数初值 每 10 ms 中断一次
TL1 = 60536%256;

if (IsOrNoJs== 'Y ')//表示时间开始减
{
WDogZdJs ++;
if ( WDogZdJs > = 4610 ) //4600-4610 之间


{
WDogZdJs = 0; //赋初值
TimeJNumber++;

Sd4Numner = SD234Number[0] - '0 '; //SD4 此时的值
Sd3Numner = SD234Number[1] - '0 '; //SD3 此时的值
Sd2Numner = SD234Number[2] - '0 '; //SD2 此时的值

if ((Sd4Numner!=0) || (Sd3Numner!=0) || (Sd2Numner!=0)) //时分不都为 0 ,也就是还最少有 1 分钟
{
if (Sd4Numner==0) //
{
Sd4Numner = 9;
Sd3Numner = Sd3Numner - 1; //减位
}
else
{
Sd4Numner = Sd4Numner -1;
}



if (Sd3Numner <0)
{//2
Sd3Numner = 9;
Sd2Numner = Sd2Numner -1;
if (Sd2Numner <0)
{
Sd2Numner = 9;
}
}//2

SD234Number[0]=Sd4Numner + '0 '; //化为 char 类型
SD234Number[1]=Sd3Numner + '0 '; //化为 char 类型
SD234Number[2]=Sd2Numner + '0 '; //化为 char 类型
SD234Display(3,SD234Number); //使数码管显示 这里有个警告


}//if ((Sd4Numner==0) || (Sd3Numner==0) || (Sd3Numner==0))
}//WDogZdJs > = 60

}//IsOrNoJs== 'Y '

}


我在 void Jtimer1(void) interrupt 3 调用了
SD234Display(3,SD234Number); //使数码管显示
Build target 'Target 1 '
assembling STARTUP.A51...
compiling MAIN.C...
linking...
*** WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_SD234DISPLAY?MAIN
CALLER1: ?C_C51STARTUP
CALLER2: ?PR?JTIMER1?MAIN
Program Size: data=66.0 xdata=0 code=952
creating hex file from "PRO "...
"PRO " - 0 Error(s), 1 Warning(s).


各位大哥,我是错在哪里?
谢谢!

[解决办法]
你在有可能同一时间调用了一个不可重入函数!!

读书人网 >单片机

热点推荐