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

📄 ddsy922.c

📁 为88SC102IC卡与AT89C52做表的可以供大家参考
💻 C
📖 第 1 页 / 共 5 页
字号:
原型:void DisBufToBCD();
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void DisBufToBCD()
{
  if((SentBuf[0]&0XF0)>>4)
   {
    DisBuf[0]=Segment[SentBuf[2]&0X0F];    /**/
    DisBuf[1]=Segment[(SentBuf[2]&0XF0)>>4];
    DisBuf[2]=Segment[SentBuf[1]&0X0F];
    DisBuf[3]=Segment[(SentBuf[1]&0XF0)>>4];
    DisBuf[4]=Segment[SentBuf[0]&0X0F];
    DisBuf[5]=Segment[(SentBuf[0]&0XF0)>>4];
   }
  else 
    {
       DisBuf[5]=0xff;
       if(SentBuf[0]&0X0f)
          {
            DisBuf[0]=Segment[SentBuf[2]&0X0F];    /*Year Week*/
            //DisBuf[1]=Segment[((SentBuf[2]&0XF0)>>4)+0x10];
            DisBuf[1]=Segment[(SentBuf[2]&0XF0)>>4];
            DisBuf[2]=Segment[SentBuf[1]&0X0F];
            DisBuf[3]=Segment[(SentBuf[1]&0XF0)>>4];
            DisBuf[4]=Segment[SentBuf[0]&0X0F];       
          }
       else 
         {
            DisBuf[4]=0xff;
            if((SentBuf[1]&0XF0)>>4)
              {
                DisBuf[0]=Segment[SentBuf[2]&0X0F];    /*Year Week*/
                DisBuf[1]=Segment[(SentBuf[2]&0XF0)>>4];
                DisBuf[2]=Segment[SentBuf[1]&0X0F];
                DisBuf[3]=Segment[(SentBuf[1]&0XF0)>>4];
              }
            else
              {
                 DisBuf[3]=0xff;
                 if(SentBuf[1]&0X0F)
                   {
                    DisBuf[0]=Segment[SentBuf[2]&0X0F];    /*Year Week*/
                    DisBuf[1]=Segment[(SentBuf[2]&0XF0)>>4];
                    DisBuf[2]=Segment[SentBuf[1]&0X0F];                    
                   }
                 else
                  {
                     DisBuf[2]=0xff;                       
                     DisBuf[0]=Segment[SentBuf[2]&0X0F];    /*Year Week*/
                     DisBuf[1]=Segment[(SentBuf[2]&0XF0)>>4];                                       
                       
                  }
             }

         }  
         
    }

} 
  /********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
DataToDisBuf(void)
{
  if(DisMode>=6)
    {DisMode=0;}
  if(Flag_ReadTime)
    {Flag_ReadTime=0;
     wren_cmd(); //; Set write enable latch
     wrsr_cmd();// ; Write 00H to status register
     wren_cmd(); //; Set write enable latch 
    }
   //  Relay_Open();
    _CardReady(); 
  if(Flag_Play&&Portic)
   {
    switch(led_Play)
     {
     case 0:  //g00d
     	  DisBuf[0]=Segment[0x1a];    
        DisBuf[1]=Segment[0x0d];
        DisBuf[2]=Segment[0x1c];
        DisBuf[3]=Segment[0x1c];
        DisBuf[4]=Segment[0x09];
        DisBuf[5]=Segment[0x1a]; 
         break;
     case 1: //error
     	  DisBuf[5]=Segment[0x1a];    
        DisBuf[4]=Segment[0x0e];
        DisBuf[3]=Segment[0x1d];
        DisBuf[2]=Segment[0x1d];
        DisBuf[1]=Segment[0x1c];
        DisBuf[0]=Segment[0x1a];   
         break;
     case 2:  //fail
     	  DisBuf[5]=Segment[0x1a];    
        DisBuf[4]=Segment[0x0f];
        DisBuf[3]=Segment[0x0a];
        DisBuf[2]=Segment[0x01];
        DisBuf[1]=Segment[0x1f];
        DisBuf[0]=Segment[0x1a]; 
         break;
     case 3: //no
         ec.ReceBuf[5]=0x1a;
         ec.ReceBuf[4]=0x1a; 
         ec.ReceBuf[3]=0x20;
         ec.ReceBuf[2]=0x1c;
         ec.ReceBuf[1]=0x1a;
         ec.ReceBuf[0]=0x1a;
         break;
     case 4: //full
         ec.ReceBuf[5]=0x1a;
         ec.ReceBuf[4]=0x0f; 
         ec.ReceBuf[3]=0x1e;
         ec.ReceBuf[2]=0x1f;
         ec.ReceBuf[1]=0x1f;
         ec.ReceBuf[0]=0x1a;
         break;
     case 5: //cb
         ec.ReceBuf[5]=0x1a;
         ec.ReceBuf[4]=0x1a; 
         ec.ReceBuf[3]=0x0c;
         ec.ReceBuf[2]=0x0b;
         ec.ReceBuf[1]=0x1a;
         ec.ReceBuf[0]=0x1a;        
         break;
     case 6: //qc
         ec.ReceBuf[5]=0x1a;
         ec.ReceBuf[4]=0x1a; 
         ec.ReceBuf[3]=0x21;
         ec.ReceBuf[2]=0x0c;
         ec.ReceBuf[1]=0x1a;
         ec.ReceBuf[0]=0x1a;
         break; 
     case 7: //used
         ec.ReceBuf[5]=0x1a;
         ec.ReceBuf[4]=0x1e; 
         ec.ReceBuf[3]=0x05;
         ec.ReceBuf[2]=0x0e;
         ec.ReceBuf[1]=0x0d;
         ec.ReceBuf[0]=0x1a;
         break; 
    case 8: //used 
 			   SentBuf[2] = real_energy.money0.money_overplus[3] ; 
			   SentBuf[1] = real_energy.money0.money_overplus[2] ; 
			   SentBuf[0] = real_energy.money0.money_overplus[1] ; 
         DisBufToBCD();
        	if(real_energy.money0.money_overplus[0]==1)                      
              DisBuf[5]=0xbf;      
          else
          	 DisBuf[5]=0x88;  
         break; 
      }
   }
  else  
     {
           switch(DisMode)
            { 
          case 0:             
             // page_read(0x03,ec.ReceBuf,3); 
			SentBuf[2] = real_energy.electric.energy[2] ; 
			SentBuf[1] = real_energy.electric.energy[1] ; 
			SentBuf[0] = real_energy.electric.energy[0] ; 	 
            DisBufToBCD();                 
              // DisBuf[5]=0xc0;           
               break;
          case 1:   
 			SentBuf[2] = real_energy.money0.money_overplus[3] ; 
			SentBuf[1] = real_energy.money0.money_overplus[2] ; 
			SentBuf[0] = real_energy.money0.money_overplus[1] ; 
                //page_read(0x07,ec.ReceBuf,3);
                DisBufToBCD();
          	if(real_energy.money0.money_overplus[0]==0x1)         	                
                DisBuf[5]=0xbf;             
              else DisBuf[5]=0x88;
               break;
         case 2:
     	SentBuf[2] = meter_para.pulse_constant[2] ; 
			SentBuf[1] = meter_para.pulse_constant[1] ; 
			SentBuf[0] = meter_para.pulse_constant[0] ;      	
               // page_read(0x13,ec.ReceBuf,3);
                DisBufToBCD();
                DisBuf[5]=0x83;        
                break; 
          case 3: 
      DisBuf[0]=Segment[meter_para.factory_No[2]&0X0F];    /**/
      DisBuf[1]=Segment[(meter_para.factory_No[2]&0XF0)>>4];
      DisBuf[2]=Segment[meter_para.factory_No[1]&0X0F];
      DisBuf[3]=Segment[(meter_para.factory_No[1]&0XF0)>>4];
      DisBuf[4]=Segment[meter_para.factory_No[0]&0X0F];
      DisBuf[5]=Segment[(meter_para.factory_No[0]&0XF0)>>4];                          
               break;
          case 4: 
      DisBuf[0]=Segment[meter_para.factory_No[5]&0X0F];    /**/
      DisBuf[1]=Segment[(meter_para.factory_No[5]&0XF0)>>4];
      DisBuf[2]=Segment[meter_para.factory_No[4]&0X0F];
      DisBuf[3]=Segment[(meter_para.factory_No[4]&0XF0)>>4];
      DisBuf[4]=Segment[meter_para.factory_No[3]&0X0F];
      DisBuf[5]=Segment[(meter_para.factory_No[3]&0XF0)>>4];       
               break; 

          case 5: 
      page_read(OFFSET_OF(EEPROM_DATA,eprom_money_notice0),ec.ReceBuf,SIZE_OF(EEPROM_DATA,eprom_money_notice0));
     	SentBuf[2] = ec.ReceBuf[2]; 
			SentBuf[1] = ec.ReceBuf[1]; 
			SentBuf[0] = ec.ReceBuf[0]; 	 
      DisBufToBCD(); 
      DisBuf[5]=0xc6; 
              break; 
                                               
             }              
               
     }
}
/********************************************************************
led 显示驱动函数
原型:void Display(void)
功能:
入口参数: 
出口参数:无
********************************************************************/
Display(void)
{ 
 if(DisBit>6)
 {DisBit=0;DBit=1;}
  else {
    P0=DBit;   
    P2_7=HIGH;
      _nop_(); 
     P2_7=LOW;
   P0=DisBuf[DisBit];
      P2_6=HIGH;
     _nop_(); 
     P2_6=LOW;      
   DBit=DBit<<1;
   DisBit++; 
  }
}
  



 /********************************************************************
外部中断0函数
原型: interrupt 1   using 2
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
inter1(void) interrupt 3  
 {  
 //PIF2=0;//clear statue flag
 //P0.3=0;//pulse led on
 pulse_time=1;
 real_energy.pulse[0]++;
 down_save=1;  
}


 void energy_add(void)
{
 unsigned char  temp_pulse,cs;
 
 temp_pulse=bcd_to_hex(meter_para.pulse_constant[1]);
 if(real_energy.pulse[0]>=temp_pulse)
  {
   real_energy.pulse[0]-=temp_pulse;
  // real_energy.moto_flag=1;
   moto_time++;
  }

if(moto_time)
  {
   moto_time-=1;   
   bcdadd(real_energy.electric.energy,4);		  
   kwh_flag++;
   if((real_energy.electric.energy[3]=0x00)||(real_energy.electric.energy[2]=0x00)||(real_energy.electric.energy[1]<0x10))
    kwh10_flag=0;
   if(kwh_flag>=100)//1kwh back energy
     {
      down_save=0;
      kwh_flag-=100;
      rst_wdog();
      if(Tow_Compare(real_energy.money0.money_overplus+1,0 )!=1)
         real_energy.money0.money_overplus[0]=1;
      if((real_energy.money0.money_overplus[0]==0)&&(Tow_Compare(real_energy.money0.money_overplus+1,0 )==1))
         bcdsub(real_energy.money0.money_overplus,3); 
      else 
        {
        bcdadd(real_energy.money0.money_overplus,3);
		  //creepage_flag=1; 
	      }
      cs=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy));      
      real_energy.cs=cs;
      EA=0;
      page_write(OFFSET_OF(EEPROM_DATA,eprom_real_energy),&real_energy.electric.energy[0],sizeof(struct real_energy));
      page_write(OFFSET_OF(EEPROM_DATA,eprom_back_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
      EA=1;
     }
  }
}



unsigned char bcd_to_hex(unsigned char value)
{
 unsigned char result;
 rst_wdog();
 result=((value&0xf0)>>4)*10+(value&0x0f);
 return  result;
}


/********************************************************************
BCD减1函数
原型:void bcdsub(unsigned char *value,unsigned char length)
功能:BCD加1
入口参数: *value length
出口参数:无
********************************************************************/
void bcdsub(unsigned char *value,unsigned char length)
{
  unsigned char temp,i;
  (*(value+length))=--(*(value+length));
  for(i=length;i>0;i--)
     {
     temp=(*(value+i));    
     if((temp&0xf0)==0xf0) 
     	{    
        //(*(value+length))=0x99;
        temp=0x99;
        (*(value+i))=temp;
        (*(value+i-1))=(*(value+i-1))-1;
      }
     if((temp&0x0f)==0x0f)    
     (*(value+i))=(*(value+i))-0x6;
     }  
} 
/********************************************************************
BCD加1函数
原型:void bcdadd(unsigned char *value,unsigned char length)
功能:BCD加1
入口参数: *value length
出口参数:无
********************************************************************/
void bcdadd(unsigned char *value,unsigned char length)
{
 unsigned char temp,i;
 *(value+length)=++*(value+length);
 for(i=length;i>0;i--)
 {
  temp=*(value+i);
  if((temp&0x0f)>=0x0A)
  {
   *(value+i)+=0x6;
    temp=*(value+i);
   if((temp&0xf0)>=0xA0)
     {
       *(value+i)+=0x60;  
       *(value+i-1)=*(value+i-1)+1;      
     }  
  } 
 }
}
void relaynotice(void)
 {
 if(real_energy.relayflag.bitflag.command)
  {	 
   if(real_energy.relayflag.bitflag.iccommand==real_energy.relayflag.bitflag.fact)
      {
       CTR_ON=1;
       CTR_OFF=1;
	   }
   else	
      {
       if(real_energy.relayflag.bitflag.iiccommand)      
	    {
		 real_energy.relayflag.bitflag.fact=real_energy.relayflag.bitflag.iiccommand; 
	     CTR_ON=1;
         CTR_OFF=0;
	     }
       else
	    {
	    real_energy.relayflag.bitflag.fact=real_energy.relayflag.bitflag.iccommand;  
        if(real_energy.relayflag.bitflag.iccommand)
          {
           CTR_ON=1;
           CTR_OFF=0;
           }
        else
          {
           CTR_ON=0;
           CTR_OFF=1;  
           }
	    }
	  } 
	}
  }

void relayON_OFF(void)
{
 reay_time=1;  
 if(real_energy.relayflag.bitflag.command==real_energy.relayflag.bitflag.fact)
  {
   CTR_ON=1;
   CTR_OFF=1;
  }
 else
   { 
   real_energy.relayflag.bitflag.fact=real_energy.relayflag.bitflag.command; 
    if(real_energy.relayflag.bitflag.command)
      {
       CTR_ON=1;
       CTR_OFF=0;
       }
   else
      {
       CTR_ON=0;
       CTR_OFF=1;  
      }
   }

⌨️ 快捷键说明

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