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

📄 display.c

📁 用ADE7169F16单片机实现了单向多费4率电能表
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************
;Ade7169 demo program     
;*************************************
;AUTHOR:        Su RuTong
;DATE:          03 09 2006
;*************************************/

#include "hal.h"
#include "utilities.h"
#include "Display.h"
#include "RTC.h"
#include "public.h"
#include "Measure.h"


unsigned char idata bManDisp=0;                       // 0 : 自动轮显 1: 手动翻页
unsigned char idata LcdInterval;                      // 显示间隔时间
unsigned char idata DisplayPointer;                   // 当前项指针
unsigned char idata DisplayPowerPointer;              // 当前项指针
unsigned char idata DisplayBitLocation;               // 当前显示项的当前bit位
unsigned char idata LcdDispFlag;                      // 显示标志
unsigned char idata DisplayPointerTemp;               // 显示标志

//typedef void (* PROC_FUNC)(void);                   // 函数指针类型定义


code const unsigned char PointsTable[12]=         // Offset into LCDBuf, Bit
{
	0x0A,0x02,										// P1
	0x06,0x80,										// P2
	0x02,0x80,										// P3
	0x03,0x80,										// P4
	0x04,0x80,										// P5
	0x05,0x80,										// P6
};

code const unsigned char IconTable[32]=
{
	0x01,0x80,	                                    // T
    0x08,0x40,	                                    // rms
    0x08,0x20,	                                    // X6 (I in Irms)
	0x08,0x10,	                                    // X5 (V in Vrms)
	0x09,0x80,	                                    // PF
	0x0A,0x04,	                                    // Battery

	0x0A,0x01,	                                    // Phone
	0x0B,0x80,	                                    // MD
	0x00,0x80,	                                    // AnalogDevice LOGO
    0x07,0x40,	                                    // h
    0x07,0x20,	                                    // r
	0x07,0x10,	                                    // X4
	0x07,0x01,	                                    // X3
	0x07,0x02,	                                    // X2
	0x07,0x04,	                                    // X1
	0x07,0x08,	                                    // k	
};


// +-+-+-+-++-+-+-+-+
// |-|c|b|d||a|e|g|f|
// +-+-+-+-++-+-+-+-+
code const unsigned char DigitTable[]=
{	
    0x7D,	                                        // 0
	0x60,	                                        // 1
	0x3E,	                                        // 2
	0x7A,	                                        // 3
	0x63,	                                        // 4
	0x5B,	                                        // 5
	0x5F,	                                        // 6
	0x70,	                                        // 7
	0x7F,	                                        // 8
	0x7B,	                                        // 9
	
	0x77,                                           // A
	0x4F,                                           // b
	0x1D,                                           // C
	0x6E,                                           // d
	0x1F,                                           // E
	0x17,                                           // F
	0x67,                                           // H
	0x4A,                                           // z
};

void _Lcd_Write(unsigned char Addr,unsigned char disp_dat)
{
	LCDCONY|=0x01; 									// start updating the data,freeze the data being displayed on the LCD while updating it.
	LCDDAT=disp_dat;								// move the data to the LCD Data SFR
	LCDPTR=Addr|0x80;								//
	LCDCONY&=0x0FE; 								// update finished
	// LCDCON|=LCDEN; 									// enable LCD
}

unsigned char _Lcd_Read(unsigned char Addr)
{
	unsigned char Lcd_dat;
	
	LCDPTR=Addr&0x7f;
	Lcd_dat=LCDDAT;
	return(Lcd_dat);
}

// Input: LCDBufAddr holds bottom of 12 byte buffer to be displayed
void _Lcd_WScreen(unsigned char idata *LCDBufAddr)
{
    unsigned char i;
    CLR_WDT();
	LCDCONY|=BIT0; 									    // start updating the data,freeze the data being displayed on the LCD while updating it.
    for(i=0x80;i<0x8C;i++)
    {
    	LCDDAT=*LCDBufAddr;								// move the data to the LCD Data SFR
    	LCDPTR=i;
    	LCDBufAddr++;
	}
	LCDCONY&=~(BIT0); 								    // update finished
	// LCDCON|=LCDEN; 									// enable LCD
}

void Disp_Digit(unsigned char position,unsigned char disp_dat) //reentrant
{
    if(disp_dat<=10)
    {
        //_Lcd_Write(position,DigitTable[disp_dat]);
        if(lcd_buf[position]){lcd_buf[position] |= DigitTable[disp_dat];}
        else{lcd_buf[position] = DigitTable[disp_dat];}
    }
    else
    {
    }
}

// Display format "xx xx xx.xx"
//#ifdef __IAR_SYSTEMS_ICC__
//#pragma optimize=none
//#endif
void __Disp_Digits(unsigned char idata *disp_ptr)
{
    unsigned char k;

    for(k=7; k>=1; (disp_ptr++))
    {
        //_Lcd_Write(position,DigitTable[disp_dat]);
        if(lcd_buf[k-1])
        {
            lcd_buf[k-1] |= DigitTable[(*disp_ptr)&0x0F];
            k--;
            if(k==0) break;
            lcd_buf[k-1] |= DigitTable[((*disp_ptr)>>4)&0x0F];
            k--;
        }
        else
        {
            lcd_buf[k-1] = DigitTable[(*disp_ptr)&0x0F];
            k--;
            if(k==0) break;
            lcd_buf[k-1] = DigitTable[((*disp_ptr)>>4)&0x0F];
            k--;
        }
        //disp_ptr++;
    }
    return;
}

#ifdef __IAR_SYSTEMS_ICC__
void Disp_KWIcon(void)
#else
void Disp_KWIcon(void) reentrant
#endif
{
    if(lcd_buf[Disp_Icon_K_Addr]) {lcd_buf[Disp_Icon_K_Addr] |= (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X2|Disp_Icon_X3);}
    else{lcd_buf[Disp_Icon_K_Addr] = (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X2|Disp_Icon_X3);}
}

#ifdef __IAR_SYSTEMS_ICC__
void Disp_KWHIcon(void)
#else
void Disp_KWHIcon(void) reentrant
#endif
{
    if(lcd_buf[Disp_Icon_K_Addr]) {lcd_buf[Disp_Icon_K_Addr] |= (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X2|Disp_Icon_X3|Disp_Icon_H);}
    else{lcd_buf[Disp_Icon_K_Addr] = (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X2|Disp_Icon_X3|Disp_Icon_H);}
}

#ifdef __IAR_SYSTEMS_ICC__

void Disp_KVARHIcon(void)
#else
void Disp_KVARHIcon(void) reentrant
#endif
{
    if(lcd_buf[Disp_Icon_K_Addr]) {lcd_buf[Disp_Icon_K_Addr] |= (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X3|Disp_Icon_X4|Disp_Icon_R|Disp_Icon_H);}
    else{lcd_buf[Disp_Icon_K_Addr] = (Disp_Icon_K|Disp_Icon_X1|Disp_Icon_X3|Disp_Icon_X4|Disp_Icon_R|Disp_Icon_H);}
}
#if 0
void Disp_VARIcon(void) reentrant
{
    LCDCONY |= (BIT0); 									// start updating the data,freeze the data being displayed on the LCD while updating it.
    // X1
	LCDDAT   = IconTable[IconTab_indx_X1+1];				// move the data to the LCD Data SFR
	LCDPTR   = IconTable[IconTab_indx_X1]|BIT7;
    // X3
	LCDDAT   = IconTable[IconTab_indx_X3+1];				// move the data to the LCD Data SFR
	LCDPTR   = IconTable[IconTab_indx_X3]|BIT7;
    // X4
	LCDDAT   = IconTable[IconTab_indx_X4+1];				// move the data to the LCD Data SFR
	LCDPTR   = IconTable[IconTab_indx_X4]|BIT7;
    // R
	LCDDAT   = IconTable[IconTab_indx_R+1];				// move the data to the LCD Data SFR
	LCDPTR   = IconTable[IconTab_indx_R]|BIT7;
    // H
	LCDDAT   = IconTable[IconTab_indx_H+1];				// move the data to the LCD Data SFR
	LCDPTR   = IconTable[IconTab_indx_H]|BIT7;

	LCDCONY &= ~(BIT0); 								// update finished
}
#endif

#ifdef __IAR_SYSTEMS_ICC__

void Disp_VrmsIcon(void)
#else
void Disp_VrmsIcon(void) reentrant
#endif
{

    if(lcd_buf[Disp_Icon_V_Addr]) {lcd_buf[Disp_Icon_V_Addr] |= (Disp_Icon_V|Disp_Icon_RMS);}
    else{lcd_buf[Disp_Icon_V_Addr] = (Disp_Icon_V|Disp_Icon_RMS);}

    if(lcd_buf[Disp_Icon_X1_Addr]) {lcd_buf[Disp_Icon_X1_Addr] |= Disp_Icon_X1;}
    else{lcd_buf[Disp_Icon_X1_Addr] = Disp_Icon_X1;}

}

#ifdef __IAR_SYSTEMS_ICC__

void Disp_IrmsIcon(void)
#else
void Disp_IrmsIcon(void) reentrant
#endif
{
    if(lcd_buf[Disp_Icon_I_Addr]) {lcd_buf[Disp_Icon_I_Addr] |= (Disp_Icon_I|Disp_Icon_RMS);}
    else{lcd_buf[Disp_Icon_I_Addr] = (Disp_Icon_I|Disp_Icon_RMS);}

    if(lcd_buf[Disp_Icon_X3_Addr]) {lcd_buf[Disp_Icon_X3_Addr] |= (Disp_Icon_X3|Disp_Icon_X4);}
    else{lcd_buf[Disp_Icon_X3_Addr] = (Disp_Icon_X3|Disp_Icon_X4);}
}

void Disp_Point(unsigned char position,unsigned char disp_dat)  //reentrant
{
    if(lcd_buf[position]){lcd_buf[position] |= disp_dat;}
    else{lcd_buf[position] = disp_dat;}
}

void Disp_HzIcon(void) //reentrant
{
    LCDCONY|=0x01; 									// start updating the data,freeze the data being displayed on the LCD while updating it.
	LCDDAT=DigitTable[16];
    LCDPTR=Digit6Addr|0x80;
    LCDDAT=DigitTable[17];
    LCDPTR=Digit7Addr|0x80;
    LCDCONY&=0x0FE; 								// update finished
}

void Disp_All(unsigned char dispdata)
{
	unsigned char i;

	for(i=0;i<0x0f;i++)
	{
		_Lcd_Write(i,dispdata);
	}
}

void Disp_Clear(void)
{
    LCDCON |= LCDRST;
    delay(10);
    LCDCON &= ~LCDRST;
    #if 0
	unsigned char i;

	for(i=0;i<0x0f;i++)
	{
		_Lcd_Write(i,0x00);
	}
	#endif
}

void _Lcd_All_On(void)
{
	unsigned char i;

	for(i=0;i<0x0f;i++)
	{
		_Lcd_Write(i,0xff);
	}
}
/*************************************************
 * 显示日期、时间数据
 *************************************************/

/*************************************************
 * 显示日期、时间
 *************************************************/
void _DisplayDate(void)
{
/*
    LCDCONY |= (BIT0);

    LCDDAT   = (Systime.Date.Year/10);// Hex2BCD
    LCDPTR   = Digit2Addr;

    LCDDAT   = (Systime.Date.Year%10);// Hex2BCD
    LCDPTR   = Digit3Addr;

    LCDDAT   = (Systime.Date.Month/10);// Hex2BCD
    LCDPTR   = Digit4Addr;

    LCDDAT   = (Systime.Date.Month%10);// Hex2BCD
    LCDPTR   = Digit5Addr;

    LCDDAT   = (Systime.Date.Day/10);// Hex2BCD
    LCDPTR   = Digit6Addr;

    LCDDAT   = (Systime.Date.Day%10);// Hex2BCD
    LCDPTR   = Digit7Addr;

    // Display P1,P3,P2,P5
    LCDDAT   = PointsTable[PointsTabIndx_P1+1];
    LCDPTR   = PointsTable[PointsTabIndx_P1];
    LCDDAT   = PointsTable[PointsTabIndx_P2+1];
    LCDPTR   = PointsTable[PointsTabIndx_P2];
    LCDDAT   = PointsTable[PointsTabIndx_P3+1];
    LCDPTR   = PointsTable[PointsTabIndx_P3];
    LCDDAT   = PointsTable[PointsTabIndx_P5+1];
    LCDPTR   = PointsTable[PointsTabIndx_P5];

    LCDCONY &= ~(BIT0);
*/
}

void _DisplayTime(void)
{
	// DigitTable[((*disp_ptr)>>4)&0x0F];
    //lcd_buf[0] = DigitTable[(Hex2BcdChar(tmp[3])>>4)&0x0F];
    lcd_buf[1] = DigitTable[(Hex2BcdChar(HOUR)>>4)&0x0F];
    lcd_buf[2] = DigitTable[(Hex2BcdChar(HOUR))&0x0F];
    lcd_buf[3] = DigitTable[(Hex2BcdChar(MIN)>>4)&0x0F];
    lcd_buf[4] = DigitTable[(Hex2BcdChar(MIN))&0x0F];
    lcd_buf[5] = DigitTable[(Hex2BcdChar(SEC)>>4)&0x0F];
    lcd_buf[6] = DigitTable[(Hex2BcdChar(SEC))&0x0F];
    lcd_buf[9] = 0x5B;              //ID '5'

    // exchage to xx xx xx.xxV
    //__Disp_Digits(tmp);

    // Display P1,P3,P2,P5
    Disp_Point(Disp_P5_Addr,Disp_P5);
    Disp_Point(Disp_P3_Addr,Disp_P3);
    Disp_Point(Disp_P2_Addr,Disp_P2);
    Disp_Point(Disp_P1_Addr,Disp_P1);
    _Lcd_WScreen(lcd_buf);
}
#if 0
void DisplayDateTime(void) @ "USERCODE"
{
    //unsigned char item;

    if(!(LcdDispFlag&LCD_DISP_FLG_PAGEDOWN))
    {
        if(!(LcdDispFlag&LCD_DISP_TIME))
        {
            LcdDispFlag|=LCD_DISP_TIME;
            LcdDispFlag&=~(LCD_DISP_NEXT);
        }
    }

    if(LcdDispFlag&LCD_DISP_NEXT)
    {
        //pwr_attr=(unsigned char)GetPowerAttribute();
        //LCDMEM[LCD_ADDRESS_OF_ZHENGFAN_XIANG]|=textinfo_zf_xiang[pwr_attr>>2];
        //DISP_CN_EXES(unsigned char(item%5));
        // 费率
        //item=PowerAttribute&0x03;
        //LCDMEM[_LcdCnExes[item][0]]|=_LcdCnExes[item][1];
        // 电流方向
        //LCDMEM[]|=;
        DisplayDateTimeData(&SystemTime[SPACE_OF_SECOND]);
        DISP_CN_TIME();
    }
    else
    {
        DisplayDateTimeData(&SystemTime[SPACE_OF_DAY]);
        DISP_CN_DATE();
    }
}

void DisplayWeek(void) @ "USERCODE"
{
    unsigned char temp;

    LCDMEM[LCD_CN_INFO_ADDR_WEEK]|=LCD_CN_INFO_WEEK;
    temp=SystemTime[SPACE_OF_WEEKDAY];
    if(temp==0)
    {
        temp=7;
    }
    else if(temp>7)
    {
        temp=1;
    }
    LargeLedDisplay1Bcd(temp);

⌨️ 快捷键说明

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