2886|3

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢? [复制链接]

//功能: 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     {
      
        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         
  //***************一次送出**********
     _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).


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

最新回复

大哥,您太厉害了!  详情 回复 发表于 2007-3-26 18:24
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你在有可能同一时间调用了一个不可重入函数!!
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一:你现在中断做的事太多!!你的定时非常不可靠
二:把你的显示放到中断处理之外

基本是:
void Jtimer1(void) interrupt 3
{
    //定时,处理定时变量
    i++;
}

在主函数里:

if (i > MAX)
{
    //处理显示
    SD234Display(...);
    i = 0;
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
大哥,您太厉害了!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表