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

📄 sys_event.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
字号:
#include "includes.h"

unsigned char RequirePowerTime=0; 
unsigned char CurrentMinute;  
unsigned char RequireCycleCnt=0;
unsigned char SignalOutPutFlag = 0;

void _sys_evt_add(unsigned short event)
{
    _disable_interrupt();
    SystemIndication |= event;
    _enable_interrupt();
}

void _sys_evt_del(unsigned short event)
{		
    _disable_interrupt();
    SystemIndication &=~ (event|EVENT_REVERSED);	
    _enable_interrupt();
}

void _on_comm(void)
{ 
    SysParseFrame();
}

void _on_view_page(void)
{
    if( DISPLAY_PAGE_DOWN == UserKeyDownNum )
    {      
       OnDisplayPageDown();
    }
    else if( DISPLAY_PGAE_UP == UserKeyDownNum )
    {
        OnDisplayPageUp();
    }
    else if( ACTIVE_PROGRAM == UserKeyDownNum )
    {
        ActiveProgram();
    } 
    UserKeyDownNum = 0;
    LcdDisplayOpen();
    DisplayRefresh();
    AlarmSoundCancle();
}

uchar ClacSleepTimeSec_And_Getsystime(void)
{
    uchar pasttime,nowtime;
    
    pasttime =Bcd2HexChar(SystemTime[SPACE_OF_SECOND]);
    GetSystemTime();
    nowtime = Bcd2HexChar(SystemTime[SPACE_OF_SECOND]);
    if( pasttime <= nowtime )
    {
        pasttime = nowtime -pasttime;
    }
    else
    {
        pasttime = 60 - pasttime + nowtime;//计算休眠时的时间
    }
    
    return pasttime;
}

void _on_seconds(void)
{
    ushort pasttime = 1;
    unsigned char temp = 6;
        
    if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) || ( TimerCounter[TIMER_PROC_LCD_RESET] ) )
    {
        if( ++ SystemTimeSecCnt >= 60 )
        { 
            GetSystemTime();
        }
        else
        {
            SystemTime[SPACE_OF_SECOND] = Hex2BcdChar(SystemTimeSecCnt);
        }   
    }
    else 
    {
        pasttime = (ushort)ClacSleepTimeSec_And_Getsystime();
        SystemTimeSecCnt = Bcd2HexChar( SystemTime[SPACE_OF_SECOND] );
    }
	
    RedundancyTimer(pasttime);
	
    DealCoverCounterTimer(pasttime);
	
    if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) )
    {        
        if( !( SystemIndication & EVT_INIT_ATT702X ) )
        {
            PhaseVoltageDetect();
			
            if( ( SystemTimeSecCnt % 3 ) == 0 )
            {
                ReadLinePowerFromAtt7022B();
            }	
			
            Att702xSeqErrDet();
        }
		
        CalcEnergyData();        
		
        SaveWattOverload();
        
        SaveReqOverload();

        SaveWattReverse();		
    }
    else
    {
        LCDMEM[15] = ( LCD_SY_INFO_N1|LCD_SY_INFO_N2|LCD_SY_INFO_N3|LCD_SY_INFO_N4|LCD_SY_INFO_M2 );
    }
    
    if( CurrentMinute != SystemTime[SPACE_OF_MINUTE] )
    {
        CurrentMinute = SystemTime[SPACE_OF_MINUTE];
        _on_minute();
        if( !(PowerStateFlag & PS_BREAKPOWER_FLAG ) )
        {		
            SysRecLoadCurve();		
        }			
    }
    
    PowerSupplierDetect();
    TariffDetect();
    CrossHourDetect();
    if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) )
    {
        CrossDayDetect();
        BillingDetect();
    }
    Alarm();
    LcdDisplayControl((uchar)pasttime);
}

void _on_minute(void)
{	
    unsigned char temp[2];

    if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) )
    {
        SaveEnergyMin();
        RequirePowerTime++;    
        if( RequirePowerTime >= _SysPotInfo.reqtime_huacha )
        {
            CalcMaxDemand();        
        }
		
        if( !( SystemIndication & EVT_INIT_ATT702X ) )
        {
            CalcDayDataInfo();
        }			
		
        Att702xValidityCheck();

        FramRead( ADDR_OF_POWER_FREEZE_TIME, (unsigned char *)&temp[0], 2 );
        if( IsEqual( (unsigned char *)&temp[0], (unsigned char *)&SystemTime[SPACE_OF_MINUTE], 2 ) == OK )
        {        
            SaveInstanPowerData();
        }

        FramWrite( ADDR_OF_SYSTIME_START, &SystemTime[1],  SYSTIME_SIZE );
        RequireCycleCnt++;		
        if( RequireCycleCnt == _SysPotInfo.reqtime )
        {
            RequireCycleCnt = 0;
            SignalOutPutFlag |= BIT1;
        }		
    }	 		    
}

void  _on_break_power(void)
{
    PowerSupplierDetect();
}

void _on_init_att702x(void)
{    
    Att702xReinit();
    TimerCounter[TIMER_PROC_CHECK_ATT702X] = 1;  
}

void _on_uart_init(void)
{
    SRMK6 = 1;
    SRMK0 = 1;
    FramePointer = 0;
    CommPortChose = 0;
    _wait_time = 0;
    Uart0StartToRx();
    Uart2StartToRx();
}

void _on_15_minutes(void)
{
#ifdef _TEMPERATURE
    GetTemperature();
#endif
}

void _on_tick(void)
{    
    if( PowerStateFlag & PS_BREAKPOWER_FLAG )
    {
        if( ( SystemTimeSecCnt % 10 ) == 0 )
        {
            if( BasicTimerTick < 1 )
            {
                IR_ON_PD();
                return;
            }
        }
		
        if( CommPortChose == 0 )
        {
            if( ( TimerCounter[TIMER_PROC_IR_TOGGLE] == 0 )
                   && ( TimerCounter[TIMER_PROC_LCD_RESET] == 0 ) )
            {
                IR_OFF_PD();
            }
        }        
    }	
}

void _on_read_power1(void)
{
    if( !( SystemIndication & EVT_INIT_ATT702X ) ) 
    { 
        ReadActivePowerFromAtt702x();
    }
}

void _on_read_power2(void)
{
    if( !( SystemIndication & EVT_INIT_ATT702X ) ) 
    { 
        ReadReActivePowerFromAtt702x();
    }
}

void _on_remote_control(void)
{
    IrKeyDispose();
    _sys_evt_add( EVT_INIT_COMM );
}

void _on_clr_reqdata(void)
{
    SaveManualReadData();
}

⌨️ 快捷键说明

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