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

📄 display.c

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

unsigned char LcdInterval;    
unsigned char LcdStopInterval = 0;
unsigned char LcdOpenInterval;
unsigned char DisplayBitLocation;     
unsigned char LcdDispFlag;           
unsigned char DisplayFlashFlag = LCD_DISPLAY_OFF_FLAG;
unsigned char UserKeyDownNum = 0;       

const unsigned char _LcdCodeHex[16] = 
{
    LCD_CODE_INFO_0,
    LCD_CODE_INFO_1,
    LCD_CODE_INFO_2,
    LCD_CODE_INFO_3,
    LCD_CODE_INFO_4,
    LCD_CODE_INFO_5,
    LCD_CODE_INFO_6,
    LCD_CODE_INFO_7,
    LCD_CODE_INFO_8,
    LCD_CODE_INFO_9,
    LCD_CODE_INFO_A,
    LCD_CODE_INFO_b,
    LCD_CODE_INFO_C,
    LCD_CODE_INFO_d,
    LCD_CODE_INFO_E,
    LCD_CODE_INFO_F
};

const unsigned char _LcdCnExes[][2] =
{
    { LCD_CN_INFO_ADDR_SUM, LCD_CN_INFO_SUM },
    { LCD_CN_INFO_ADDR_PEAK, LCD_CN_INFO_PEAK },
    { LCD_CN_INFO_ADDR_APEX, LCD_CN_INFO_APEX },
    { LCD_CN_INFO_ADDR_CALM, LCD_CN_INFO_CALM },
    { LCD_CN_INFO_ADDR_VALE, LCD_CN_INFO_VALE }
};
const unsigned char _LcdSyExes[] =
{
    LCD_SY_INFO_PEAK,
    LCD_SY_INFO_APEX,
    LCD_SY_INFO_CALM,
    LCD_SY_INFO_VALE
};

const unsigned char _LcdSyUAlarm[] =
{
    0,
    LCD_EN_INFO_UA,
    LCD_EN_INFO_UB,
    LCD_EN_INFO_UA|LCD_EN_INFO_UB,
    LCD_EN_INFO_UC,
    LCD_EN_INFO_UA|LCD_EN_INFO_UC,
    LCD_EN_INFO_UB|LCD_EN_INFO_UC,
    LCD_EN_INFO_UA|LCD_EN_INFO_UB|LCD_EN_INFO_UC
};

const unsigned char _LcdSyIAlarm[] =
{
    0,
    LCD_EN_INFO_IA,
    LCD_EN_INFO_IB,
    LCD_EN_INFO_IA|LCD_EN_INFO_IB,
    LCD_EN_INFO_IC,
    LCD_EN_INFO_IA|LCD_EN_INFO_IC,
    LCD_EN_INFO_IB|LCD_EN_INFO_IC,
    LCD_EN_INFO_IA|LCD_EN_INFO_IB|LCD_EN_INFO_IC
};

const unsigned char _LcdCodeHigh4[] =
{
    0
};

const unsigned char _LcdInfo2Code6Bcd[] =
{
    LCD_CODE_INFO_H, LCD_CODE_INFO__,
    LCD_CODE_INFO_L, LCD_CODE_INFO__,
    LCD_CODE_INFO_A, LCD_CODE_INFO_C,
    LCD_CODE_INFO_R, LCD_CODE_INFO_C
};

const unsigned char _LcdInfo4Code4Bcd[] =
{
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_U, LCD_CODE_INFO_A, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_U, LCD_CODE_INFO_b, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_U, LCD_CODE_INFO_C, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_1, LCD_CODE_INFO_A, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_1, LCD_CODE_INFO_b, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_1, LCD_CODE_INFO_C, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_F, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_P, LCD_CODE_INFO_H, LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_A, LCD_CODE_INFO_P, LCD_CODE_INFO_H, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_b, LCD_CODE_INFO_P, LCD_CODE_INFO_H, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_C, LCD_CODE_INFO_P, LCD_CODE_INFO_H, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_C, LCD_CODE_INFO_L, LCD_CODE_INFO_r, LCD_CODE_INFO_NONE,
    LCD_CODE_INFO_C, LCD_CODE_INFO_o, LCD_CODE_INFO_d, LCD_CODE_INFO_E
};

const unsigned char _LcdContentCode_H[] =
{
    0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,
    4,5,6,7,
    8,9,10,
    11,11,11,11,11,12,12,12,12,12,
    13,13,13,13,13
};

const unsigned char _LcdContentCode_L_00[] =
{
    0,2,4,5,7,9,10,11
};

const unsigned char _LcdSyUI[] =
{
    LCD_EN_INFO_UA,
    LCD_EN_INFO_UB,
    LCD_EN_INFO_UC,
    LCD_EN_INFO_IA,
    LCD_EN_INFO_IB,
    LCD_EN_INFO_IC
};

void DisplayReinit(void)
{
    DisplayBitLocation = 0;
    LcdInterval = 0;
    LcdStopInterval = 0;
    LcdOpenInterval = 0;
    LcdDispFlag |= LCD_DISP_NEXT;	
    LcdDispFlag &=~ ( LCD_DISP_FLG_PAGEUP | LCD_DISP_FLG_PAGEDOWN );    	
}

void DisplayContentReinit(void)
{
    if(LcdDispFlag&(LCD_DISP_FLG_PAGEDOWN|LCD_DISP_FLG_PAGEUP))
    {
        InitDisplayPageInfo();
        return;
    }
    
    FramRead( ADDR_OF_CYCDISP_TIME, (unsigned char *)&_SysPotInfo.disptime, 2 );
    _SysPotInfo.disptime = Bcd2HexChar(_SysPotInfo.disptime);
    _SysPotInfo.dispstoptime = Bcd2HexChar(_SysPotInfo.dispstoptime);
    if(IsPowerOn())
    {
        FramRead( DISP_CONTENT1, (unsigned char *)&_SysPotInfo.dispcontent[0], DISPLAY_ITEM_BYTE );
    }
    else
    {
        FramRead( DISP_CONTENT2, (unsigned char *)&_SysPotInfo.dispcontent[0], DISPLAY_ITEM_BYTE );
    }
    
    if( IsEqualSpecialData( (unsigned char *)&_SysPotInfo.dispcontent[0], 0, DISPLAY_ITEM_BYTE ) == OK )
    {
        _SysPotInfo.dispcontent[0] = 0x03;
    }		
    
    if( IsEqualSpecialData((unsigned char *)&_SysPotInfo.dispcontent[0], 0, DISPLAY_ITEM_BYTE ) != OK )
    {
        LcdDispFlag|=LCD_DISP_FLG_ACTIVE;
    }
}

void ClearLcd(void)
{
    LCDMEM[0] = 0;
    LCDMEM[1] &= ( AlarmOpenCoverBoard |LCD_CN_INFO_ALARM | LCD_CN_INFO_LOWPWR | LCD_CN_INFO_PWRCUT | LCD_CN_INFO_PGM );
    LCDMEM[2] &= ( _LcdSyUAlarm[7] |_LcdSyIAlarm[7] );
    LCDMEM[3] = 0;
    LCDMEM[4] = 0;
    LCDMEM[5] = 0; 
    LCDMEM[6] = 0;
    LCDMEM[7] = 0;
    LCDMEM[8] = 0;
    LCDMEM[9] = 0;
    LCDMEM[10] = 0;
    LCDMEM[11] = 0;
    LCDMEM[12] = 0;
    LCDMEM[13] = 0;
    LCDMEM[14] = 0;
    LCDMEM[16] &= ( LCD_EN_INFO_WATT | LCD_EN_INFO_VAR );
    LCDMEM[17] = 0;
    LCDMEM[18] = 0;
    LCDMEM[19] = 0;
    LcdPcf8576Operation(0,0,20);

}

void LargeLedDisplay2Code6Bcd( unsigned char pos, unsigned char *data )
{
    LCDMEM[LCD_CODE_ADDR_05] |= _LcdInfo2Code6Bcd[pos];
    LCDMEM[LCD_CODE_ADDR_06] |= _LcdInfo2Code6Bcd[pos+1];
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdCodeHex[*(data+2)>>4];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdCodeHex[*(data+2)&0x0F];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];
}

void LargeLedDisplay8Bcd(unsigned char *data)
{
    LCDMEM[LCD_CODE_ADDR_05] |= _LcdCodeHex[*(data+3)>>4];
    LCDMEM[LCD_CODE_ADDR_06] |= _LcdCodeHex[*(data+3)&0x0F];
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdCodeHex[*(data+2)>>4];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdCodeHex[*(data+2)&0x0F];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];  
}

void LargeLedDisplay6Bcd(unsigned char *data)
{
    LCDMEM[LCD_CODE_ADDR_05] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_06] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdCodeHex[*(data+2)>>4];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdCodeHex[*(data+2)&0x0F];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];
}

void LargeLedDisplay4Code4Bcd(unsigned char pos, unsigned char *data)
{
    LCDMEM[LCD_CODE_ADDR_05] |= _LcdInfo4Code4Bcd[pos];
    LCDMEM[LCD_CODE_ADDR_06] |= _LcdInfo4Code4Bcd[pos+1];
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdInfo4Code4Bcd[pos+2];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdInfo4Code4Bcd[pos+3];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];
}

void LargeLedDisplay4Bcd(unsigned char *data)
{
    LCDMEM[LCD_CODE_ADDR_05] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_06] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_07] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_08] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];
}

void LargeLedDisplay4Code3Bcd(unsigned char pos, unsigned short data)
{
    LCDMEM[LCD_CODE_ADDR_05] |= _LcdInfo4Code4Bcd[pos];
    LCDMEM[LCD_CODE_ADDR_06] |= _LcdInfo4Code4Bcd[pos+1];
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdInfo4Code4Bcd[pos+2];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdInfo4Code4Bcd[pos+3];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[(unsigned char)((data>>12)&0x0F)];
    LCDMEM[LCD_CODE_ADDR_10] |= _LcdCodeHex[(unsigned char)((data>>8)&0x0F)];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[(unsigned char)((data>>4)&0x0F)];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[(unsigned char)(data&0x0F)];
}

void LargeLedDisplay1Bcd(unsigned char data)
{
    LCDMEM[LCD_CODE_ADDR_05] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_06] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_07] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_08] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_09] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_10] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_11] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[data&0x0F];
}

void LargeLedDisplay2Bcd(unsigned char data)
{
    LCDMEM[LCD_CODE_ADDR_05] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_06] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_07] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_08] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_09] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_10] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[(data>>4)&0x0F];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[data&0x0F];
}

void LargeLedDisplay6BcdSpec(unsigned char *data)
{
    LCDMEM[LCD_CODE_ADDR_05] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_06] |= _LcdCodeHex[*(data+2)>>4];
    LCDMEM[LCD_CODE_ADDR_07] |= _LcdCodeHex[*(data+2)&0x0F];
    LCDMEM[LCD_CODE_ADDR_08] |= _LcdCodeHex[*(data+1)>>4];
    LCDMEM[LCD_CODE_ADDR_09] |= _LcdCodeHex[*(data+1)&0x0F];
    LCDMEM[LCD_CODE_ADDR_10] &=~ (0x7F);
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[*(data)>>4];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[*(data)&0x0F];
}

void DisplayContentCode(void)
{
    unsigned short temp;

    temp =  (unsigned short)DisplayBitLocation;
    temp = Hex2BcdShort( temp );
    LCDMEM[LCD_SY_INFO_ADDR_P2] |= LCD_SY_INFO_P2;
    LCDMEM[LCD_CODE_ADDR_01] |= _LcdCodeHex[ ( temp >> 12 ) & 0x0F ];
    LCDMEM[LCD_CODE_ADDR_02] |= _LcdCodeHex[ ( temp >> 8 ) & 0x0F ];
    LCDMEM[LCD_CODE_ADDR_03] |= _LcdCodeHex[ ( temp >> 4 ) & 0x0F ];
    LCDMEM[LCD_CODE_ADDR_04] |= _LcdCodeHex[ temp & 0x0F ];
}

void DisplayDeviceNum(void)
{
    unsigned char data[3], temp = 0;

    if( DisplayBitLocation == 8 )
    {
        memcpy( data, (unsigned char *)&_SysDisplayRam.PmNum[0], 3 );
        temp = 2;
    }
    else
    {
        memcpy( data, (unsigned char *)&_SysDisplayRam.PmNum[3], 3 );
    }
    LargeLedDisplay2Code6Bcd( temp, data );

}

