⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.txt

📁 电子称重的程序
💻 TXT
字号:
void scalegetzero();
void scale_setup();
void scale_opset();
void Time_UserHOOK();
void checkvolt();
//void ResetSCALESet();
void checkunit();
float pow10(char t);
void checkssens();
void resetad();
void showvolt();
bit countrule();
void writeonoff(bit nf);
long setnumbcd(long numset,long numlim,Uchar chchar,char incnum);




/**************************************************************************
*      函数原型: void scalegetzero()
*      功    能: 获取零点
**************************************************************************/
 void scalegetzero()
 {
  Uchar i;
  for(i=0;i<5;)
  {
   while(!getad()&&(!resetadbit));  //连续滤波5次,再进行保存零点
     if(resetadbit)
  {
  resetad();
  adchipdog=0;
beep(1000);
  }
   templong= readad();
   templong=scalem_FILAD(templong);
   if(templong) i++;
   }
   scalenow.zero=templong;
 }
 /**************************************************************************
*      函数原型: void scale_setup()
*      功    能: 经销商设定
**************************************************************************/
void scale_setup()
{
 char      key_t,i;
 #if SYS_SETFIL_EN
 aprintf(0x10,"FIL");    //设置滤波方式
 while(1)
  {
  aprintf(0x00,"%3bd",scaleset.filmode);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){
	if(scaleset.filmode++>FILMS)scaleset.filmode=0;
  	}
  if(KEY_NEXT==key_t){
  	E_write(I2C_FILMODE, scaleset.filmode);
  	break;}
  if(KEY_OUT==key_t){
  	E_write(I2C_FILMODE, scaleset.filmode);
  	return;
  }
  }
  #endif
  #if SYS_SETZER_EN
  aprintf(0x10,"ZER");   //设置零点范围
  while(1)
  {
  aprintf(0x00,"%3bd",zerot[scaleset.zeromode]);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){
	if(scaleset.zeromode++>ZEROMS){scaleset.zeromode=0;}
 	}
  if(KEY_NEXT==key_t){
  	E_write(I2C_ZEROMODE, scaleset.zeromode);
  	break;
        }
  if(ZERO==key_t){
  	E_write(I2C_ZEROMODE, scaleset.zeromode);
        tempbit=1;
  	break;
        }

  }
  #endif
  aprintf(0x10,"CAP");     //设置量程
  while(1)
  {
  scalescap=(scaps[scaleset.scap].scapn*pow10(scaleset.scapex));  //取得最大秤量
  aprintf(0x00,"% 5f",scalescap);
  while(!getkey());
  key_t=key_read();
  beep(100);
  if(KEY_ADD==key_t){
	if(++scaleset.scap>CAPS){scaleset.scap=0;}
  	}
  if(KEY_SUB==key_t){
	if(scaleset.scap--==0){scaleset.scap=CAPS;}
  	}
  if(KEY_CHA==key_t){
	if(++scaleset.scapex>4){scaleset.scapex=0;}
  	}
  if(KEY_NEXT==key_t){
  	E_write(I2C_SCAP, scaleset.scap);
	E_write(I2C_SCAPEX, scaleset.scapex);
  	break;
   }
  }
  checkssens();
  aprintf(0x10,"DIV");
  while(1) //
  {
  i=ssenss[scaleset.ssens].dot-scaleset.scapex;
  aprintf(0x00,fpt[i>=0?i:0],ssenss[scaleset.ssens].ssenn*pow10(scaleset.scapex));
  while(!getkey());
  key_t=key_read();
  beep(100);
  if(KEY_CHA==key_t){scaleset.ssens++;checkssens();}
  if(KEY_NEXT==key_t)
  {
  	E_write(I2C_SSENS,scaleset.ssens);
  	break;
   }
  }
  aprintf(0x10,"WEI");
  if(scalesys.cweight>scalescap)scalesys.cweight=scalescap;
  temp2=ssenss[scaleset.ssens].dot;
  temp=temp2;
  while(1)
  {
  aprintf(0x00|(temp+1),fptn[5-temp2][i>=0?i:0],scalesys.cweight);
  while(!getkey());
  key_t=key_read();
  beep(100);
 if(KEY_ADD==key_t||KEY_SUB==key_t)
    {
     scalesys.cweight=(float)setnumbcd(scalesys.cweight*pow10(i),(long)scaps[scaleset.scap].scapn*
     pow10(ssenss[scaleset.ssens].dot),temp,KEY_ADD==key_t?1:-1)/pow10(i);
    }
   if(KEY_CHA==key_t)
  {
       if(--temp<0)temp=temp2;
  }
  if(KEY_NEXT==key_t)
  {
  if(scalesys.cweight)
  {
    E_writeex(I2C_CWEIGHT,(Uchar *)&(scalesys.cweight),sizeof(scalesys.cweight));
    break;
  }
    else    beep(1000);
   }
  }
  aprintf(0x10,"CAL");
  enadof=1;
  i=0;
  temp=0;
  while(1)
  {
  if(resetadbit)
  {
  resetad();
  adchipdog=0;
  beep(1000);
 }
  if(getkey())
	{
	  key_t=key_read();
	  if(KEY_NEXT==key_t)
	  {
          if(!i){scalenow.zero=scalenow.ad;i=3;}
          else if(i==3)
          {
            if(countrule())break;
	    else beep(300);
          }
	  }
           if(KEY_CHA==key_t)
           {
           enadof=0;
           if(i<3&&(++i>2))
           {i=0;
           E_writeex(I2C_ADCHIP,(Uchar *)&adchip,sizeof(adchip));
           resetad();
           }
           }
           if(KEY_ADD==key_t)
           {
            if(i==1){if(++adchip.zero>9)adchip.zero=-9;}
            else if(i==2){if(++adchip.gain>9)adchip.gain=0;}
           }
           if(KEY_SUB==key_t)
           {
            if(i==1){if(--adchip.zero<-9)adchip.zero=9;}
            else if(i==2){if(adchip.gain--==0)adchip.gain=9;}
           }
           if(i==1)
           {
           aprintf(0x10,"ADZ");              //调整AD零点
           aprintf(0x00,"%6bd",adchip.zero);
           }
           else if(i==2)
           {
           aprintf(0x10,"ADG");     //调整AD放大倍数
           aprintf(0x00,"%6bd",adchip.gain);
           }
           else  if(i==0)aprintf(0x10,"CAL");
           else   aprintf(0x10,"LOD");
	}
  if(getad())
	  {
	     templong= readad();
	     templong=scalem_FILAD(templong);
             if((!i||(i==3))){
	     if(!templong)continue;
             enadof=1;
	     if(labs(scalenow.ad-templong)<1){
             lcd_flagset(LCD_STA,1);
             scalestaflag=1;temp++;}
	     else{lcd_flagset(LCD_STA,0);scalestaflag=0;temp=0;}
             scalenow.ad=templong;
             aprintf(0x00,"%6ld",templong);
             if((i==3)&&(abs(temp)>3))
             {
             if(countrule())break;
             else beep(300);
             }
         }
      }
  }
  for(i=0;unitt[i].unitn!=0;i++) //自动打开和关闭单位
  {
	if(unitt[i].unitmode==1)
	{
                templong=scalescap/unitt[i].unitn;
	        if(templong/16>999)
		scalesys.sysunits&=~unitt[i].unitbit;
		else  scalesys.sysunits|=unitt[i].unitbit;

	}
	else
	{
  	if(scalescap/unitt[i].unitn>=900000)
	{
               scalesys.sysunits&=~unitt[i].unitbit;

	}
	else    scalesys.sysunits|=unitt[i].unitbit;
	}
  }
  scalesys.units&=scalesys.sysunits;
  E_writeex(I2C_SYSUNITS,(Uchar * )&scalesys.sysunits,sizeof(scalesys.sysunits));
