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

📄 sys_status.c

📁 pic30f6012I2C的程序
💻 C
字号:
void delay_time()
{  
  uint i;
  for(i=N_I2C;i>1;i--)
  {;}
}


void I2c_start (void)
{
  MDE = 1;
  MDO = 1;
  MCO = 1;
  delay_time();
  MDO = 0;
  delay_time();  
  MCO = 0;
}

void I2c_stop (void)
{
  MDE = 1;
  MDO = 0;
  MCO = 1;
  delay_time();
  MDO = 1;
  delay_time();
 
}

bit I2c_write (uchar output_data)
{
  uchar index;
  MDE = 1;
  for(index = 0; index < 8; index++)
   {
    MDO = ((output_data & 0x80) ? 1 : 0);
    output_data  <<= 1;
    MCO = 1;
    delay_time();
    MCO = 0;
    delay_time();
   }
  MDE = 0;
  delay_time();
  MCO = 1;
  delay_time();
  if (!MDI)
    {
    MCO = 0;
    return 1;
    }
    else
    {
    MCO = 0;
    return 0;
    }
}

uchar I2c_read (bit send_ack)
{
  uchar index, input_data;
  input_data = 0x00;
  MDE = 0;
  MCO = 0;
  for(index = 0; index < 8; index++)
   {
    input_data <<= 1;
    MCO = 1;
    delay_time();
    MCO = 0;
    delay_time();
    input_data |= MDI;
   }
  MDE = 1;
  if(send_ack)
    MDO = 0;
  else
    MDO = 1;
  delay_time();
  MCO = 1;
  delay_time();
  MCO = 0;
  delay_time();
  MDO = 0;
  MDO = 0;
 
  MDE = 0;
  return input_data;
}
void Init_ISL1208(uchar x)
{
  uchar i,temp,temp2;
  temp2=x;
  I2c_start();
  I2c_write(0xde);
  I2c_write(0x07);
  I2c_write(0x11);
  delay_time();
  I2c_stop();
  delay_time();
  
  if(temp2==0)
   {
    EEPROM_write_value[0]=0x00;
    EEPROM_write_value[1]=0x00;
    EEPROM_write_value[2]=0x0B;
    EEPROM_write_value[3]=0x00;
    EEPROM_write(10);

	EEPROM_write_value[0]=HOUR_present|0x80;
    EEPROM_write_value[1]=DAY_present;
    EEPROM_write_value[2]=MONTH_present;
    EEPROM_write_value[3]=YEAR_present;
    EEPROM_write(11);

	time_ISL_write[0]=MINUTE_present;
    time_ISL_write[1]=HOUR_present|0x80;
    time_ISL_write[2]=DAY_present;
    time_ISL_write[3]=MONTH_present;
    time_ISL_write[4]=YEAR_present;
   }

  if(temp2==1)
   {
    Pre_Init_ISL1208();
   }

  for(i=0;i<=5;i++)
  {
   switch(i)
    {
     case 0: {temp=0;                     break;}
     case 1: {temp=time_ISL_write[0];     break;}
     case 2: {temp=time_ISL_write[1];     break;}
     case 3: {temp=time_ISL_write[2];     break;}
     case 4: {temp=time_ISL_write[3];     break;}
     case 5: {temp=time_ISL_write[4];     break;}
     default :break;
    }
    
   I2c_start();       
   I2c_write(0xde);
   I2c_write(i);
   I2c_write(temp);
   delay_time();
   I2c_stop();
   delay_time();
  }

  I2c_start();
  I2c_write(0xde);
  I2c_write(0x12);
  I2c_write(JYM_ISL1208);
  delay_time();
  I2c_stop();
  delay_time();

  I2c_start();
  I2c_write(0xde);
  I2c_write(0x07);
  I2c_write(0x00);
  delay_time();
  I2c_stop();
  delay_time();
  
}
void  Pre_Init_ISL1208()
{
  uchar i1,i2;  
  EEPROM_read(10);
  i1=EEPROM_read_value[2];  
  if((i1<=10)||(i1>=21))  
   i1=20;   
  for(i2=0;i2<=9;i2++)
    {
	 EEPROM_read(i1);	 
     if((EEPROM_read_value[3]<=0x99)&&(EEPROM_read_value[2]<=0x12)&&(EEPROM_read_value[1]<=0x31))
	 {
		if(EEPROM_read_value[3]>YEAR_present)
		{	   
         time_ISL_write[0]=0x00;
         time_ISL_write[1]=EEPROM_read_value[0];
         time_ISL_write[2]=EEPROM_read_value[1];
         time_ISL_write[3]=EEPROM_read_value[2];
         time_ISL_write[4]=EEPROM_read_value[3];	  	   
         break;
		}
		else if((EEPROM_read_value[3]==YEAR_present)&&(EEPROM_read_value[2]>MONTH_present))
		{	   
         time_ISL_write[0]=0x00;
         time_ISL_write[1]=EEPROM_read_value[0];
         time_ISL_write[2]=EEPROM_read_value[1];
         time_ISL_write[3]=EEPROM_read_value[2];
         time_ISL_write[4]=EEPROM_read_value[3];	  	   
         break;
		}
		else if((EEPROM_read_value[3]==YEAR_present)&&(EEPROM_read_value[2]==MONTH_present)&&(EEPROM_read_value[1]>=DAY_present))
        {	   
         time_ISL_write[0]=0x00;
         time_ISL_write[1]=EEPROM_read_value[0];
         time_ISL_write[2]=EEPROM_read_value[1];
         time_ISL_write[3]=EEPROM_read_value[2];
         time_ISL_write[4]=EEPROM_read_value[3];	  	   
         break;
		}
	   else 
	   {
        i1--;
	    if(i1==10)
	    i1=20;			
	   }
	 }
	else 
	  {
       i1--;
	   if(i1==10)
	   i1=20;		   
	  }
	}  
  EEPROM_read(10);
  EEPROM_write_value[0]=EEPROM_read_value[0]+1;
  EEPROM_write_value[1]=EDATA2;
  EEPROM_write_value[2]=EDATA3;
  EEPROM_write_value[3]=EDATA4;
  EEPROM_write(10);   
}
void  ISL1208_ROM()
{
  uchar i3;  
  EEPROM_read(10);
  i3=EEPROM_read_value[2];
  i3+=1;  
  if((i3>=21)||(i3<=10))
   i3=11;

  EEPROM_write_value[0]=present_time[2];
  EEPROM_write_value[1]=present_time[3];
  EEPROM_write_value[2]=present_time[4];
  EEPROM_write_value[3]=present_time[5];
  EEPROM_write(i3);

  EEPROM_read(10);
  EEPROM_write_value[0]=EDATA1;
  EEPROM_write_value[1]=EDATA2;
  EEPROM_write_value[2]=i3;
  EEPROM_write_value[3]=EDATA4;
  EEPROM_write(10);  
}
void present_time_read()
{
  uchar i;
  I2c_start();
  I2c_write(0xde);
  I2c_write(0x00);
  I2c_start();
  I2c_write(0xdf);
  for(i=0;i<=4;i++)
   {
    present_time[i]=I2c_read(1);
   }
  present_time[5]=I2c_read(0);
  delay_time();
  I2c_stop();
  delay_time();
}

void EEPROM_write(uchar page_add)
{ 
  EADRH=0;
  EADRL=page_add;
  EDATA1=EEPROM_write_value[0];
  EDATA2=EEPROM_write_value[1];
  EDATA3=EEPROM_write_value[2];
  EDATA4=EEPROM_write_value[3];
  ECON=0x05;
  ECON=0x02;  
}

void EEPROM_read(uchar page_add)
{
  EADRH=0;
  EADRL=page_add;
  ECON=0x01;
  EEPROM_read_value[0]=EDATA1;
  EEPROM_read_value[1]=EDATA2;
  EEPROM_read_value[2]=EDATA3;
  EEPROM_read_value[3]=EDATA4;
} 

void Init_time_add()
{ 
  uchar add_i3;
  for(add_i3=0;add_i3<=3;add_i3++)
  {EEPROM_write_value[add_i3]=0x00;}  
  EEPROM_write(4);
  EEPROM_write(5);
}
void  time_add_backup()
{
  ulong temp1,temp2;
  EEPROM_read(5);
  temp2=EEPROM_read_value[0]*10000+EEPROM_read_value[1]*100+EEPROM_read_value[2];
  EEPROM_read(4);
  temp1=EEPROM_read_value[0]*10000+EEPROM_read_value[1]*100+EEPROM_read_value[2];
  if((temp1>=temp2)&&(EEPROM_read_value[0]<=100)&&(EEPROM_read_value[1]<100)&&(EEPROM_read_value[2]<100)&&(EEPROM_read_value[3]<60))
    {
     EEPROM_write_value[0]=EEPROM_read_value[0];
	 EEPROM_write_value[1]=EEPROM_read_value[1];
	 EEPROM_write_value[2]=EEPROM_read_value[2];
	 EEPROM_write_value[3]=EEPROM_read_value[3];
     EEPROM_write(5);
    }
  else
    {
	 EEPROM_read(5);
	 EEPROM_write_value[0]=EEPROM_read_value[0];
	 EEPROM_write_value[1]=EEPROM_read_value[1];
	 EEPROM_write_value[2]=EEPROM_read_value[2];
	 EEPROM_write_value[3]=EEPROM_read_value[3];
     EEPROM_write(4);
	}
}

uchar ISL1208_status_check()
{ 
  uchar i4;
  I2c_start();
  I2c_write(0xde);
  I2c_write(0x12);
  I2c_start();
  I2c_write(0xdf);
  i4=I2c_read(0);
  delay_time();
  I2c_stop();
  delay_time();
  
  EEPROM_read(10);
 
  if(EEPROM_read_value[0]<=30)
    {	 
     present_time_read();
     if((i4==JYM_ISL1208)&&(present_time[5]<=0x99)&&(present_time[4]<=0x12)&&(present_time[3]<=0x31))
	 {
	   if(present_time[5]>YEAR_present)
	   {
         ISL1208_ROM();
	     return(1);	
	   }
	   else if((present_time[5]==YEAR_present)&&(present_time[4]>MONTH_present))
       {
         ISL1208_ROM();
	     return(1);	
	   }
	   else if((present_time[5]==YEAR_present)&&(present_time[4]==MONTH_present)&&(present_time[3]>=DAY_present))
	   {
         ISL1208_ROM();
	     return(1);	
       }
	   else
       {
         Init_ISL1208(1);
         return(1); 
 	   }
	 }
	 else
	   {
         Init_ISL1208(1);
         return(1); 
 	   }
    }  
  else
    return(0);
}

void time_deadline_check()
{
  present_time_read();
  if((Flag_sys_status==1)||(Flag_sys_status==2))
    {
     if(present_time[5]>YEAR_deadline1)
      {
       Flag_sys_status=2;
      }
     else if((present_time[5]==YEAR_deadline1)&&(present_time[4]>MONTH_deadline1))
      {
       Flag_sys_status=2;
      }
     else if((present_time[5]==YEAR_deadline1)&&(present_time[4]==MONTH_deadline1)&&(present_time[3]>=DAY_deadline1))
      {
       Flag_sys_status=2;
      }
     else
      {
       Flag_sys_status=1;
      }
   }
  if((Flag_sys_status==3)||(Flag_sys_status==4))
    {
     if(present_time[5]>YEAR_deadline2)
      {
       Flag_sys_status=4;
      }
     else if((present_time[5]==YEAR_deadline2)&&(present_time[4]>MONTH_deadline2))
      {
       Flag_sys_status=4;
      }
     else if((present_time[5]==YEAR_deadline2)&&(present_time[4]==MONTH_deadline2)&&(present_time[3]>=DAY_deadline2))
      {
       Flag_sys_status=4;
      }
     else
     {
      Flag_sys_status=3;
     }
   }
}

void time_add_deadline_check()
{
  ulong x;
  EEPROM_read(4);
  x=EEPROM_read_value[0]*10000+EEPROM_read_value[1]*100+EEPROM_read_value[2];
  if((Flag_sys_status==1)||(Flag_sys_status==2))
    {
     if(x>=HOUR_deadline1)
       Flag_sys_status=2;
     else
       Flag_sys_status=1;
    }
  if((Flag_sys_status==3)||(Flag_sys_status==4))
    {
     if(x>=(HOUR_deadline1+HOUR_deadline2))
       Flag_sys_status=4;
     else
       Flag_sys_status=3;
    }
}
void time_add_write()
{
  uchar add_i1,add_i2;
 
  EEPROM_read(4);
  for(add_i1=0;add_i1<=3;add_i1++)
    {time_add_value[add_i1]=EEPROM_read_value[add_i1];}
  time_add_value[3]+=1;     
  if(time_add_value[3]>=6)
   {
    time_add_value[3]-=6;
    time_add_value[2]+=1;
   }

  if(time_add_value[2]>=100)
   {
    time_add_value[2]-=100;
    time_add_value[1]+=1;
   }

  if(time_add_value[1]>=100)
   {
    time_add_value[1]-=100;
    time_add_value[0]+=1;
   }

  for(add_i2=0;add_i2<=3;add_i2++)
    {EEPROM_write_value[add_i2]=time_add_value[add_i2];}
  EEPROM_write(4);     
}

void Flag_sys_status_write()
{
  EEPROM_read(1);
  EEPROM_write_value[0]=JYM_sys;
  EEPROM_write_value[1]=Flag_sys_status; 
  EEPROM_write_value[2]=EDATA3;
  EEPROM_write_value[3]=EDATA4;
  EEPROM_write(1);
  EEPROM_write(2);
  EEPROM_write(3);
}
void sys_status_check()
{ 
  ulong i6; 
  uchar temp1,temp2,temp3; 

  EEPROM_read(3);
  temp3=EEPROM_read_value[1];
  EEPROM_read(2);
  temp2=EEPROM_read_value[1];
  EEPROM_read(1);
  temp1=EEPROM_read_value[1];

  if((temp1==temp2)&&(temp1<=6))
    Flag_sys_status=temp1;
  else if((temp1==temp3)&&(temp1<=6))
    Flag_sys_status=temp1;
  else if((temp2==temp3)&&(temp2<=6))
    Flag_sys_status=temp2;  
  else
   {Flag_sys_status=1;}   

  if(EEPROM_read_value[0]!=JYM_sys)
   {    
	if((EEPROM_read_value[2]>=100)&&(EEPROM_read_value[2]<255))
	 {
	   fault_led(5);
       display_send(); 
       for(i6=50000;i6>1;i6--)
       ;
       EEPROM_read_value[2]=0;
     }
    EEPROM_write_value[0]=JYM_sys;
	EEPROM_write_value[1]=EDATA2;
	EEPROM_write_value[2]=EEPROM_read_value[2]+1;
	EEPROM_write_value[3]=EDATA4;
	EEPROM_write(1); 
    EEPROM_write(2); 
	EEPROM_write(3); 
   } 
}
void sys_status_treat()
{
  switch(Flag_sys_status)
  {
   case 0:
   {       
    Init_ISL1208(0);
    Init_time_add();
    Flag_sys_status=1;    
    Flag_sys_status_write();
    break;
   }
   case 1:
   {
    if(ISL1208_status_check()==1)
     {
      time_deadline_check();
      if(Flag_sys_status!=1)
        {
         Flag_sys_status_write();
        }      
     }
    else
     {
      time_add_deadline_check();
      if(Flag_sys_status!=1)
        {
         Flag_sys_status_write();
        }
     }
    break;
   }   
   case 2:
   {
    if(ISL1208_status_check()==1)
     {
      time_deadline_check();
      if(Flag_sys_status!=2)
        {
         Flag_sys_status_write();
        }      
     }
    else
     {
      time_add_deadline_check();
      if(Flag_sys_status!=2)
        {
         Flag_sys_status_write();
        }
     }
    break;
   }   
   case 3:
   {

    if(ISL1208_status_check()==1)
     {
      time_deadline_check();
      if(Flag_sys_status!=3)
        {
         Flag_sys_status_write();
        }      
     }
    else
     {
      time_add_deadline_check();
      if(Flag_sys_status!=3)
        {
         Flag_sys_status_write();
        }
      
     }
    break;
   }
  case 4:
   {
    if(ISL1208_status_check()==1)
     {
      time_deadline_check();
      if(Flag_sys_status!=4)
        {
         Flag_sys_status_write();
        }      
     }
    else
     {
      time_add_deadline_check();
      if(Flag_sys_status!=4)
        {
         Flag_sys_status_write();
        }
     }
    break;
   }   
  default:   
   {    
    ISL1208_status_check();	
    break;
   }
  }
}

⌨️ 快捷键说明

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