void DisplayMeterNum(void)
{
    DISP_CN_MNUM();
    DisplayDeviceNum();
}
 
void DisplayDoubleMaoHao(void)
{
    DISP_COLON_FRONT();
    DISP_COLON_REAR();
}

void DisplayDateTimeData(unsigned char *dt)
{
    LargeLedDisplay6Bcd(dt);
    DisplayDoubleMaoHao();    
}

void DisplayDateTime(void)
{        
    if( DisplayBitLocation == 5 )
    {     
        DisplayDateTimeData( &SystemTime[SPACE_OF_DAY] );
        DISP_CN_DATE();    
    }
    else
    {
        DisplayDateTimeData( &SystemTime[SPACE_OF_SECOND] );
        DISP_CN_TIME();
        LcdDispFlag |= LCD_DISP_TIME;
    }
}

const unsigned char _disp_baud_rate[] =
{
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_3,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_6,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_1, LCD_CODE_INFO_2,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_2, LCD_CODE_INFO_4,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_4, LCD_CODE_INFO_8,
    LCD_CODE_INFO_NONE, LCD_CODE_INFO_NONE, LCD_CODE_INFO_9, LCD_CODE_INFO_6,
    LCD_CODE_INFO_1, LCD_CODE_INFO_1, LCD_CODE_INFO_5, LCD_CODE_INFO_2,
};

void DisplayBondrate(void)
{
    unsigned char br = JudgeUart0BaudRate()*4;

    LCDMEM[LCD_CODE_ADDR_07] |= _disp_baud_rate[br];
    LCDMEM[LCD_CODE_ADDR_08] |= _disp_baud_rate[br+1];
    LCDMEM[LCD_CODE_ADDR_09] |= _disp_baud_rate[br+2];
    LCDMEM[LCD_CODE_ADDR_10] |= _disp_baud_rate[br+3];
    LCDMEM[LCD_CODE_ADDR_11] |= _LcdCodeHex[0];
    LCDMEM[LCD_CODE_ADDR_12] |= _LcdCodeHex[0];
    LCDMEM[LCD_EN_INFO_ADDR_BPS] |= LCD_EN_INFO_BPS;
}

void DisplayPointerNext(void)
{
    DisplayBitLocation++;
    if( DisplayBitLocation >= DISPLAY_ITEM )
    {
        DisplayBitLocation = 0;
    }
}

void PageUpNext(void)
{
    if( LcdDispFlag & LCD_DISP_FLG_PAGEUP )
    {
        DisplayBitLocation++;
        if( DisplayBitLocation >= DISPLAY_ITEM )
        {
            DisplayBitLocation = 0;
        }
    }		
}

void PageDownNext(void)
{
    if( DisplayBitLocation == 0 )
    {
        DisplayBitLocation = DISPLAY_ITEM;
    }

    if( DisplayBitLocation )
    {
        DisplayBitLocation--;
    }	
}

const unsigned char _disp_power_item[]={0,2,3,4};
void DisplayPowerData(void)
{
    unsigned long pwrdata,temp;
    unsigned char item;

    item = _disp_power_item[DisplayBitLocation];
    LCDMEM[_LcdCnExes[item][0]] |= _LcdCnExes[item][1];
    LCDMEM[LCD_CN_INFO_ADDR_PWR] |= LCD_CN_INFO_PWR;
    LCDMEM[LCD_SY_INFO_ADDR_P10] |= LCD_SY_INFO_P10;
    if( DisplayBitLocation < 4 )
    {
        LCDMEM[LCD_CN_INFO_ADDR_ACTIVE] |= LCD_CN_INFO_ACTIVE;
        LCDMEM[LCD_CN_INFO_ADDR_POSITIVE] |= LCD_CN_INFO_POSITIVE;
        if( !(PowerStateFlag & PS_BREAKPOWER_FLAG ) )
        {		
            LoadEnergy( (unsigned char *)&pwrdata, 0xFF, item );
        }
        else
        {
            pwrdata = _SysDisplayRam.ActivePosPwr[DisplayBitLocation];

⌨️ 快捷键说明

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