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

📄 display.c

📁 MSP430电能测量程序,用的是电力线载波通讯.即PLC
💻 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 + -