#if !USER_UNITSET_EN
 for(i=0;unitt[i].unitn!=0;i++)   //手动打开和关闭单位
 {
 aprintf(0x00,"      ");
 tempbit=scalesys.sysunits&unitt[i].unitbit;
 if(!tempbit)continue;
   while(1)
  {
   if(!scalesys.units)
        scalesys.units|=unitt[i].unitbit;
  writeonoff(scalesys.units&unitt[i].unitbit);
  aprintf(0x10,unitt[i].unitshow);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){scalesys.units^=unitt[i].unitbit; }
  if(KEY_NEXT==key_t){E_writeex(I2C_UNITS, (Uchar *)&scalesys.units,sizeof(scalesys.sysunits));break; }
  if(KEY_OUT==key_t){return;}
  }
}
#endif
}
 /**************************************************************************
*      函数原型: void scale_setup()
*      功    能: 用户参数设定
**************************************************************************/
void scale_opset()
{
Uchar	key_t;
 while(1)
 {
 //aprintf(0x00,"      ");
 while(1)
  {
  writeonoff(scaleset.flag&POWREN);       //自动开关机设定
  aprintf(0x10,"PWR");
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t)scaleset.flag^=POWREN;
  if(KEY_NEXT==key_t){E_write(I2C_FLAG, scaleset.flag); break;}
  if(KEY_OUT==key_t){return;}
  }
 while(1)
  {
   writeonoff(scaleset.flag&LIGHTEN);   //背光设置
  aprintf(0x10,"BL ");
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){scaleset.flag^=LIGHTEN;lcd_setback(scaleset.flag&LIGHTEN); }
  if(KEY_NEXT==key_t){E_write(I2C_FLAG, scaleset.flag); break;}
  if(KEY_OUT==key_t){return;}
  }
 while(1)
  {
  writeonoff(scaleset.flag&HOLDEN);
  aprintf(0x10," HD");                //锁定开关设置
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){scaleset.flag^=HOLDEN;}
  if(KEY_NEXT==key_t){E_write(I2C_FLAG, scaleset.flag); break;}
  if(KEY_OUT==key_t){return;}
  }
 aprintf(0x10," HT");              //锁定量
 while(1)
  {
  if(holdset.holdd)
  lcd_writen(holdset.holdd,3);
  else
  lcd_writen(' ',3);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){if(++holdset.holdd>5)holdset.holdd=0;}
  if(KEY_NEXT==key_t){E_write(I2C_HOLDSET_HOLDD,holdset.holdd); break;}
  if(KEY_OUT==key_t){return;}
  }
aprintf(0x00,"      ");
aprintf(0x10," HR");     //锁定快慢设定
 while(1)
  {
  lcd_writen(holdset.holdt,2);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){if(++holdset.holdt>7)holdset.holdt=0;}
  if(KEY_NEXT==key_t){E_write(I2C_HOLDSET_HOLDT,holdset.holdt); break;}
  if(KEY_OUT==key_t){return;}
  }
#if USER_SETHLWARNEN_EN
while(1)
  {
  writeonoff(scaleset.flag&HLEN);//上下限报警开关设定
  aprintf(0x10,"LIM");
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t)scaleset.flag^=HLEN;
  if(KEY_NEXT==key_t){E_write(I2C_FLAG, scaleset.flag); break;}
  if(KEY_OUT==key_t){return;}
  }
#endif

#if USER_UNITSET_EN
for(i=0;unitt[i].unitn!=0;i++) //单位设置
{
 //aprintf(0x00,"      ");
 tempbit=scalesys.sysunits&unitt[i].unitbit;
 if(!tempbit)continue;
   while(1)
  {
   if(scalesys.units==0)
        scalesys.units|=unitt[i].unitbit;
  writeonoff(scalesys.units&unitt[i].unitbit);
  aprintf(0x10,unitt[i].unitshow);
  while(!getkey());
  key_t=key_read();
  if(KEY_CHA==key_t){scalesys.units^=unitt[i].unitbit; }
  if(KEY_NEXT==key_t){E_writeex(I2C_UNITS, &scalesys.units,sizeof(scalesys.units));break; }
  if(KEY_OUT==key_t){return;}
  }
}
#endif
}
}
 /**************************************************************************
*      函数原型: void scale_setup()
*      功    能: 电压检测
**************************************************************************/
void checkvolt()
{
 Uint volt;
 while(!getad()&&(!resetadbit));
 readad();
 volt=readvolt();  //显示电压值
 aprintf(0x10," V ");
 aprintf(0x00,"%7.2f",(float)volt/100);
 showvolt();    //在电池符号位置显示电压条
}

/**************************************************************************
*      函数原型: void Time_UserHOOK()
*      功    能: 用户定时调用钩子函数,由系统定时器调用
**************************************************************************/
void Time_UserHOOK()
{
 Ulong  systime;
 systime=getsystime();
 if((scaleset.flag&POWREN)&&weightf) //如果允许自动关机则进行计时
 {
 if((!(Uint)systime)&&(powertime))powertime--;
 if(!powertime){lcd_set(0);lcd_setback(0);}    //到了关机时间则关机
 }

 if(powertime){     //只有没关机时才发声发送数据等
 if(scaleset.flag&HLEN)
 {
  if(weightuhf){if((((Uchar)systime)&0x3f)==0)beep(200);}
  else if(weightulf){if((((Uchar)systime)&0x7f)==0)beep(200);}
 }
 if(weightshf){if((((Uchar)systime)&0x1f)==0)beep(200);}
 }
 if((((Uchar)systime)&0x1f)==0) //AD看门狗
 {
 if(++adchipdog>5)
 {
 resetadbit=1;   //AD复位标志置位
 beep(1000);
 }
 }
 }
 /**************************************************************************
*      函数原型:  void checkunit()
*      功    能: 判断所选单位是否为打开的单位并自动选择
**************************************************************************/
void checkunit()
{
 while(!(unitt[scaleset.unit].unitbit&scalesys.units)){
	      	scaleset.unit++;
	      	if(unitt[scaleset.unit].unitn==0||scaleset.unit>10){scaleset.unit=0;}
	        }
	        E_write(I2C_UNIT,scaleset.unit);
}
 /**************************************************************************
*      函数原型:  Ulong pow10(Uchar t)
*      功    能: 返回10的指数函数值
**************************************************************************/
float pow10(char t)
{
if(t>=0)
 return pow10t[t];
 else   return powp10t[-t];
}
 /**************************************************************************
*      函数原型:  void resetad()
*      功    能: 复位AD芯片
**************************************************************************/
void resetad()
{
//inin5550(0x20,0);
inin5550(gaint[adchip.gain],adchip.zero);
}
 /**************************************************************************
*      函数原型:  void showvolt()
*      功    能: 在电池符号上显示电压条
**************************************************************************/
void showvolt()
{
if(readvolt()<460)temp=0;
else
temp=(readvolt()-460)/50;
		 if(temp>5)temp=5;
		 if(temp<2)
		 {
		 voltlow=1;
		 voltsbit=~voltsbit;
		 if(voltsbit)lcd_writevolt(-1);
		 else lcd_writevolt(temp>0?temp:0);
		 }
		 else
		 {
			 voltlow=0;
			 lcd_writevolt(temp);
		 }
 while(readvolt()<530)
 {
 aprintf(0x00," L-BAT ");
 aprintf(0x10,"   ");
 lcd_writevolt(0);
 }
}
bit countrule()
{
if((scalenow.ad-scalenow.zero)>10000)
{
  scalesys.rule=scalesys.cweight/(scalenow.ad-scalenow.zero);
  E_writeex(I2C_RULE,(Uchar *)&scalesys.rule,sizeof(scalesys.rule));
   return 1;
}
  else return 0;
}

void writeonoff(bit nf)
{
  aprintf(0x00,nf?"  ON  ":" OFF  ");
}
void checkssens()
{
if(scaleset.ssens>scaps[scaleset.scap].high)
	{
	   scaleset.ssens=scaps[scaleset.scap].low;
	}
 if(scaleset.ssens<scaps[scaleset.scap].low)
    {
      scaleset.ssens=scaps[scaleset.scap].high;
    }
}
long setnumbcd(long numset,long numlim,Uchar chchar,char incnum)
{
  char settemp,limtemp;
  bit tempbit;
  if(numset>numlim)numset=numlim;
  chchar%=6;
  settemp=(long)(numset/pow10(chchar))%10;
  numset-=settemp*pow10(chchar);
  limtemp=(long)(numlim/pow10(chchar))%10;
  settemp+=incnum;
  if(settemp<0){settemp=(limtemp>0?limtemp:9);limtemp=-1;}
  tempbit=(numset+settemp*pow10(chchar))>numlim;
  if(tempbit)
  {
  if(limtemp>=0)settemp=0;
  else settemp--;
  }
  return   numset+settemp*pow10(chchar);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -