📄 display.c
字号:
/*************************************
;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 + -