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

📄 display.c

📁 MSP430F413单相电表DEMO(编译器IAR 3.42A)
💻 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 + -