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

📄 sysinter.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
字号:

/*******************************************************************
*  SysInter.c  : sys interrupt programme
********************************************************************/
#pragma interrupt INTP2 KeyDis_Deal      //display key check  
#pragma interrupt INTP5 HCF_Add          //intp5 interrupt, single-phase's high frequency energy impluse
#pragma interrupt INTSR6 CommRX          //RS485 interface recieve
#pragma interrupt INTST6 CommTX          //RS485 interface send
#pragma interrupt INTSR0 IRCommRX        //IR interface recieve
#pragma interrupt INTST0 IRCommTX        //IR interface send
#pragma interrupt INTWTI WT_4ms          //watch timer of 3.91ms 
#pragma interrupt INTWT  WT_500ms        //watch timer of 500ms 


#include "include\macro.h"  
#include "include\HardConfig.h"
#include "include\SysConfig.h"
#include "include\SubConfig.h"
#include "include\data.h"
#include "include\bitdef.h"

#include "include\FunAnnounce.h"


/*******************************************************************
* KeyDis_Deal(): display key check.
********************************************************************/
void KeyDis_Deal()
{
    PIF2 = 0;             //clear keydisplay interrupt flag.
    NOP();
    if(pin_KEYDIS == 0)   Flag.even |= bitDKen ;   
}

/*******************************************************************
* WT_4ms(): watch timer of 3.91ms
********************************************************************/
void WT_4ms()
{
unsigned char i;
 
    WTIIF = 0;
    NOP();
    
    // add time of energy adj time, need 6s
    if(Flag.run & bitR_Adj)   Sram.cnt_Eadj++;
    
    //energy adjust status test
    if((pin_KEYKWX==0) &&  (pin_KEYCHK== 0))
    {
        if((Flag.even & bitKAdj) == 0)
        {
            Sram.KeyCnt++;
            if(Sram.KeyCnt>16)   
            {
            	Flag.run |= bitR_Adj;    //set adj status in effect flag. 
            	Flag.even |= bitKAdj;    //set hard adj status in effect flag. 
            	Sram.AdjCnt[0] = 0;
            	Sram.cnt_Eadj=0;
            } 
        }
    }
    else
    {
    	Flag.even &= ~bitKAdj;                 // clear program key in effect flag.              
        Sram.KeyCnt = 0;        	
    }
    
    
    // output energy low frequency pluse, about 80mS. 
    if(Flag.run & bitR_EpLED)  
    {
    	Sram.Pul_Tmr++;
    	if(Sram.Pul_Tmr >= 20)
    	{
    	    pin_EPLOUT = 1;                    //SET Epluse-LED OFF
    	    Flag.run &= ~bitR_EpLED;    
        }
    } 
    
    // relay close control
    if(Flag.even & bitRly )  
    {
    	Sram.Rly_Tmr++;
    	if(Sram.Rly_Tmr >= 18)
    	{
    	    pin_CTROFF = 0;                     //
    	    pin_CTRON = 0; 
    	    if(Sram.Rly_Tmr >= 40)           Flag.even &= ~ bitRly;  
        }
    } 
    
    // when rx datas interval > 520ms, UART reset
   // if((Comm.rsErrTmr++) > 150 )      Comm.status = COMM_STATUS_INIT;
    
    //
    if((Comm.status&0x0f)== COMM_STATUS_URTXRDY)
    {
        if(Comm.tmrMd != 0)
        {
            Comm.tmrMd--;
        }
    }
  
}


/*******************************************************************
* WT_500ms(): watch timer of 500ms
********************************************************************/
void WT_500ms()
{
 
    WTIF = 0;
    Flag.even |= bitHfSec ; 
    Flag.even |= bitDisT ;
    
}


