📄 lcd.c
字号:
#ifdef TAMPER_DETECTION
#define NomMaxPages 12
#else
#define NomMaxPages 11
#endif
const DSPINFO DspInfo[] =
{
//标识,显示数据地址, LCDMEM[0][1]信息,LCDMEM[8][9]显示信息,小数点等显示信息
0x0000, SM.ClkBcd.Day, 0, 0, 0, D_DATA, D_4H + D_6H,
0x0000, SM.ClkBcd.Sec, 0, 0, 0, D_TIME, D_P1 + D_P2,
0x1000, SM.CMon.KwhPp.Fee[0], CHAR_E, 0, 0, D_ENERGY, D_KW + D_h + D_6H,
0x1000, SM.CMon.KwhQp.Fee[0], CHAR_q, 0, 0, D_ENERGY, D_6H,
0xA000, DM.ubActPower1, CHAR_P, CHAR_1, 0, 0, D_KW + D_4H,
#ifdef TAMPER_DETECTION
0xA000, DM.ubActPower2, CHAR_P, CHAR_2, 0, 0, D_KW + D_4H,
#endif
0xA000, DM.ubReActPower, CHAR_r, CHAR_P, 0, 0, D_KW + D_4H,
0xA000, DM.ubAppPower, CHAR_A, CHAR_P, 0, 0, D_KW + D_4H,
0xA100, DM.ubV1RMS, CHAR_U, 0, 0, 0, D_6H,
0xA200, DM.ubIRMS, CHAR_C, 0, 0, 0, D_4H,
0xA300, DM.ubPF, CHAR_P, CHAR_F, 0, 0, D_4H,
0xA400, DM.ubMainFr, CHAR_F, CHAR_r, 0, 0, D_6H,
0xA500, DM.ubTemperature, CHAR_t, 0, 0, 0, 0,
#ifdef TAMPER_DETECTION
0xF000, (unsigned char *)(&SM.Cfg.EspPar.uiAdaptI1), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.uiAdaptI2), 0, 0, 0, 0, 0,
#endif
0xF000, (unsigned char *)(&SM.Cfg.EspPar.uiGainCorr1), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.lPowerOffset1), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.iPhaseCorr1), 0, 0, 0, 0, 0,
#ifdef TAMPER_DETECTION
0xF000, (unsigned char *)(&SM.Cfg.EspPar.uiGainCorr2), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.lPowerOffset2), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.iPhaseCorr2), 0, 0, 0, 0, 0,
#endif
0xF000, (unsigned char *)(&SM.Cfg.EspPar.uiV1Gain), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.ulIGain), 0, 0, 0, 0, 0,
0xF000, (unsigned char *)(&SM.Cfg.EspPar.iTempSampleOffset), 0, 0, 0, 0, 0,
// *****************************************************************************
0xE000, (unsigned char *)(&DM.EspRs.lActEnergy1), 0, 0, 0, 0, 0,
};
#ifdef TAMPER_DETECTION
const unsigned char LcdPtr[][3]=
{
0,0,0,
9,NomMaxPages+1,2,
9,NomMaxPages+2,2,
4,NomMaxPages+3,2,
4,NomMaxPages+4,3,
4,NomMaxPages+5,2,
5,NomMaxPages+6,2,
5,NomMaxPages+7,3,
5,NomMaxPages+8,2,
8,NomMaxPages+9,2,
9,NomMaxPages+10,2,
12,NomMaxPages+11,2
};
#else
const unsigned char LcdPtr[][3]=
{
0,0,0,
4,NomMaxPages+1,2,
4,NomMaxPages+2,3,
4,NomMaxPages+3,2,
7,NomMaxPages+4,2,
8,NomMaxPages+5,2,
11,NomMaxPages+6,2
//21,NomMaxPages+16,0
};
#endif
const unsigned char Digit[] =
{
CHAR_0,
CHAR_1,
CHAR_2,
CHAR_3,
CHAR_4,
CHAR_5,
CHAR_6,
CHAR_7,
CHAR_8,
CHAR_9,
CHAR_A,
CHAR_B,
CHAR_C,
CHAR_D,
CHAR_E,
CHAR_F
};
void LcdCfgIni( void )
{
SM.LcdCtl.DispTime = 3;
SM.LcdCtl.Mode = 0;
SM.LcdCtl.Switch = 0;
SM.LcdCtl.PagePtr = 0;
SM.LcdCtl.SecCtr = 0;
}
void LcdTurnOn( void )
{
LCDCTL = LCDSG0_3 +LCD4MUX + LCDON;
}
/******************************************************************
* 清LCD显存 *
*******************************************************************/
void Clr_LCD_Display(void)
{
unsigned char i;
for (i=0; i<12; i++)
{
LCDMEM[i] = 0;
}
}
void LcdMemL1( unsigned int nPage, unsigned char chs )//显示的字节数
{
unsigned char i;
unsigned char chs1;
chs1=3-chs;
for( i=0;i<chs1;i++ ) //显示前导零
{
LCDMEM[(2*i)+2] = 0;
LCDMEM[(2*i)+3] = 0;
}
/*for( i=chs;i<3;i++ )
{
//LCDMEM[6-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))>>4];
//LCDMEM[7-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))&0x0F];
LCDMEM[6-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))>>4];
LCDMEM[7-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))&0x0F];
}*/
for( i=0;i<chs;i++ )
{
//LCDMEM[6-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))>>4];
//LCDMEM[7-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))&0x0F];
LCDMEM[6-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))>>4];
LCDMEM[7-(2*i)] = Digit[(*(DspInfo[nPage].Addr1+i))&0x0F];
}
}
//*********************************************
// Line = 1 or 2, else No Cut
//*********************************************
void LcdCut_0( unsigned char chs ) //清前导0
{
unsigned char i;
for( i=0;i<chs;i++ )
{
if( ((LCDMEM[i+2]&0x7F) == Digit[0]) || (LCDMEM[i+2] == 0) )
LCDMEM[i+2] &= ~0x7F;
else break;
}
}
void LcdL1F0( void ) //第一行清0
{
unsigned char iii;
for( iii=0;iii<7;iii++ ) LCDMEM[iii+2] = 0;
}
void Display(unsigned int nPage)
{
switch(DspInfo[nPage].DspID&0xF000)
{
case 0x0000:
{
LcdMemL1(nPage,3);
}break;
case 0x1000:
{
LcdMemL1(nPage,3);
}break;
case 0xA000:
{
switch(DspInfo[nPage].DspID&0x0F00)
{
case 0x0000: // Power
{
LcdMemL1(nPage,3);
LcdCut_0(1);
}break;
case 0x0100: // U
{
LcdMemL1(nPage,3);
LcdCut_0(3);
}break;
case 0x0200: // I
{
LcdMemL1(nPage,3);
LcdCut_0(1);
}break;
case 0x0300: // Factor
{
LcdMemL1(nPage,3);
LcdCut_0(1);
}break;
case 0x0400: // Freq
{
LcdMemL1(nPage,2);
LcdCut_0(3);
}break;
case 0x0500:
{
LcdMemL1(nPage,1);
if(MeterRunState & TEMP_FLAG)
{
LCDMEM[5] |= SEG_g;
}
else
{
LCDMEM[5] &= ~SEG_g;
}
}
}
}break;
case 0xF000:
{
LcdMemL1(nPage,DM.tmpPtr[0]);
}break;
}
}
void Update_Display(void)
{
unsigned char i,j;
switch(DM.ucKeyMode)
{
case 0:
{
Display(SM.LcdCtl.PagePtr);
LCDMEM[0]=DspInfo[SM.LcdCtl.PagePtr].Info[0];
LCDMEM[1]=DspInfo[SM.LcdCtl.PagePtr].Info[1];
LCDMEM[8]=DspInfo[SM.LcdCtl.PagePtr].Info[2];
LCDMEM[9]=DspInfo[SM.LcdCtl.PagePtr].Info[3];
}break;
case 1:
{
Display(SM.LcdCtl.PagePtr);
LCDMEM[0]=Digit[DM.ucKeyCalibrationMode];
LCDMEM[1]=Digit[DM.ucKeyCalibrationStep];
LCDMEM[8]=0;
LCDMEM[9]=0;
}break;
}
for(i=0,j=0x01;i<8;i++)
{
if(DspInfo[SM.LcdCtl.PagePtr].Info[4]&j) LCDMEM[i] |= SEG_h;
else LCDMEM[i] &=~SEG_h;
j <<= 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -