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

📄 protocol.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 5 页
字号:
            return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);        
        }
        else if(  DI0_L <= 13 )
        {
            DI1DI0 = BASE_PUBV+(DI0_L-1)*BASE_PUBV_OFFSET;
            FrameBuffer[FRM_DATALEN] = 3;
            return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
        }
        else if( DI0_L ==14 )
        {
            DI1DI0 = ADDR_OF_WEEKEND;
            FrameBuffer[FRM_DATALEN] = 1;	
            return(RET_READ_E2PROM_A|RET_WRITE_E2PROM_A|RET_SEND_RIGHT_RESPONSION);
        }
        else if( DI0_L == 0x0F )
        {
            FramRead( ADDR_OF_PUB_VACATION_COUNT, &count, 1 );
            count = Bcd2HexChar( count );
            for( i = 0; i < count; i++ )
            {
                FramRead( BASE_PUBV+BASE_PUBV_OFFSET*i, &FrameBuffer[FRM_DATA+2+BASE_PUBV_OFFSET*i], BASE_PUBV_OFFSET );
            }
            MemSet0xFF( &FrameBuffer[FRM_DATA+2+BASE_PUBV_OFFSET*i], (13-i)*BASE_PUBV_OFFSET );
            FramRead( ADDR_OF_WEEKEND, &FrameBuffer[FRM_DATA+41], 1 );
            FrameBuffer[FRM_DATA+42] = 0xAA;
            FrameBuffer[FRM_DATALEN] = 41;
            return(RET_SEND_RIGHT_RESPONSION);        			
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsReadProcC8xx(void)
{
    if( DI0_H == 3 )
    {
        if( DI0_L == 2 )
        {
            DI1DI0 = ADDR_OF_POWER_FREEZE_TIME;
            FrameBuffer[FRM_DATALEN] = 2;
            return( RET_READ_E2PROM_A|RET_SEND_RIGHT_RESPONSION );
        }
        else if( DI0_L == 3 )
        {
            FrameBuffer[FRM_DATALEN] = 2;
            FrameBuffer[FRM_DATA+2] = 01;
            FrameBuffer[FRM_DATA+3] = 01;
            return( RET_SEND_RIGHT_RESPONSION );
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsReadProcD2xx(void)
{
    if(DI0_H==0x01)
    {
        if(DI0_L==0)
        {
            FrameBuffer[FRM_DATALEN]=1;
            FrameBuffer[FRM_DATA+2]=RelayerState;
            return(RET_SEND_RIGHT_RESPONSION);		
        }
        else if(DI0_L==1)
        {
            RelayerState|=BIT0;
            RelayerState&=~BIT1;						
            EXT_IO_RELAY_1_ON();			
        }
        else if(DI0_L==2)
        {
            RelayerState&=~BIT0;
            RelayerState|=BIT1;			
            EXT_IO_RELAY_1_OFF();
        }
        else if(DI0_L==3)
        {
            RelayerState|=BIT2;
            RelayerState&=~BIT3;						        
            EXT_IO_RELAY_2_ON();
        }
        else if(DI0_L==4)
        {            
            RelayerState&=~BIT2;
            RelayerState|=BIT3;
            EXT_IO_RELAY_2_OFF();			
        }        		
        else 
        {
            return RET_NO_RESPONSION;    
        }
        FramWrite(ADDR_OF_RELAYER_STATE,&RelayerState,1);		
        FrameBuffer[FRM_DATALEN]=1;
        FrameBuffer[FRM_DATA+2]=RelayerState;		
        return(RET_SEND_RIGHT_RESPONSION);
    }
    
    return RET_NO_RESPONSION;
}

static unsigned char _SlvsReadProcD5xx(void)
{
    unsigned char temp;
	
    temp = FrameBuffer[DI0];
    if( ( temp >= 0x01 ) && ( temp <= 0x40 ) )
    {
        DI1DI0=INFO_BASE+((temp-1)/8)*DF_PAGE_LEN+((temp-1)%8)*64;
        FrameBuffer[FRM_DATALEN]=64;
	return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V);
    }
	
    return RET_NO_RESPONSION;
}

static unsigned char _SlvsReadProcD6xx(void)
{
   if( DI0_H < 3 )
   {
       if( DI0_L < 4 )
       {
           DI1DI0 = ADDR_OF_PHASEPWR_START+4+DI0_H*16+DI0_L*4;
           FrameBuffer[FRM_DATALEN] = 4;
           return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);
       }
   }
    else if( DI0_H == 3 )
    {
        if( DI0_L < 8 )
        {
            DI1DI0 = ADDR_OF_LINEPWR_START+4+DI0_L*4;
            FrameBuffer[FRM_DATALEN] = 4;
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);
        }
    }
   
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsReadProcDDxx(void)
{
    unsigned char di0_h = DI0_H, di0_l = DI0_L;

    if( di0_h == 0x01 )
    {
        if( di0_l < 6 )
        {
            DI1DI0 = ADDR_OF_DAY_DATA_START+di0_l*16;
            FrameBuffer[FRM_DATALEN] = 16;
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A);
        }
    }
    
    FrameBuffer[FRM_DATA] = RET_ERR_ID;
    return RET_SEND_ERROR_RESPONSION; 
}

static unsigned char _SlvsReadProcDExx(void)
{
    unsigned char di0_h = DI0_H-1, di0_l = DI0_L;

    if( di0_h <= 0x0D )
    {          
        DI1DI0 = ZERO_FREEZE_POWER_BASE + (ushort)(di0_h/2)*(ushort)OFFSET_ZERO_FREEZE_POWER + (di0_h%2)*20;
        if( di0_l < 5 )
        {
            DI1DI0 += di0_l * 4;
            FrameBuffer[FRM_DATALEN] = 4;
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V);
        }
        else if( di0_l == 0x0F )
        {
            FrameBuffer[FRM_DATALEN] = 20;
            return(RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V);
        }
    }

    FrameBuffer[FRM_DATA] = RET_ERR_ID;
    return RET_SEND_ERROR_RESPONSION;  
}

static unsigned char _SlvsReadProcE0xx(void)
{
    unsigned short count;
    unsigned char di0_h=DI0_H,di0_l=DI0_L;

    if( di0_h <= 0x04 )
    {        
        if( di0_l <= 3 )
        {
            FrameBuffer[FRM_DATALEN] = 2;
            DI1DI0 = ADDR_OF_LOST_REC+LOST_REC_OFFSET*di0_h+di0_l*2;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );
        }
        else if( di0_l <= 7 )
        {
            FrameBuffer[FRM_DATALEN] = 3;        
            DI1DI0 = ADDR_OF_LOST_REC+LOST_REC_OFFSET*di0_h+LOST_REC_LONG+(di0_l-4)*3;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }	
    }
    else if( di0_h <= 0x07 )
    {
        if( di0_l <= 9 )
        {
            FrameBuffer[FRM_DATALEN] = EVT_LOST_REC_OFFSET;
            DI1DI0 = EVT_LOST_REC_BASE+EVT_LOST_REC_LEN*(di0_h-5)+EVT_LOST_REC_OFFSET*di0_l;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );     			
        }
    }
    else if( ( di0_h <= 0x0D ) && ( di0_h >= 0x09 ) )
    {            
        if( di0_l <= 0x04 )
        {
            FrameBuffer[FRM_DATALEN] = 2;
            if( di0_l == 0x00 )
            {
                DI1DI0 = ADDR_OF_LOWV_REC+LOWV_REC_OFFSET*(di0_h-9);
            }
            else if( di0_l == 0x01 )
            {
                DI1DI0 = ADDR_OF_LOWV_ALL_REC+LOWV_ALL_REC_OFFSET*(di0_h-9);
            }
            else
            {
                DI1DI0 = ADDR_OF_LOWV_REC+LOWV_REC_OFFSET*(di0_h-9)+(di0_l-1)*2;
            }
			
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }
        else if( di0_l < 0x0A )
        {
            FrameBuffer[FRM_DATALEN] = 3;
            if( di0_l == 0x05 )
            {
                DI1DI0 = ADDR_OF_LOWV_REC+LOWV_REC_OFFSET*(di0_h-9)+LVI_REC_LONG;
            }
            else if( di0_l == 0x06 )
            {
                DI1DI0 = ADDR_OF_LOWV_ALL_REC+LOWV_ALL_REC_OFFSET*(di0_h-9)+3;
            }
            else
            {
                DI1DI0 = ADDR_OF_LOWV_REC+LOWV_REC_OFFSET*(di0_h-9)+LVI_REC_LONG+(di0_l-6)*3;
            }
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );
        }
    }
    else if(  di0_h == 0x0E )	
    {
        if( di0_l < 0x0A )
        {
            DI1DI0 = EVT_LOWV_ALL_REC_BASE+EVT_LOWV_ALL_REC_OFFSET*di0_l;			            
            FrameBuffer[FRM_DATALEN] = EVT_LOWV_ALL_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );			            			
        }
    }
    else if( di0_h == 0x0F )
    {
        if( di0_l < 0x0A )
        {
            count = ReadTimesMod10( ADDR_OF_LVI_TOTAL_COUNT );
            if( di0_l <= count ) count = count-di0_l;
            else count = count+10-di0_l;
            DI1DI0 = EVT_LOWV_REC_BASE+(ulong)(count/5)*DF_PAGE_LEN+EVT_LVI_REC_OFFSET*(count%5);
            FrameBuffer[FRM_DATALEN] = EVT_LVI_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );
        }
    }
	
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}
 
static unsigned char _SlvsReadProcE1xx(void)
{
    unsigned short addr;
    unsigned char count;
    unsigned char di0_l=DI0_L,di0_h=DI0_H;

    if( di0_h <= 0x01 )
    {
        if( di0_l < 0x0A )
        {
            addr = ADDR_OF_LVI_TOTAL_COUNT+2+di0_h*2;
            count = ReadTimesMod10( addr );
            if( di0_l <= count ) count = count-di0_l;
            else count = count+10-di0_l;
            DI1DI0 = EVT_LOWV_REC_BASE+DF_PAGE_LEN*((di0_h+1)*2+count/5)+EVT_LVI_REC_OFFSET*(count%5);
            FrameBuffer[FRM_DATALEN] = EVT_LVI_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );
        }						
    }
    else if( di0_h == 0x03 )
    {
        if( di0_l <= 0x04 )
        {
            DI1DI0 = ADDR_OF_VOLTAGE_OVER+VOLTAGE_OVER_OFFSET*di0_l;
            FrameBuffer[FRM_DATALEN] = VOLTAGE_OVER_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }
    }
    else if( di0_h <= 0x06 )
    {
        if( di0_l <= 0x09 )
        {
            DI1DI0 = EVT_OV_REC_BASE+EVT_OV_REC_LEN*(di0_h-4)+EVT_OV_REC_OFFSET*di0_l;
            FrameBuffer[FRM_DATALEN] = EVT_OV_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );	
        }	
    }
    else if( ( di0_h >= 0x08 ) && ( di0_h <= 0x0C ) )
    {
        if( di0_l <= 0x07 )
        {            
            if( di0_l <= 0x03 )
            {
                FrameBuffer[FRM_DATALEN] = 2;
                DI1DI0 = ADDR_OF_LOWI_REC+LOWI_REC_OFFSET*(di0_h-8)+di0_l*2;
                return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );				
            }
            else if( di0_l <= 0x07 )
            {
                FrameBuffer[FRM_DATALEN] = 3;
                DI1DI0 = ADDR_OF_LOWI_REC+LOWI_REC_OFFSET*(di0_h-8)+(di0_l-4)*3+LVI_REC_LONG;
                return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );				
            }                        
        }			
    }
    else if( di0_h <= 0x0F )
    {
        if( di0_l <= 0x09 )
        {
            addr = ADDR_OF_LVI_TOTAL_COUNT+6+(di0_h-0x0D)*2;
            count = ReadTimesMod10( addr );
            if( di0_l <= count ) count = count-di0_l;
            else count = 10+count-di0_l;
            DI1DI0 = EVT_LOWI_REC_BASE+DF_PAGE_LEN*((di0_h-0x0D)*2+count/5)+EVT_LVI_REC_OFFSET*(count%5);
            FrameBuffer[FRM_DATALEN] = EVT_LVI_REC_OFFSET-1;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );
        }
    }
  		
    FrameBuffer[FRM_DATA] = RET_ERR_ID;	
    return RET_SEND_ERROR_RESPONSION;
}

static unsigned char _SlvsReadProcE2xx(void)
{
    if( DI0_H == 0x00 )
    {
        if( DI0_L <= 0x04 )
        {
            DI1DI0 = ADDR_OF_CURRENT_IMBA_REC+CURRENT_IMBA_REC_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = CURRENT_IMBA_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }			
    }
    else if( DI0_H == 0x01 )
    {
        if( DI0_L <= 0x09 )
        {
            DI1DI0 = EVT_CURRENT_IMBA_BASE+EVT_CURRENT_IMBA_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = EVT_CURRENT_IMBA_OFFSET;	
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );			
        }
    }
    else if( DI0_H == 0x03 )
    {
        if( DI0_L <= 0x04 )
        {
            DI1DI0 = ADDR_OF_WATT_OVER_REC+WATT_OVER_REC_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = WATT_OVER_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }
    }
    else if( DI0_H == 0x04 )
    {
        if( DI0_L <= 0x09 )
        {
            DI1DI0 = EVT_WATT_OVER_BASE+EVT_WATT_OVER_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = EVT_WATT_OVER_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );			
        }
    }
    else if( DI0_H == 0x06 )
    {
        if( DI0_L <= 0x04 )
        {
            DI1DI0 = ADDR_OF_REQ_OVER_REC+REQ_OVER_REC_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = REQ_OVER_REC_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }
    }
    else if( DI0_H == 0x07 )
    {
        if( DI0_L <= 0x09 )
        {
            DI1DI0 = EVT_REQ_OVER_BASE+EVT_REQ_OVER_OFFSET*DI0_L;
            FrameBuffer[FRM_DATALEN] = EVT_REQ_OVER_OFFSET;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_V );			           
        }
    }
    else if( DI0_H == 0x09 )
    {
        if( DI0_L <= 0x02 )
        {
            DI1DI0 = ADDR_OF_COVER_UP_OPEN+COVER_UP_OPEN_SIZE*DI0_L;
            FrameBuffer[FRM_DATALEN] = 2;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );
        }
    }
    else if( DI0_H == 0x0A )
    {
        if( DI0_L <= 0x02 )
        {
            DI1DI0 = ADDR_OF_COVER_UP_OPEN+COVER_UP_OPEN_SIZE*DI0_L+COVER_UP_OPEN_TIME;
            FrameBuffer[FRM_DATALEN] = 50;
            return( RET_SEND_RIGHT_RESPONSION|RET_READ_E2PROM_A );			
        }
    }
    else if( DI0_H == 0x0B )
    {
        if( DI0_L <= 0x04 )
        {

⌨️ 快捷键说明

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