打印

为什么两个读ADC的子程序,同时调用就不能显示/

[复制链接]
1855|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-8-15 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xzhenggen|  楼主 | 2007-8-15 13:43 | 只看该作者

第一个子程序如下:


void change(unsigned long temp)
{
       uchar i;
       serial_buff[4]=10;  //小数点
       for(i=1;i<8;i++)
       {
        if(i==4)continue; //跳过小数点的位置
        if(temp!=0)
        {
            serial_buff[8-i]=temp%10;
            temp/=10;
        }
        else 
        {
            serial_buff[8-i]=0;
        }
       } 
       if(serial_buff[1]==0)
       {        
        serial_buff[1]=12;    //空格
        if(serial_buff[2]==0)
        {
         serial_buff[2]=12;  //空格
        }
    }
}

void display_Pi() 
{
    //unsigned int Pi;
    float pow;
    //int value;
    unsigned char i;
    //Pi=read7896();
    //pow=Pi*AD_Loop_PickVol_PER;//AD采集数值
     pow=VariablePi*AD_Loop_PickVol_PER;//AD采集数值
    // pow=VariableVl*AD_Loop_PickVol_PER;//AD采集数值
    // value = pow * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
    if(pow>=1)
         {
             change(pow*1e3);
             draw_bmp(104,1,8,num[12]);//显示" "
        }
        else if(pow>=1e-3)
        {
            change(pow*1e6);
            draw_bmp(104,1,8,ELAPHT[11]);//显示"m"
        }
        else if(pow>=1e-6)
        {
            change(pow*1e9);
            //将前面的3位结果放到后面
            serial_buff[7]=serial_buff[3];
            serial_buff[6]=serial_buff[2];
            serial_buff[5]=serial_buff[1];
            //前面4位改为空格
            
            for(i=1;i<5;i++)serial_buff=12;
            draw_bmp(104,1,8,ELAPHT[10]);//显示"u"
        }
        else
         {
          change(0);
          for(i=1;i<7;i++)serial_buff=12;
         draw_bmp(104,1,8,ELAPHT[10]);//显示"u"
         }
        //显示读数
      for(i = 1; i <8; i++)
       {
         draw_bmp(32+i*8,1,8,num[serial_buff]]);
      }
      
        draw_bmp(8,1,8,num[15]);//显示":"
        draw_bmp(0,1,8,ELAPHT[13]);//显示"Pi"
        draw_bmp(112,1,8,ELAPHT[12]);//显示"W"     
}
 

使用特权

评论回复
板凳
xzhenggen|  楼主 | 2007-8-15 13:44 | 只看该作者

第二个子程序如下:

void di_change(unsigned int dtemp)
{
       uchar di;
       serial_buff_di[3]=10;
       for(di=1;di<6;di++)
       {
           if(di==3)continue;
        if(dtemp!=0)
        {
            serial_buff_di[6-di]=dtemp%10;
            dtemp/=10;
        }
        else 
        {
            serial_buff_di[6-di]=0;
        }
       }
       if(serial_buff_di[1]==0)
       {        
        serial_buff_di[1]=12;    //空格
      }
}

void di_display_Pi() 
{
    
    unsigned char di,drow=0;
    float dpow;
    float dy;
    unsigned long dx;
    uint dz;
    //int value;
    //Pi=read7896();
    //pow=Pi*AD_Loop_PickVol_PER;//AD采集数值
     //pow=VariablePi*AD_Loop_PickVol_PER;//AD采集数值
     //dpow=VariableVl*AD_Loop_PickVol_PER;//AD采集数值
    // value = pow * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
    dpow=0.001111489;
    if(dpow>=1)
         {
             dx=dpow*1e3;
             dy = 10*log10 (dx) ; 
         dz=dy*100 + (dz > 0 ? 0.5 : -0.5);
             di_change(dz);//显示“W”转换为“dBm"
        }
        else if(dpow>=1e-3)
        {
            dx=dpow*1e6;
            dy = 10*log10 (dx)-30 ; 
        dz=(dy)*100 + (dz > 0 ? 0.5 : -0.5);
            di_change(dz);//显示“mW”转换为“dBm"
        }
        else if(pow>=1e-6)
        {
            dx=dpow*1e9;
            dy = 10*log10 (dx)-60 ; 
            if(dy<0)
            {
               dy*=-1;
            }
        dz=(dy)*100 + (dz > 0 ? 0.5 : -0.5);
            di_change(dz);//显示“uW”转换为“dBm"
            draw_bmp(32,0,8,num[14]);//显示"-"
        }
        else
         {
          for(di=1;di<6;di++)serial_buff_di[di]=14;
         }
        //显示读数
      for(di = 1; di <6; di++)
       {
         draw_bmp(40+di*8,0,8,num[serial_buff_di][di]]);
      }
        draw_bmp(96,0,8,ELAPHT[3]);//显示"d" 
        draw_bmp(104,0,8,ELAPHT[4]);//显示"B" 
        draw_bmp(112,0,8,ELAPHT[11]);//显示"m" 
        draw_bmp(8,0,8,num[15]);//显示":"
        draw_bmp(0,0,8,ELAPHT[13]);//显示"Pi"
}

使用特权

评论回复
地板
风...| | 2007-8-15 21:29 | 只看该作者

"子程序所有变量全部改为不相同"

都是局部变量,名称是否相同不影响的。

另外,什么叫“同时调用”?

慢慢查查,一步步的查,比如会不会误触发中断?

还有,读ADC为何弄两个?如果是同一个ADC,最底层的就应该是同一个函数,读出的数据再分别在不同的函数里处理,最底层的没问题那就是处理函数的问题,依次检查之!

哈,仅供参考^_^

使用特权

评论回复
5
xzhenggen|  楼主 | 2007-8-16 17:09 | 只看该作者

LZ说得好,是变量引用问题引起来的.

 第二个子程序里的else if(pow>=1e-6)这一句改为: else if(dpow>=1e-6)就可以了.真晕啊!编译环境为啥不报驚出错呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

529

帖子

1

粉丝