📄 display.c
字号:
/** \file
* ESP430CE1 Application Program Example
* Display Data
*
* This file displays the data on the LCD display
*
* \author Stefan Schauer
* \date 07/28/2003
*/
//====================================================================
#include "device.h"
#include "fet4xx_rtclcd.h"
#include "display.h"
#include "emeter.h"
#include "parameter.h"
#include "emeter-toolkit.h" //banner extern declaration
#include "UART0.h" //rx buffer size
#include <string.h>
#ifdef withDisplay
// ************************************************************
// Definitions & Declarations
// ************************************************************
const char * txt_idle = "IDLE";
const char * txt_display[]= {
"",
"OFF",
"TIME",
"DATE",
"VOLT",
"CURR",
"VPEAK",
"IPEAK",
"FREQ",
"COSPHI",
"TEMP",
"POWER",
"ENERGY",
"OFF",
};
unsigned char Display_Mode = display_startup;
unsigned char Display_Hold = 0;
int ModeSwitchDelay = 4;
char msgin[UART_RX_Buffer_Size];
// ************************************************************
// functions
// ************************************************************
void DisplayClear(void)
{
int i;
char *LCD = LCDMEM;
for (i=0; i<32; i++) // Clear the display
{
LCD[i] = 0;
}
}
void DisplayIDLE(void)
{
// LCDtext ((unsigned char *) txt_idle, 6, 6);
switch ((SEC) & 7)
{
case 0:
case 1:
case 2:
case 3:
Dis_Clock();
break;
// case 3:
// Dis_Date();
// break;
case 4:
case 5:
LCDtext ((unsigned char *) banner, 6, 6);
break;
case 6:
case 7:
LCDtext ((unsigned char *) "ASLEEP", 6, 6);
break;
}
}
void DisplayNextData(void)
{
if ( (Display_Mode >= display_clock) && (Display_Mode <= display_energy) )
{
if (ModeSwitchDelay-- <= 0)
{
ModeSwitchDelay = 4;
Display_Mode ++;
if (Display_Mode > display_energy)
{
Display_Mode = display_clock;
}
//LCDtext ((unsigned char *) txt_display[Display_Mode], 6, 6);
Display_Hold = 2;
}
}
}
void UpdateArrow(int x)
{
const int arrow_table[8] = {0,2,6,14,15,13,9,1};
static int xold;
static int pos = 0;
if (x != xold) // Every time argument changes, rotate the arrow one spot
{
pos++;
xold = x;
}
LCDM16 = (LCDM16 & 0xF0) | arrow_table[pos & 7];
}
void DisplayData(void)
{
int svalue;
unsigned int value;
unsigned long lvalue;
float fvalue;
unsigned long activeEnergy;
if (Display_Mode >= 1)
LCDM1 = (unsigned char) * ((unsigned char*)(TLCD_Tab + Display_Mode));
if (Display_Hold > 0)
{
Display_Hold--;
LCDtext ((unsigned char *) txt_display[Display_Mode], 6, 6);
}
else
{
activeEnergy = (unsigned long)((float) total_energy * (float)(s_parameters.EnergyRatio)/((float)1000000*(float)3600));
switch (Display_Mode)
{
case display_startup:
{
//LPM0;
static unsigned char i = LCD_SIZE-2;
if (i < LCD_SIZE)
{ LCDtext ((unsigned char *) &banner[0], i + 1, LCD_SIZE); }
else
{ LCDtext ((unsigned char *) &banner[i +1 -LCD_SIZE], LCD_SIZE, LCD_SIZE); }
i++;
if (i > (sbanner + 0))
{
Display_Mode = display_clock; // Switch to clock mode
LCDtext ((unsigned char *) " ", LCD_SIZE, LCD_SIZE); // Clear the display
LCDM16 = 0;
DisplayNextData();
}
}
break;
case display_off: break;
case display_clock:
Dis_Clock();
break;
case display_date:
Dis_Date();
break;
case display_volt:
#ifdef __CROSSWORKS__
lvalue = ((unsigned long) (V1RMS) * (s_parameters.VRatio*1000))/1000;
#else
lvalue = ((unsigned long) ((V1RMS) * (s_parameters.VRatio*1000))/1000);
#endif
LCDdecu32(lvalue, 7, 7, 3);
break;
case display_current:
lvalue = ((unsigned long) (IRMS_HI * s_parameters.IRatio*1000))/1000;
LCDdecu32(lvalue, 7, 7, 3);
break;
case display_vpeak:
#ifdef __CROSSWORKS__
lvalue = ((unsigned long) (VPEAK) * (s_parameters.VRatio*1000))/1000;
#else
lvalue = ((unsigned long) ((VPEAK) * (s_parameters.VRatio*1000))/1000);
#endif
LCDdecu32(lvalue, 7, 7, 3);
break;
case display_ipeak:
lvalue = ((unsigned long) (IPEAK * s_parameters.IRatio*1000))/1000;
LCDdecu32(lvalue, 7, 7, 3);
break;
case display_freq:
// lvalue = (unsigned long)((float)((long)1000*(long)256*(long)4096))/((float)savedRET[22]);
lvalue = (unsigned long)((float)((long)1000*(long)256*(long)4096))/((float)MAINSPERIOD);
LCDdecu32(lvalue, 7, 7, 3);
break;
case display_cosphi:
value = (unsigned int)((((unsigned long)POWERFCT*1000)/POW_2_14));
((signed char)CAPIND < 0) ? (svalue = -(signed int)value) : (svalue = value);
LCDdec16(svalue, 5, 7, 3);
break;
/* case display_ch1:
LCDdecu16(wfs1, 5, 7, 0);
break;
case display_ch2:
LCDdecu16(wfs2, 5, 7, 0);
break;
case display_ch3:
LCDdecu16(wfs3, 5, 7, 0);
break; */
case display_temp:
lvalue = (unsigned long) (((unsigned long)temperature * (s_parameters.ulTempGain))/100 - (s_parameters.ulTempOffset));
LCDdecu32(lvalue, 5, 7, 2); // Temperature (degree)
break;
case display_power:
fvalue = ((float) energy.l * (float)(s_parameters.EnergyRatio)/(1000000));
// if (fvalue <= 1000)
// {
// lvalue = (unsigned long)(fvalue*1000);
// LCDdecu32(lvalue, 7, 7, 6); // Active Power (kW);
// }
// else
// {
lvalue = (unsigned long)fvalue;
LCDdecu32(lvalue, 7, 7, 3); // Active Power (kW);
// }
break;
case display_energy:
//lvalue = (unsigned long)((float) total_energy * (float)(s_parameters.EnergieRatio)/((float)1000000*(float)3600));
lvalue = activeEnergy;
LCDdecu32(lvalue, 7, 7, 3); // Active Energy1 (kWh):
break;
case display_msgin:
{
static unsigned char i = LCD_SIZE-1;
if (i < LCD_SIZE)
{ LCDtext ((unsigned char *) &msgin[0], i + 1, LCD_SIZE); }
else
{ LCDtext ((unsigned char *) &msgin[i + 1 - LCD_SIZE], LCD_SIZE, LCD_SIZE); }
i++;
if (i >= strlen(msgin)) i = LCD_SIZE-1;
}
break;
case display_calib:
LCDtext ((unsigned char *) "CALIB", 6, 6);
LCDM16 ^= 0xF0; // Blink all unused segments of LCD
break;
case display_last:
default:
Display_Mode = display_off;
SetupLCD();
break;
}
if (Display_Mode > 1)
UpdateArrow(activeEnergy);
//UpdateArrow(SEC);
}
}
#if LCD_TEST_PATTERN >= 1
void DisplayTest(void)
{
int i;
int j;
int k;
char *LCD = LCDMEM;
IE2 &= ~BTIE; // HEM disable Basic Timer Interrupt
// clear LCD memory to clear display //
for (i=0; i<32; i++)
{
LCD[i] = 0;
}
// Turn on all the LCD segments //
for (i=0; i<32; i++)
{
for (j=0; j<15; j++)
{
LCD[i] |= 1<<j;
for (k=0; k<1000; k++) { _NOP(); }
}
}
for (k=0; k<30000; k++) // Wait a little
{
_NOP();
}
for (i=0; i<32; i++) // Clear the display
{
LCD[i] = 0;
}
#if LCD_TEST_PATTERN >= 2
for (i=' '; i<'a'; i++) // Ripple through all the characters in the LCD table
{
for (j=6; j>0; j-- )
{
Char2LCD(i,j);
}
for (k=0; k<30000; k++) { _NOP(); _NOP(); }
}
for (i=0; i<32; i++) // Clear the display
{
LCD[i] = 0;
}
#endif // LCD_TEST_PATTERN >=2
}
#endif // LCD_TEST_PATTERN >=1
#endif // withDisplay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -