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

📄 display.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
    }
    else
    {
        LCDMEM[LCD_CN_INFO_ADDR_REACTIVE]|=LCD_CN_INFO_REACTIVE;
        LCDMEM[LCD_SY_INFO_ADDR_M2]|=LCD_SY_INFO_M2;
        LCDMEM[LCD_SY_INFO_ADDR_S]|=(LCD_SY_INFO_S1|LCD_SY_INFO_S2|LCD_SY_INFO_S4|LCD_SY_INFO_S5|LCD_SY_INFO_S6|LCD_SY_INFO_S7|LCD_SY_INFO_S8);
        if( !(PowerStateFlag & PS_BREAKPOWER_FLAG ) )
        {		
            LoadEnergy( (unsigned char *)&temp, 0xFF, 30 );
            LoadEnergy( (unsigned char *)&pwrdata, 0xFF, 35 );
            pwrdata = __bcd_add_long( temp, pwrdata );			
        }
        else
        {
            pwrdata = __bcd_add_long( _SysDisplayRam.ReActivePhase1Pwr, _SysDisplayRam.ReActivePhase4Pwr );
        }        
    }
    LargeLedDisplay8Bcd( (unsigned char *)&pwrdata );
}

void DisplayPowerReqData(void)
{
    unsigned long pwrdata;
    unsigned char item;

    if( !(PowerStateFlag & PS_BREAKPOWER_FLAG ) )
    {
        LoadMaxDemandInfo( (unsigned char *)&pwrdata, 0x01, 5 );
    }
    else
    {
        pwrdata = _SysDisplayRam.ActivePosSumReq;
    }
    LargeLedDisplay6Bcd( (unsigned char *)&pwrdata );  
    LCDMEM[_LcdCnExes[0][0]] |= _LcdCnExes[0][1];
    LCDMEM[LCD_CN_INFO_ADDR_REQ] |= LCD_CN_INFO_REQ;    
    LCDMEM[LCD_SY_INFO_ADDR_P8] |= LCD_SY_INFO_P8;	
    LCDMEM[LCD_CN_INFO_ADDR_ACTIVE] |= LCD_CN_INFO_ACTIVE;
    LCDMEM[LCD_CN_INFO_ADDR_POSITIVE] |= LCD_CN_INFO_POSITIVE;
    LCDMEM[LCD_SY_INFO_ADDR_S] |= ( LCD_SY_INFO_S1|LCD_SY_INFO_S2|LCD_SY_INFO_S3|LCD_SY_INFO_S4 );	
}

void DisplayInstanPower(void)
{
    unsigned long instp;
	
    if( DisplayBitLocation == 10 )
    {
        LCDMEM[LCD_CN_INFO_ADDR_ACTIVE] |= LCD_CN_INFO_ACTIVE;    
        DISP_UNION_KW();		
        CalcInstantPower( (unsigned char *)&instp, 0 );
    }
    else
    {
        LCDMEM[LCD_CN_INFO_ADDR_REACTIVE] |= LCD_CN_INFO_REACTIVE;
        DISP_UNION_KVAR();
        CalcInstantPower( (unsigned char *)&instp, 4 );
    }
	
    LCDMEM[LCD_SY_INFO_ADDR_P8] |= LCD_SY_INFO_P8;
    LargeLedDisplay6Bcd( (unsigned char *)&instp );	
}

void DisplayCurrentVi(void)
{
    unsigned short temp;
	
    if( DisplayBitLocation <= 14 )
    {
        LCDMEM[LCD_SY_INFO_ADDR_S] |= LCD_SY_INFO_S2;
        LCDMEM[LCD_SY_INFO_ADDR_P11] |= LCD_SY_INFO_P11;
    }
    else
    {
        LCDMEM[LCD_SY_INFO_ADDR_S] |= ( LCD_SY_INFO_S4 | LCD_SY_INFO_S5 );
        LCDMEM[LCD_SY_INFO_ADDR_P10] |= LCD_SY_INFO_P10;
    }
	
    temp = Hex2BcdShort( CurrentVI[DisplayBitLocation-12] );
    LargeLedDisplay4Code4Bcd( (DisplayBitLocation-12)*4, (unsigned char *)&temp );
}

void DisplayTimePot(void)
{
    unsigned char temp[3], item;

    item = DisplayBitLocation-19;
    memcpy( (unsigned char *)&temp[0], (unsigned char *)&_SysDisplayRam.TimePot[item*3], 3 );
    LargeLedDisplay6BcdSpec( (unsigned char *)&temp[0] );
    LCDMEM[LCD_CN_INFO_ADDR_POT] |= LCD_CN_INFO_POT;
}

const PROC_FUNC DisplayProc[]={
    DisplayPowerData,
    DisplayPowerData,
    DisplayPowerData,
    DisplayPowerData,
    DisplayPowerData,    
    DisplayDateTime,
    DisplayDateTime,    
    DisplayMeterNum,
    DisplayMeterNum,
    DisplayPowerReqData,
    DisplayInstanPower,
    DisplayInstanPower,
    DisplayCurrentVi,
    DisplayCurrentVi,
    DisplayCurrentVi,
    DisplayCurrentVi,
    DisplayCurrentVi,
    DisplayCurrentVi,
    DisplayBondrate,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot,
    DisplayTimePot
};

void DisplayProcess(void)
{
    unsigned char *_disp_info = (unsigned char *)&_SysPotInfo.dispcontent[0];
    unsigned temp1, temp2;	
    
    LcdDispFlag &= (unsigned char)(~ LCD_DISP_ALL);
    if( IsEqualSpecialData( (unsigned char *)&_SysPotInfo.dispcontent[0], 0, DISPLAY_ITEM_BYTE ) == OK )
    {
        _SysPotInfo.dispcontent[0] = 0x03;
    }

    while(1)
    {
        temp1 = DisplayBitLocation/8;
        temp2 = DisplayBitLocation %8;	    
        if( _disp_info[temp1] )
        {
            if( _disp_info[temp1] & ( BIT0 << temp2 ) )
            {
                ClearLcd();
                LcdDispFlag &=~ LCD_DISP_FLG_REFIND;
                (DisplayProc[DisplayBitLocation])();
                if( !( LcdDispFlag & LCD_DISP_FLG_REFIND ) )
                {
                    DisplayContentCode();
                    break;
                }
            }
        }
        else
        {
            if( LcdDispFlag & LCD_DISP_FLG_PAGEDOWN )
            {
                if( LcdDispFlag & LCD_DISP_FLG_PAGEUP )
                {
                    PageUpNext();
                }
            }
        }
		
        if( LcdDispFlag & LCD_DISP_FLG_PAGEDOWN )
        {
            if( LcdDispFlag & LCD_DISP_FLG_PAGEUP )
            {
                PageUpNext();
            }
            else
            {
                PageDownNext();
            }
        }
        else
        {
            DisplayPointerNext();
        }
    }
}

void DisplayRefresh(void)
{    
    unsigned short temp;

    unsigned char mrs,lvisw;
    unsigned char temp1,temp2;

    if( LcdDispFlag & LCD_DISP_TIME )
    {
        if( ( LcdInterval == 0 ) && ( !( LcdDispFlag & LCD_DISP_FLG_PAGEDOWN ) ) )
        {
            if( !( LcdDispFlag & LCD_DISP_NEXT ) )
            {
                DisplayBitLocation++;
                LcdInterval = _SysPotInfo.disptime;
                LcdDispFlag |= LCD_DISP_NEXT;
            }
            else
            {
                LcdDispFlag &=~ LCD_DISP_TIME;
                goto DISP_PROC;
            }
        }
        ClearLcd();
        LCDMEM[LCD_SY_INFO_ADDR_P2] |= LCD_SY_INFO_P2;
        LCDMEM[LCD_CODE_ADDR_01] |= _LcdCodeHex[0];
        LCDMEM[LCD_CODE_ADDR_02] |= _LcdCodeHex[0];
        LCDMEM[LCD_CODE_ADDR_03] |= _LcdCodeHex[0];
        if( LcdDispFlag & LCD_DISP_NEXT )
        {
            LCDMEM[LCD_CODE_ADDR_04] |= _LcdCodeHex[4];
        }
        else
        {
            LCDMEM[LCD_CODE_ADDR_04] |= _LcdCodeHex[3];
        }
        DisplayDateTime();
        LcdInterval--;
        goto DISP_OTHERS;
    }

    if( ( LcdDispFlag & 0x0F ) == LCD_DISP_FLG_ACTIVE )
    {
        if( LcdInterval == 0 )
        {
DISP_PROC:
            DisplayProcess();
            LcdInterval = _SysPotInfo.disptime;                   
            if( LcdDispFlag & LCD_DISP_NEXT )
            {
                DisplayPointerNext();
            }
        }
        LcdInterval--;
    }
	
    if( LcdDispFlag & LCD_DISP_ALL ) return;

DISP_OTHERS:
    if( TimerCounter[TIMER_PROC_PROG] )
    {
        LCDMEM[LCD_CN_INFO_ADDR_PGM] |= LCD_CN_INFO_PGM;
    }
    else
    {
        LCDMEM[LCD_CN_INFO_ADDR_PGM] &=(unsigned char)(~ LCD_CN_INFO_PGM);
    }
    LCDMEM[16] |= _LcdSyExes[Tariff];

    if( !( PowerStateFlag & PS_BREAKPOWER_FLAG ) )
    {
        lvisw = LowVIStateWord & 0x77;
        mrs = MeterRunningState & 0xF7;
                    
        if( ( mrs & 0x77 ) || ( lvisw ) )
        {
            temp1 = lvisw & 0x07;
            temp2 = ( ( lvisw >> 4 ) & 0x07 );
            if( mrs & 0x80 )
            {
                LCDMEM[2] |= _LcdSyUAlarm[temp1];
                LCDMEM[2] |= _LcdSyIAlarm[temp2];
                mrs &=(unsigned char)(~ 0x80);
            }
            else
            {
                LCDMEM[2] &=~ ( _LcdSyUAlarm[temp1] );
                LCDMEM[2] &=~ (_LcdSyIAlarm[temp2] );
                mrs |= 0x80;
            }
            LCDMEM[2] &=~ ( _LcdSyUAlarm[7-temp1] );
            LCDMEM[2] &=~ ( _LcdSyIAlarm[7-temp2] );
            if( PowerNetStateWord & 0x07 )
            {
                temp1 = PowerNetStateWord & 0x07;
                if( !( DisplayFlashFlag & LCD_FLASH_FLAG ) )
                {
                    DisplayFlashFlag |= LCD_FLASH_FLAG;
                    LCDMEM[2] |= _LcdSyUAlarm[temp1];
                    
                }
                else
                {
                    DisplayFlashFlag &=~ LCD_FLASH_FLAG;
                    LCDMEM[2] &=~ _LcdSyUAlarm[temp1];                        
                }                    
            }
            if( mrs & 0x70 )
            {
                temp1 = ( mrs >> 4 ) & 0x07;
                LCDMEM[2] |= _LcdSyIAlarm[temp1];
            }
        }
        else
        {
            LCDMEM[2] &=~ ( _LcdSyUAlarm[7] | _LcdSyIAlarm[7] );
        }
        MeterRunningState |= mrs;
    }
    else
    {
        LCDMEM[2] &=~ ( _LcdSyUAlarm[7] | _LcdSyIAlarm[7] );
    }        

    LcdPcf8576Operation(0,0,20);
}

void LcdDisplayOpen(void)
{
    if( !( DisplayFlashFlag & LCD_DISPLAY_ON_FLAG ) )
    {
        DisplayFlashFlag &=~ LCD_DISPLAY_OFF_FLAG;
        DisplayFlashFlag |= LCD_DISPLAY_ON_FLAG;
        LcdOpenOrClose(LCD_DISPLAY_ON);
    }
}

void LcdDisplayClose(void)
{
    if( ( !( DisplayFlashFlag & LCD_DISPLAY_OFF_FLAG ) ) && ( !TimerCounter[TIMER_PROC_LCD_RESET] ) )
    {
        DisplayFlashFlag |= LCD_DISPLAY_OFF_FLAG;
        DisplayFlashFlag &=~ LCD_DISPLAY_ON_FLAG;
        LcdOpenOrClose(LCD_DISPLAY_OFF);
    }
}
void LcdDisplayControl(uchar time)
{
    if( LcdDispFlag & ( LCD_DISP_FLG_PAGEUP + LCD_DISP_FLG_PAGEDOWN ) )
    {
        LcdDisplayOpen();
        goto DisplayAgain;
    }

    if( IsPowerOn() )
    {
        LcdDisplayOpen();
        goto DisplayAgain;
    }

    if( DisplayFlashFlag & LCD_DISPLAY_ON_FLAG )
    {
        LcdOpenInterval = UsignedCharSub(LcdOpenInterval,time) ;
    }

    if( DisplayFlashFlag & LCD_DISPLAY_OFF_FLAG )
    {
        LcdStopInterval = UsignedCharSub(LcdStopInterval,time);
    }        
    
    if( (DisplayFlashFlag & LCD_DISPLAY_OFF_FLAG) &&(LcdStopInterval == 0))
    {
        LcdDisplayOpen();
        LcdOpenInterval = _SysPotInfo.disptime;
        LcdInterval = 0;
    }

    if( (DisplayFlashFlag & LCD_DISPLAY_ON_FLAG)&&(LcdOpenInterval == 0) )
    {
        LcdStopInterval = _SysPotInfo.dispstoptime;
        LcdDisplayClose();
    }  
   
    if( !(DisplayFlashFlag & LCD_DISPLAY_ON_FLAG) )
    {  
        return;
    }
	
DisplayAgain:
    DisplayRefresh();
}

void InitDisplayPageInfo(void)
{
    MemSet0xFF( (unsigned char *)&_SysPotInfo.dispcontent[0], DISPLAY_ITEM_BYTE );
}

void InitDispPage(void)
{
    DisplayBitLocation = 0;
    LcdInterval = 0;
    LcdStopInterval = 0;
    LcdOpenInterval = 0;
    InitDisplayPageInfo();
    _SysPotInfo.chksum = SysDoCheckSum( (unsigned char *)&_SysPotInfo.regv_con[0], sizeof(_sys_potinfo_s)-4 );
}

void OnDisplayPageUp(void)
{
    LcdDispPageOn();
    if( !( LcdDispFlag & LCD_DISP_FLG_PAGEUP ) )
    {
        InitDispPage();
    }		
    PageUpNext();
    LcdDispFlag |= ( LCD_DISP_FLG_PAGEUP+LCD_DISP_NEXT );
    LcdDispFlag &=~ LCD_DISP_TIME;
    DisplayProcess();
}

void OnDisplayPageDown(void)
{
    LcdDispPageOn();
    if( !( LcdDispFlag & LCD_DISP_FLG_PAGEDOWN ) )
    {	
        InitDispPage();
    }		
    PageDownNext();
    LcdDispFlag |= ( LCD_DISP_FLG_PAGEDOWN+LCD_DISP_NEXT );
    LcdDispFlag &=~ LCD_DISP_TIME;	
    DisplayProcess();
}

const unsigned char _rc_value[]=
{
    0x14,
    0x15,
    ERROR
};

const PROC_FUNC _rc_proc[]=
{
    OnDisplayPageUp,
    OnDisplayPageDown
};

void IrKeyDispose(void)
{
    unsigned char item;

    item = FindCmdItem( _rc_value, RcKeyCode );
    if( item != ERROR )
    {
        (*(_rc_proc+item))();
        DisplayRefresh();
    }
}

⌨️ 快捷键说明

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