/*******************************************************************
* HCF_Add():  intp5 interrupt, single-phase's high frequency energy impluse
********************************************************************/
void HCF_Add()
{
  //unsigned long Tmp= PimpQ;
 
    PIF5 = 0;     //CLR  INTP3  interrupted FLAG.  
    
    if(Flag.run & bitR_Adj)
    {
        Sram.AdjCnt[0]++;	
    }
    else
    {
        Sram.PHFCnt+=Sram.Adj_Base[0];
        if( Sram.PHFCnt >= PimpQ )  
        {
            pin_EPLOUT = 0;               //energy L_pluse output,led open.
            Sram.Pul_Tmr=0;
            //Sram.PHFCnt = 0;
            Sram.PHFCnt -= PimpQ ;
            //Sram.PLFCnt++;
            Flag.run |= bitR_Pulse;       // set energy L_pluse accumulative flag.
            Flag.run |= bitR_EpLED;       // set energy L_pluse accumulative flag.
        }  	
    }
}


/*******************************************************************
* CommRX():  UART6 interrupt, DL645 communication data received
********************************************************************/
void CommRX()
{ 
   register unsigned char i;

    if(ASIS6==0)
    {
        if(Comm.status == COMM_STATUS_FREE)
    	  {
    	      Comm.status = COMM_MODE_RS485 + COMM_STATUS_URRX;
    	      Comm.ptr = 0;    
    	  }
    	  
    	  i = RXB6;
    	  
    	  if(Comm.status != (COMM_MODE_RS485 + COMM_STATUS_URRX))   return;  
        
        Comm.rsErrTmr = 0;
        if( Comm.ptr >= RTx_MaxSize)   return;
        Comm.commBuff[Comm.ptr] = i;
        
        if( Comm.commBuff[0] == 0x68)  
        {
            if( Comm.ptr > 13)
            {
                NOP();
                NOP();	
            }
            Comm.ptr++;
        
        }
        else
        {
            Comm.ptr = 0;	  
        }    
    
    } // end of "if(ASIS6==0)"                                
    else 
    {
    	  i=ASIS6;
        i=RXB6;
        Comm.status = COMM_STATUS_INIT;
    }// end of "if(ASIS6==0)  else " 
}

/*******************************************************************
* CommTX():  UART6 interrupt, DL645 communication data send out
********************************************************************/
void CommTX()
{
    STIF6=0;
    
    if((Comm.status & COMM_MODE_RS485)==0)  return;
    
    Comm.rsErrTmr = 0;
    
    if(Comm.cntFE != 0)
    {
        TXB6 = 0xfe;
        Comm.cntFE--;
    }
    else
    {
        if((Comm.ptr >= RTx_MaxSize) || (Comm.ptr >=(char)(RS_MinSize+Rs_Len) ))  return; 
        TXB6 = Comm.commBuff[Comm.ptr];
        Comm.ptr++;
    }
}


/*******************************************************************
* IRCommRX():  
********************************************************************/
void IRCommRX()
{
 register unsigned char i;

    if(ASIS0==0)
    {
        if(Comm.status == COMM_STATUS_FREE)
    	  {
    	      Comm.status = COMM_STATUS_URRX;
    	      Comm.ptr = 0;    
    	  }
    	  
    	  i = RXB0;
    	  
    	  if(Comm.status != COMM_STATUS_URRX)   return; 
        
        Comm.rsErrTmr = 0;
        if( Comm.ptr >= RTx_MaxSize)   return;
        Comm.commBuff[Comm.ptr] = i;
        
        if( Comm.commBuff[0] == 0x68)  
        {
            if( Comm.ptr > 10)
            {
                NOP();
                NOP();	
            }
            Comm.ptr++;
        
        }
        else
        {
            Comm.ptr = 0;	  
        }    
    
    } // end of "if(ASIS6==0)"                                
    else 
    {
        i=ASIS0;
        i=RXB0;
        Comm.status = COMM_STATUS_INIT;
    }// end of "if(ASIS6==0)  else " 
}

/*******************************************************************
* IRCommTX():  
********************************************************************/
void IRCommTX()
{
    STIF0=0;
    
    if(Comm.status & COMM_MODE_RS485)  return;
    
    Comm.rsErrTmr = 0;
    
    if(Comm.cntFE != 0)
    {
        TXS0 = 0xfe;
        Comm.cntFE--;
    }
    else
    {
        if((Comm.ptr >= RTx_MaxSize) || (Comm.ptr >=(char)(RS_MinSize+Rs_Len) ))  return; 
        TXS0 = Comm.commBuff[Comm.ptr];
        Comm.ptr++;
    }
}

⌨️ 快捷键说明

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