📄 display.c
字号:
//D_TarSeg|D_L|D_LMon|D_Total|D_R1|D_R2|D_R3|D_R4
const unsigned char digit[] = {
sega+segb+segc+segd+sege+segf, // 0x7D, "0" LCD segments a+b+c+d+e+f
segb+segc, // 0x60, "1"
sega+segb+segd+sege+segg, // 0x3E, "2"
sega+segb+segc+segd+segg, // 0x7A, "3"
segb+segc+segf+segg, // 0x63, "4"
sega+segc+segd+segf+segg, // 0x5B, "5"
sega+segc+segd+sege+segf+segg, // 0x5F, "6"
sega+segb+segc, // 0x70, "7"
sega+segb+segc+segd+sege+segf+segg, // 0x7F, "8"
sega+segb+segc+segd+segf+segg, // 0x7B "9"
sega+segb+segc+sege+segf+segg, // 0x7B "A"
segc+segd+sege+segf+segg, // 0x7B "b"
sega+segd+sege+segf, // 0x7B "C"
segb+segc+segd+sege+segg, // 0x7B "d"
sega+segd+sege+segf+segg, // 0x7B "E"
sega+sege+segf+segg, // 0x7B "F"
0 // " "
};
typedef struct
{
unsigned char DspID;
unsigned char *Addr;
unsigned char Info[3];
} DSPINFO;
const DSPINFO DspInfo[]={
0x00, (unsigned char *)0x0000, 0, 0, 0,
0x01, SM.Clk.Day, 0, D_Date, D_D2|D_D4,
0x01, SM.Clk.Sec, D_Tm1|D_Tm2, D_Time, 0,
0x02, SM.CMon.Fee[0], D_kWh|D_EC, D_To, D_D5,
0x02, SM.CMon.Fee[1], D_kWh|D_EC, 0, D_D5,
0x02, SM.CMon.Fee[2], D_kWh|D_EC, D_R2, D_D5,
0x02, SM.CMon.Fee[3], D_kWh|D_EC, D_R3, D_D5,
0x02, SM.CMon.Fee[4], D_kWh|D_EC, D_R4, D_D5,
0x0A, SM.Cfg.CustID, D_MetID, 0, 0,
// [8]
0x83, SM.LMon.Fee[0], D_kWh|D_EC, D_LMon|D_To, D_D5,
0x03, SM.LMon.Fee[2], D_kWh|D_EC, D_LMon|D_R2, D_D5,
0x03, SM.LMon.Fee[3], D_kWh|D_EC, D_LMon|D_R3, D_D5,
0x03, SM.LMon.Fee[4], D_kWh|D_EC, D_LMon|D_R4, D_D5,
// [12]
0x94, SM.LMon.Fee[0], D_kWh|D_EC, D_L|D_LMon|D_To, D_D5,
0x04, SM.LMon.Fee[2], D_kWh|D_EC, D_L|D_LMon|D_R2, D_D5,
0x04, SM.LMon.Fee[3], D_kWh|D_EC, D_L|D_LMon|D_R3, D_D5,
0x04, SM.LMon.Fee[4], D_kWh|D_EC, D_L|D_LMon|D_R4, D_D5,
0x05, (unsigned char *)&SM.Cfg.TariList[0], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[1], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[2], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[3], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[4], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[5], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[6], D_Tm1, 0, 0,
0x05, (unsigned char *)&SM.Cfg.TariList[7], D_Tm1, 0, 0,
};
const int NomMaxPages=15;
const int KeyMaxPages=sizeof(DspInfo)/sizeof(DSPINFO)-1;
const char R_E2P_1=8;
const char R_E2P_2=12;
void LcdInit( void )
{
unsigned char i;
P5SEL = 0xFC; // Common and Rxx all selected
// LCDCTL = LCDON + LCD4MUX + LCDP2 + LCDP1 + LCDP0; // STK LCD 4Mux, S0-S23
LCDCTL = LCDON + LCD4MUX + LCDSG0_1; // STK LCD 4Mux, S0-S15
for (i=0; i<=19; i++) LCDMEM[i] = 0;
}
void Display( void )
{
unsigned int tmpData;
unsigned char i,j;
DM.Tsk.Req.Disp=0;
//SM.PagePtr=3;
//SM.Cfg.LcdCtl.Mode[0]=1;
#ifdef DISPLAY_CHANGED
#ifdef OSC_FAULT_DETECT
switch(SM.Cfg.LcdCtl.Mode&0x03)
#else
switch(SM.Cfg.LcdCtl.Mode)
#endif
#else
#ifdef OSC_FAULT_DETECT
switch(SM.Cfg.LcdCtl.Mode[0]&0x03)
#else
switch(SM.Cfg.LcdCtl.Mode[0])
#endif
#endif
{
case 0:
case 1:
switch(DspInfo[SM.PagePtr].DspID&0x0F)
{
case 0x00:
if(SM.Temp>=0)
{
i=SM.Temp;
MYLCDMEM[ 6] = 0;
}
else
{
i=-SM.Temp;
MYLCDMEM[ 6] = segg;
}
MYLCDMEM[ 7] = 0;
MYLCDMEM[ 6] = 0;
MYLCDMEM[ 5] = digit[i/10];
MYLCDMEM[ 4] = digit[i%10];
MYLCDMEM[ 3] = sega|segb|segf|segg;
MYLCDMEM[ 2] = digit[0x0C];
break;
case 0x02:
case 0x03:
case 0x04:
MYLCDMEM[ 7] = digit[DspInfo[SM.PagePtr].Addr[3]&0x0F];
MYLCDMEM[ 6] = digit[DspInfo[SM.PagePtr].Addr[2]>>4];
MYLCDMEM[ 5] = digit[DspInfo[SM.PagePtr].Addr[2]&0x0F];
MYLCDMEM[ 4] = digit[DspInfo[SM.PagePtr].Addr[1]>>4];
MYLCDMEM[ 3] = digit[DspInfo[SM.PagePtr].Addr[1]&0x0F];
MYLCDMEM[ 2] = digit[DspInfo[SM.PagePtr].Addr[0]>>4];
for(i=7;i>=4;i--)
{
if( (MYLCDMEM[i]!=0) && (MYLCDMEM[i]!=digit[0]) ) break;
else MYLCDMEM[i]=0;
}
break;
case 0x05:
tmpData = (DspInfo[SM.PagePtr].Addr[1]<<8)+DspInfo[SM.PagePtr].Addr[0];
MYLCDMEM[ 7] = digit[(tmpData>>14)&0x0F];
MYLCDMEM[ 6] = digit[(tmpData>>10)&0x0F];
MYLCDMEM[ 5] = digit[(tmpData>>6)&0x0F];
MYLCDMEM[ 4] = digit[(tmpData>>2)&0x0F];
MYLCDMEM[ 3] = 0;
MYLCDMEM[ 2] = digit[(tmpData&3)+1];
break;
case 0x01:
case 0x0A:
MYLCDMEM[ 7] = digit[DspInfo[SM.PagePtr].Addr[2]>>4];
MYLCDMEM[ 6] = digit[DspInfo[SM.PagePtr].Addr[2]&0x0F];
MYLCDMEM[ 5] = digit[DspInfo[SM.PagePtr].Addr[1]>>4];
MYLCDMEM[ 4] = digit[DspInfo[SM.PagePtr].Addr[1]&0x0F];
MYLCDMEM[ 3] = digit[DspInfo[SM.PagePtr].Addr[0]>>4];
MYLCDMEM[ 2] = digit[DspInfo[SM.PagePtr].Addr[0]&0x0F];
break;
default:break;
}
break;
case 2:
break;
default:break;
}
// 以下程序显示符号
MYLCDMEM[0] = (MYLCDMEM[0] & D_Comm) | DspInfo[SM.PagePtr].Info[0];
MYLCDMEM[1] = DspInfo[SM.PagePtr].Info[1];
i=1,j=2;
do
{
if(DspInfo[SM.PagePtr].Info[2]&i) MYLCDMEM[j] |= segh;
else MYLCDMEM[j] &=~segh;
i <<= 1;
j++;
}while(i<=0x40);
#ifdef OSC_FAULT_DETECT
#ifdef DISPLAY_CHANGED
if(SM.Cfg.LcdCtl.Mode & 0x0c)MYLCDMEM[0]|=0x20;
else MYLCDMEM[0]&=~0x20;
#else
if(SM.Cfg.LcdCtl.Mode[0] & 0x0c)MYLCDMEM[0]|=0x20;
else MYLCDMEM[0]&=~0x20;
#endif
#endif
}
void DspCtrl( void ) //
{
unsigned char i;
#ifdef DISPLAY_CHANGED
if ( SM.SecCtr<SM.Cfg.LcdCtl.DispTime )
#else
if ( SM.SecCtr<SM.Cfg.LcdCtl.DispTime[0] )
#endif
SM.SecCtr++;
else
{
SM.SecCtr=0;
do
{
if ( SM.PagePtr<=NomMaxPages )
{
SM.PagePtr++;
SM.TmpOption <<= 1;
}
else {SM.PagePtr=0; SM.TmpOption=1;}
}while(!((unsigned int)SM.Cfg.LcdCtl.Reg.w[0] & SM.TmpOption));
if( DspInfo[SM.PagePtr].DspID&0x80 ) // 上上月
{
i=(DspInfo[SM.PagePtr].DspID&0x10)>>4;
GetI2CData( DM.Reg.b,E2PG2,ECPtr,1 );
E2ToRAM(2,LMonAddr[DM.Reg.b[0]>=i?DM.Reg.b[0]-i:DM.Reg.b[0]+10-i]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -