📄 emeter-basic-display.c
字号:
//--------------------------------------------------------------------------
//
// Software for MSP430 based e-meters.
//
// You may not use the Program in non-TI devices.
//
// File: basic_display.c
//
// Steve Underwood <steve-underwood@ti.com>
// Texas Instruments Hong Kong Ltd.
//
// $Id: emeter-basic-display.c,v 1.16 2005/11/17 09:25:23 a0754793 Exp $
//
/*! \file emeter-structs.h */
//
//--------------------------------------------------------------------------
//
// MSP430 simple LCD display routines for e-meters
//
#include <stdint.h>
#include <stdlib.h>
#include <io.h>
#include <emeter-toolkit.h>
#include "emeter.h"
#include "emeter-structs.h"
#if defined(MULTI_RATE_SUPPORT)
#include "emeter-multirate.h"
#endif
#if defined(__MSP430__) && CUSTOM_LCD_SUPPORT
#include <lcd-segments.h>
/* Define hex digits and the minus sign to match the allocation of segments we are using. */
const lcd_cell_t lcd_digit_table[] =
{
CHAR_0,
CHAR_1,
CHAR_2,
CHAR_3,
CHAR_4,
CHAR_5,
CHAR_6,
CHAR_7,
CHAR_8,
CHAR_9,
CHAR_A,
CHAR_B,
CHAR_C,
CHAR_D,
CHAR_E,
CHAR_F
};
const lcd_cell_t char_minus = CHAR_MINUS;
const int lcd_cells = LCD_CELLS;
const int lcd_pos_base = LCD_POS_BASE;
const int lcd_pos_step = LCD_POS_STEP;
#endif
#if defined(MULTI_RATE_SUPPORT)
uint8_t info_step;
uint8_t info_substep;
#endif
#if defined(__MSP430__) && defined(BASIC_LCD_SUPPORT)
#include <lcd-segments.h>
/* Define hex digits and the minus sign to match the allocation of segments we are using. */
const lcd_cell_t lcd_digit_table[] =
{
CHAR_0,
CHAR_1,
CHAR_2,
CHAR_3,
CHAR_4,
CHAR_5,
CHAR_6,
CHAR_7,
CHAR_8,
CHAR_9,
CHAR_A,
CHAR_B,
CHAR_C,
CHAR_D,
CHAR_E,
CHAR_F
};
#if defined(USE_STARBURST)
const lcd_cell_t lcd_alpha_table[] =
{
CHAR_A,
CHAR_B,
CHAR_C,
CHAR_D,
CHAR_E,
CHAR_F,
CHAR_G,
CHAR_H,
CHAR_I,
CHAR_J,
CHAR_K,
CHAR_L,
CHAR_M,
CHAR_N,
CHAR_O,
CHAR_P,
CHAR_Q,
CHAR_R,
CHAR_S,
CHAR_T,
CHAR_U,
CHAR_V,
CHAR_W,
CHAR_X,
CHAR_Y,
CHAR_Z
};
#endif
#if defined(ASCII_LCD)
static const lcd_cell_t lcd_ascii_table[] =
{
CHAR_SPACE,
CHAR_SPACE, //exclamation
CHAR_DOUBLEQUOTE,
CHAR_SPACE, //hash
CHAR_DOLLAR,
CHAR_SPACE, //percent
CHAR_SPACE, //ampersand
CHAR_QUOTE,
CHAR_LEFTBRACKET,
CHAR_RIGHTBRACKET,
CHAR_ASTERISK,
CHAR_PLUS,
CHAR_SPACE, //comma
CHAR_MINUS,
CHAR_SPACE, //full stop
CHAR_SLASH,
CHAR_0,
CHAR_1,
CHAR_2,
CHAR_3,
CHAR_4,
CHAR_5,
CHAR_6,
CHAR_7,
CHAR_8,
CHAR_9,
CHAR_SPACE, //colon
CHAR_SPACE, //semi-colon
CHAR_LT,
CHAR_EQUALS,
CHAR_GT,
CHAR_QUESTION,
CHAR_SPACE, //at sign
CHAR_A,
CHAR_B,
CHAR_C,
CHAR_D,
CHAR_E,
CHAR_F,
CHAR_G,
CHAR_H,
CHAR_I,
CHAR_J,
CHAR_K,
CHAR_L,
CHAR_M,
CHAR_N,
CHAR_O,
CHAR_P,
CHAR_Q,
CHAR_R,
CHAR_S,
CHAR_T,
CHAR_U,
CHAR_V,
CHAR_W,
CHAR_X,
CHAR_Y,
CHAR_Z,
CHAR_LEFTBRACKET,
CHAR_BACKSLASH,
CHAR_RIGHTBRACKET,
CHAR_CARET,
CHAR_UNDERSCORE,
CHAR_BACKQUOTE,
CHAR_a,
CHAR_b,
CHAR_C,
CHAR_d,
CHAR_e,
CHAR_f,
CHAR_g,
CHAR_h,
CHAR_i,
CHAR_j,
CHAR_k,
CHAR_l,
CHAR_m,
CHAR_n,
CHAR_o,
CHAR_p,
CHAR_q,
CHAR_r,
CHAR_s,
CHAR_t,
CHAR_u,
CHAR_v,
CHAR_w,
CHAR_x,
CHAR_y,
CHAR_z,
CHAR_LEFTBRACKET,
CHAR_VERTICALBAR,
CHAR_RIGHTBRACKET,
CHAR_SPACE, //squiggle
CHAR_SPACE //delete
};
void lcd_text(char *s, int pos)
{
int x;
if (lcd_pos_step < 0)
pos = -pos;
if (abs(lcd_pos_step) > 1)
pos <<= 1;
pos = lcd_pos_base + pos;
while (*s)
{
x = lcd_ascii_table[*s++ - 0x20];
LCDMEM[pos] = x & 0xFF;
pos += (lcd_pos_step >> 1);
LCDMEM[pos] = x >> 8;
pos += (lcd_pos_step >> 1);
}
}
#endif
const lcd_cell_t char_minus = CHAR_MINUS;
const int lcd_cells = LCD_CELLS;
const int lcd_pos_base = LCD_POS_BASE;
const int lcd_pos_step = LCD_POS_STEP;
static const lcd_cell_t lcd_high[TEXT_MESSAGE_LENGTH] =
{
CHAR_H,
CHAR_i,
CHAR_g,
CHAR_h,
CHAR_SPACE,
CHAR_SPACE,
#if TEXT_MESSAGE_LENGTH == 7
CHAR_SPACE
#endif
};
static const lcd_cell_t lcd_startup[TEXT_MESSAGE_LENGTH] =
{
#if defined(USE_STARBURST)
CHAR_S,
CHAR_T,
CHAR_A,
CHAR_R,
CHAR_T,
CHAR_SPACE,
#else
CHAR_S,
CHAR_t,
CHAR_a,
CHAR_r,
CHAR_t,
CHAR_SPACE,
#if TEXT_MESSAGE_LENGTH == 7
CHAR_SPACE
#endif
#endif
};
static const lcd_cell_t lcd_no_power[TEXT_MESSAGE_LENGTH] =
{
CHAR_b,
CHAR_l,
CHAR_SPACE,
CHAR_o,
CHAR_u,
CHAR_t,
#if TEXT_MESSAGE_LENGTH == 7
CHAR_SPACE
#endif
};
static const lcd_cell_t lcd_4v2_power[TEXT_MESSAGE_LENGTH] =
{
CHAR_SPACE,
CHAR_SPACE,
CHAR_SPACE,
CHAR_4,
#if defined(USE_STARBURST)
CHAR_V,
#else
CHAR_U,
#endif
CHAR_2,
#if TEXT_MESSAGE_LENGTH == 7
CHAR_SPACE
#endif
};
static const lcd_cell_t lcd_normal_power[TEXT_MESSAGE_LENGTH] =
{
CHAR_SPACE,
CHAR_SPACE,
CHAR_SPACE,
CHAR_8,
#if defined(USE_STARBURST)
CHAR_V,
#else
CHAR_U,
#endif
CHAR_4,
#if TEXT_MESSAGE_LENGTH == 7
CHAR_SPACE
#endif
};
#if !defined(SINGLE_PHASE) && defined(ICON_PHASE_A) && defined(ICON_PHASE_B) && defined(ICON_PHASE_C)
static uint8_t phase_icons[NUM_PHASES] =
{
ICON_PHASE_A,
ICON_PHASE_B,
ICON_PHASE_C
};
#endif
#if defined(__MSP430__)
enum
{
#if defined(PER_PHASE_ENERGY_SUPPORT)
#if !defined(TWO_LINE_LCD)
DISPLAY_STAGE_PHASE_POWER,
#endif
DISPLAY_STAGE_PHASE_ENERGY,
#endif
#if defined(IRMS_SUPPORT) && defined(VRMS_SUPPORT) && defined(POWER_FACTOR_SUPPORT)
#if defined(REACTIVE_POWER_SUPPORT)
DISPLAY_STAGE_REACTIVE_POWER,
#endif
#if defined(VA_POWER_SUPPORT)
DISPLAY_STAGE_VA,
#endif
DISPLAY_STAGE_POWER_FACTOR,
#endif
#if defined(VRMS_SUPPORT)
DISPLAY_STAGE_VOLTAGE,
#endif
#if defined(IRMS_SUPPORT)
DISPLAY_STAGE_CURRENT,
#endif
#if defined(MAINS_FREQUENCY_SUPPORT)
DISPLAY_STAGE_MAINS_FREQUENCY,
#endif
#if !defined(SINGLE_PHASE)
DISPLAY_STAGE_PHASE_LAST,
#endif
#if !defined(SINGLE_PHASE) && defined(NEUTRAL_MONITOR_SUPPORT) && defined(IRMS_SUPPORT)
DISPLAY_STAGE_NEUTRAL_CURRENT,
#endif
#if defined(TOTAL_ENERGY_SUPPORT)
DISPLAY_STAGE_TOTAL_POWER,
#if !defined(TWO_LINE_LCD)
DISPLAY_STAGE_TOTAL_ENERGY,
#endif
#endif
#if defined(RTC_SUPPORT)
DISPLAY_STAGE_DATE,
#if !defined(DEDICATED_TIME_FIELD) && !defined(TWO_LINE_LCD)
DISPLAY_STAGE_TIME,
#endif
#endif
#if defined(TEMPERATURE_SUPPORTx)
DISPLAY_STAGE_TEMPERATURE,
#endif
#if defined(MULTI_RATE_SUPPORT)
DISPLAY_STAGE_CURRENT_TARIFF,
#endif
DISPLAY_STAGE_LAST
};
static int8_t display_stage;
#if !defined(SINGLE_PHASE)
static int8_t display_phase;
#endif
#if !defined(USE_STARBURST)
#define LCDcharsx LCDchars
#else
void LCDcharsx(const lcd_cell_t *s, int pos, int len)
{
if (lcd_pos_step < 0)
pos = -pos;
if (abs(lcd_pos_step) > 1)
pos <<= 1;
pos = lcd_pos_base + pos;
for ( ; len > 0; --len)
{
LCDMEM[pos] = *s & 0xFF;
pos += (lcd_pos_step >> 1);
LCDMEM[pos] = *s >> 8;
s++;
pos += (lcd_pos_step >> 1);
}
}
#endif
void display_clear_line_1(void)
{
int i;
for (i = FIRST_ROW_START; i < FIRST_ROW_START + FIRST_ROW_CHARS; i++)
LCDchar(CHAR_SPACE, i);
}
void display_clear_line_2(void)
{
int i;
for (i = SECOND_ROW_START; i < SECOND_ROW_START + SECOND_ROW_CHARS; i++)
LCDchar(CHAR_SPACE, i);
}
void display_power_fail_message(void)
{
LCDchar(CHAR_SPACE, 1);
LCDcharsx(lcd_no_power, FIRST_POSITION, TEXT_MESSAGE_LENGTH);
}
void display_startup_message(void)
{
LCDchar(CHAR_SPACE, 1);
LCDcharsx(lcd_startup, FIRST_POSITION, TEXT_MESSAGE_LENGTH);
}
void display_power_4v2_message(void)
{
LCDchar(CHAR_SPACE, 1);
LCDcharsx(lcd_4v2_power, FIRST_POSITION, TEXT_MESSAGE_LENGTH);
}
void display_power_normal_message(void)
{
LCDchar(CHAR_SPACE, 1);
LCDcharsx(lcd_normal_power, FIRST_POSITION, TEXT_MESSAGE_LENGTH);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -