lcd.c
字号:
/********************************************************************************
* 杭州利尔达 *
* MSP430FE42X单相防窃电多功能电表平台 *
* ----- ESP SD16实现 *
* *
* *
* 说明:本软件为杭州利尔达单相防窃电多功能电表DEMO软件 *
* *
*********************************************************************************/
#include "msp430xe42x.h"
#include "globe.h"
#include "lcd.h"
#include "emeter_cfg.h"
#include "extern_function.h"
const uint8 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
};
/******************************************************************
* 清LCD显存 *
*******************************************************************/
void clr_lcd_display(void)
{
uint8 i;
for (i=0; i<12; i++)
{
LCDMEM[i] = 0;
}
}
/*******************************************************************
* 显示16位无符号整数 *
********************************************************************/
void display (uint16 value)
{
uint8 i;
int8 *LCD = LCDMEM;
for (i=0; i<5; i++)
{
LCD[7-i] = lcd_digit_table[value%10]; // remainder = character in table to display
value = value/10; // shifts right so next character can be displayed
}
}
/* 存放无符号数转换为BCD码的值 */
uint8 bcd[5];
/*******************************************************************
* 指定位置显示一个字符 *
* *
* 说明:ch为显示码值,pos为显示位置指示 *
********************************************************************/
void LCDchar(uint8 ch, int16 pos)
{
LCDMEM[pos] = ch;
}
/*******************************************************************
* 显示标志为 *
* *
* 说明:ch为标志对应的值,pos为标志位所在的位置,on指示亮或灭 *
********************************************************************/
void LCDmodify_char(uint8 ch, int16 pos, int16 on)
{
if (on)
LCDMEM[pos] |= ch;
else
LCDMEM[pos] &= ~ch;
}
/*******************************************************************
* 处理显示小数点 *
* *
* 说明:id指示小数点位置,on指示亮或灭 *
********************************************************************/
void LCDicon(int16 id, int16 on)
{
LCDmodify_char(SEG_h, id, on);
}
/*******************************************************************
* 显示32位值(包括小数点) *
* *
* 说明:value为32位,pos为开始位置,显示从pos+2开始 * *
* digits为显示的位数,after指示小树点的位数 *
********************************************************************/
void LCDudec32(uint32 value, int16 pos, int16 digits, int16 after)
{
int16 i;
int16 flag;
uint16 digit;
flag = 1;
LCDchar(CHAR_SPACE, pos++);
bin2bcd32(bcd, value);
after = digits - after;
//for (i = 10 - digits; i < 10; i++)
for (i=0; i<digits; i++)
{
digit = bcd[(i >> 1)+2];
if ((i & 1) == 0)
digit >>= 4;
if ((digit & 0x0F) || i >= after - 1)
flag = 0;
LCDchar((flag == 0) ? lcd_digit_table[digit & 0x0F] : CHAR_SPACE, (pos++ +1));
}
}
/*******************************************************************
* 显示16位值(包括小数点) *
* *
* 说明:value为16位,pos为开始位置,显示从pos+2开始 * *
* digits为显示的位数,after指示小树点的位数 *
********************************************************************/
void LCDudec16(uint16 value, int16 pos, int16 digits, int16 after)
{
int16 i;
int16 flag;
uint16 digit;
flag = 1; //default print space
LCDchar(CHAR_SPACE, pos++);
bin2bcd16(bcd, value);
after = digits - after;
while (digits > 6)
{
LCDchar(CHAR_SPACE, pos++);
digits--;
}
//for (i = 6 - digits; i < 6; i++) //start from BCD buffer
for (i=0; i<digits ; i++)
{
digit = bcd[i >> 1];
if ((i & 1) == 0)
digit >>= 4;
//fprint space until first non-zero number found
//or if zero number is after decimal point
if ((digit & 0x0F) || i >= after -1)
flag = 0;
LCDchar((flag == 0) ? lcd_digit_table[digit & 0x0F] : CHAR_SPACE, (pos++ +1));
}
}
/******************************************************************
* 更新时钟显示 *
*******************************************************************/
void update_rtc_display(void)
{
LCDchar(lcd_digit_table[(rtc.hour/10) & 0x0F], 2);
LCDchar(lcd_digit_table[(rtc.hour%10) & 0x0F], 3);
LCDchar(lcd_digit_table[(rtc.minute/10) & 0x0F], 4);
LCDchar(lcd_digit_table[(rtc.minute%10) & 0x0F], 5);
LCDchar(lcd_digit_table[(rtc.second/10) & 0x0F], 6);
LCDchar(lcd_digit_table[(rtc.second%10) & 0x0F], 7);
LCDMEM[2] |= BIT7;
LCDMEM[4] |= BIT7;
LCDMEM[9] = BIT5;
}
/******************************************************************
* 更新日期显示 *
*******************************************************************/
void update_date_display(void)
{
LCDchar(lcd_digit_table[(rtc.year/10) & 0x0F], 2);
LCDchar(lcd_digit_table[(rtc.year%10) & 0x0F], 3);
LCDchar(lcd_digit_table[(rtc.month/10) & 0x0F], 4);
LCDchar(lcd_digit_table[(rtc.month%10) & 0x0F], 5);
LCDchar(lcd_digit_table[(rtc.day/10) & 0x0F], 6);
LCDchar(lcd_digit_table[(rtc.day%10) & 0x0F], 7);
LCDMEM[2] |= BIT7;
LCDMEM[4] |= BIT7;
LCDMEM[9] = BIT4;
}
/******************************************************************
* 更新显示页面 *
*******************************************************************/
void update_display(void)
{
int skip_stage;
do
{
skip_stage = FALSE;
if(emeter.ucCalibrationMode != 0)
{
switch(emeter.ucCalibrationOption)
{
case 1: // GAINCORR1
emeter.uc_display_stage = DISPLAY_STAGE_TEST1;
break;
case 2: // POWEROFFSET1
emeter.uc_display_stage = DISPLAY_STAGE_TEST2;
break;
case 3: // PHASEOFFSET1
emeter.uc_display_stage = DISPLAY_STAGE_TEST3;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -