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

📄 fivet140y.c

📁 kp故障检测仪器键盘显示程序 各个通道显示时间计时
💻 C
📖 第 1 页 / 共 2 页
字号:
		       Modified=0;
	           }

          CHnum++;
          if(CHnum>5)
          {
           CHnum=1;
           low_f=0;  //5个通道都已经设置,退出设置下限模式
           opAD_flag=1;
           circle=1;
           return;
          }
          return;
     }

  if(up_f)//如果是在显示上限模式下,则做以下处理
     {
	   if(Modified)//如果下限值有被修改,将修改过的下限值写入EEPROM
		{  close();
                   ewr(25+CHnum,Upper[CHnum-1]);
                   //wait(10000);
                   open();
		   Modified=0;
		}
          CHnum++;
          if(CHnum>5)
          {
            CHnum=1;
            up_f=0; //5个通道都已经设置,退出设置上限模式
            opAD_flag=1;
            circle=1;
            return;
          }
          return;
     }

   if(single)  //如果是在单通道显示模式下,则退出此模式,转为正常循环
     {
        single=0;
        circle=1;
        key4_f=0;
        return;    //返回
     }

  switch(key4_f)
  {
    case 1: {
              CHnum=0;
              Adj_Zero=1;     //进入调0模式
              break;
            }
    case 2: {                 //单通道显示模式
              CHnum=1;
              single=1;
              circle=0;
              opAD_flag=1;
              break;
            }
    case 3: {
              up_f=1;//显示上限标志置一
              CHnum=1;
              //single=0;
              circle=0;
              opAD_flag=0;//禁止操作AD
              break;
            }
    case 4: {
              low_f=1;//显示下限标志置一
              CHnum=1;
              circle=0;
              opAD_flag=0;//禁止操作AD
              break;
            }
    default: break;
  }

  key4_f=0;//key4_f清0,否则下次再按K4,计数会错误
  return;
}

/*减少键k2处理函数*/
void Key2()
{
  if(single) //是单通道显示模式下
   {
     if(--CHnum<1) CHnum=5;
     opAD_flag=1;
     return;
   }
  if(up_f)//在调整上限模式下
   {
     if(Upper[CHnum-1]>50) //上限值不能低于50
       Upper[CHnum-1]-=1;//减一
       Modified=1;//设置限制已有修改标志
     return;
   }
   if(low_f)//在调整下限模式下
   {
     if(Lower[CHnum-1]>0) //下限值不能低于0
       Lower[CHnum-1]-=1;//减一
       Modified=1;//设置限制已有修改标志
     return;
   }
}

/*增加键k3处理函数*/
void Key3()
{
   if(single) //是单通道显示模式下
   {
     if(++CHnum>5) CHnum=1;
     opAD_flag=1;
     return;
   }
   if(up_f)//在调整上限模式下
   {
     if(Upper[CHnum-1]<200)//上限值不能大于200
       Upper[CHnum-1]+=1;//加一
       Modified=1;//设置限制已有修改标志
     return;
   }
   if(low_f)//在调整下限模式下
   {
     if(Lower[CHnum-1]<40) //下限值不能大于40
       Lower[CHnum-1]+=1;//加一
       Modified=1;//设置限制已有修改标志
     return;
   }

}


/*模式键k4处理函数*/
void Key4()
{
  idata unsigned char i;

   if(Adj_Zero||single||up_f||low_f)  //如果是在调零模式、单通道显示模式、设置上下限模式,则此按键无效
     {

        key4_f=0;
        return;    //返回
     }

  key4_f++;
  if(key4_f>4) key4_f=1;

  switch(key4_f)
  {
    case 1: {
                 Vcode[1]=0;//"0"给DS6,调0模式信息为F0
	         break;
	    }
    case 2: {
                 Vcode[1]=1;//"1"给DS6,单通道循环显示模式信息为F1
                 break;
            }
    case 3: {
                 Vcode[1]=2;//"2"给DS6,设置上限模式信息为F2
                 break;
            }
    case 4: {
                 Vcode[1]=3;//"3"给DS6,设置下限模式信息为F3
                 break;
            }
    default:     break;
  }
  ModeWait=1;
  Vcode[0]=14;//"F"给DS7
  Vcode[3]=Vcode[4]=Vcode[5]=Vcode[6]=11;//"-"
  for(i=0;i<7;i++) Dis_dat[i]=table[Vcode[i]];//显示模式信息
  return;
}

/*显示下限*/
void dislow(void)
{
  sendlim(Lower[CHnum-1]);
}

/*显示上限*/
void disup(void)
{
  sendlim(Upper[CHnum-1]);
}

/*送上(下)限值去显示缓存*/
void sendlim(signed char temp)
{ idata unsigned char i;
  Dis_dat[0]=table[CHnum];                  //第一个为通道号
  Dis_dat[1]=0x00;
  //if(temp<0) {Dis_dat[1]=0xbf;temp=-1*temp;}//负值,第二个显示负号,并取绝对值
  //else Dis_dat[1]=0xff;                     //正值,第二个灭

  if(temp==0)
    {
      Dis_dat[6]=table[0];//最后一位显示0
      Dis_dat[1]=Dis_dat[2]=Dis_dat[3]=Dis_dat[4]=Dis_dat[5]=0x00;//其它灭
    }
  else
  {
    for(i=6;i>1;i--)
    {
      if(temp>0)
       {
         Dis_dat[i]=table[temp%10];   //各位的数字放入对应显示缓存
         temp=temp/10;
       }
      else  Dis_dat[i]=0x00; //没有数字的位灭
    }
   }
}

void CTRL_R(float value)
{
   data unsigned char IOCON;
           //idata unsigned Upnum=0,Lonum=0;//记录超过限值的通道数

           if(value>Upper[CHnum-1])//判断是否超过上限
             Upnum++; //记录超过上限的通道数
           else if(value<Lower[CHnum-1])//判断是否低于下限
             Lonum++; //记录低于下限的通道数

           if(Upnum>0&&Lonum>0)
             IOCON=0X33;
           if(Upnum>0&&Lonum==0)
             IOCON=0X32;
	   if(Upnum==0&&Lonum==0)
	     IOCON=0X30;
	   if(Upnum==0&&Lonum>0)
	     IOCON=0X31;
           close();
           writetoreg(0x07); //write to communication register. The next step is writing to IO REGISTER
           open();
           close();
	   writetoreg(IOCON);//control IO
           open();
           if(circle&&CHnum==5) Upnum=Lonum=0;//循环显示的时候,CHnum=5时候清零
           else if(single) Upnum=Lonum=0;//单通道显示的时候每次清零

}

/*喂看门狗*/
void dog(void)
{
	CATDAT=0;
	wait_delay();
	CATDAT=1;
}

/*存浮点数到EEPROM*/
void FtoE(float a,unsigned char adr)
{
  idata unsigned char i;
  data char *px,x[4],dat;
  void *pf;

  px=x;
  pf=&a;

  for(i=0;i<4;i++)//强制void型指针转成char型,因为void型指针不能运算
  {*(px+i)=*((char *)pf+i);}
  for(i=0;i<4;i++)
  {
    dat=x[i];
    ewr(adr+i,dat);
    wait(10000);
  }

}

/*从EEPROM读取浮点数*/
float EtoF(unsigned char adr)
{
  idata float a;
  idata unsigned char i;
  idata char *px,x[4],dat;
  void *pf;

  for(i=0;i<4;i++)
  {
    dat=erd(adr+i);
    x[i]=dat;
  }

  px=x;
  pf=&a;
  for(i=0;i<4;i++)
   { *((char *)pf+i)=*(px+i);   }

  return(a);
}

/*eerom不存在或损坏显示*/
void disperr(void)
{
  idata unsigned char i;
   //填入eeprom的错误信息,DS7DS6显示E1,其他显示-
  Vcode[0]=10;
  Vcode[1]=1;
  Vcode[3]=Vcode[4]=Vcode[5]=Vcode[6]=11;
  for(i=0;i<7;i++) Dis_dat[i]=table[Vcode[i]];

}


/*非应答函数*/
void mnack(void)
{
  CATDAT=1;
  wait_delay();
  CATCLK=1;
  wait_delay();
  CATCLK=0;
}

/*I2C总线开始函数*/
void start(void)
{

        CATDAT=1;
	wait_delay();
	CATCLK=1;
	wait_delay();
	CATDAT=0;
	wait_delay();
	CATCLK=0;
	wait_delay();
}

/*I2C总线停止函数*/
void stop(void)
{
	CATDAT=0;
	wait_delay();
	CATCLK=1;
	wait_delay();
	CATDAT=1;
	wait_delay();
}
/*I2C总线字节接收传送函数*/
unsigned char erxd(void)
{
	idata unsigned char n=0;
	idata unsigned char j;
	for(j=0;j<8;j++)
	{
		CATDAT=1;
		n=n<<1;
		CATCLK=1;
		wait_delay();
		if(CATDAT==1) n++;
		CATCLK=0;
	}
	return(n);
}
/*I2C字节写传送函数*/
void etxd(n)
unsigned char n;
{
	idata unsigned char i;
	for(i=0;i<8;i++)
	{
		if((n&0x80)!=0)	CATDAT=1;
		else CATDAT=0;
		wait_delay();
		CATCLK=1;
		wait_delay();
		n=n<<1;
		CATCLK=0;
	}
}
/*I2C字节读函数*/
unsigned char erd(adds)
unsigned char adds;
{
	idata unsigned char dats;
	start();
	etxd(0xa0);
	mnack();
	etxd(adds);
	mnack();
	start();
	etxd(0xa1);
	mnack();
	dats=erxd();
	mnack();
	stop();
	return(dats);
}
/*I2C字节写函数*/
void ewr(unsigned char adds, unsigned char dats)
{
    start();
    etxd(0xa0);
    mnack();
    etxd(adds);
	mnack();
	etxd(dats);
	mnack();
	stop();
}

/*延时等待函数*/
void wait_delay(void)
{
	nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;
	nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;nopt=!nopt;
}

/*等待延时函数*/
void wait(unsigned int ji)
{
    idata unsigned int jj;

	jj=ji;
	dog();
	do {jj--;}while(jj!=0);

}

/*延时*/
void delay(unsigned int time)
{
  idata unsigned char i;
  close();   //软件延时的时候关中断
  while(time--)
  {
    for(i=0;i<10;i++) {;}
  }
  open();
}




/*定时器0中断处理*/
void clk0_int(void) interrupt 1 using 0
{

  //T2ms=!T2ms;
  //if(T2ms)   disbyte();//2ms显示一次
     disbyte();
     if(++time==period)  //1秒时间到
     {     time=0;
	   if(RomEr)//eeprom损坏
	   {
             if(++Tns==5) {RomEr=!RomEr;Tns=0;}//5秒到,不再显示损坏信息
	   }
	   else if(ModeWait)//等待模式确认
           {
	     if(++Tns==20) {ModeWait=0;Tns=0;}//半分钟到,还未确认模式,返回正常循环显示模式
	   }
           else
           {
                if(single)  single_disp();
                if(circle)  circle_disp();
           }

     }

  clock0_init();//初始化定时器

}

/*外部0中断服务程序*/
void exint0(void) interrupt 0
{
  EX0=0;//关闭外部0中断
  rdAD=1;//设置转换完毕标志
}

⌨️ 快捷键说明

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