574 lines
17 KiB
C
574 lines
17 KiB
C
#include "includes.h"
|
||
#include <lcd.h>
|
||
|
||
// 是否自检屏状态
|
||
u8 self_check_state = 0;
|
||
|
||
// 显示缓冲区
|
||
TVideoBuf VideoBuf = {0};
|
||
TVideoBuf Last_VideoBuf = {0};
|
||
|
||
// 定义7段字库编码
|
||
// |-A-|
|
||
// F B
|
||
// |-G-|
|
||
// E C
|
||
// |-D-|
|
||
|
||
typedef struct
|
||
{
|
||
unsigned A : 1;
|
||
unsigned B : 1;
|
||
unsigned C : 1;
|
||
unsigned D : 1;
|
||
unsigned E : 1;
|
||
unsigned F : 1;
|
||
unsigned G : 1;
|
||
unsigned : 1;
|
||
} TChar;
|
||
|
||
// 字库,不带小数点或单位
|
||
const TChar CLib[] =
|
||
{
|
||
{0, 0, 0, 0, 0, 0, 0}, // ' '
|
||
{0, 0, 0, 0, 0, 0, 1}, // '-'
|
||
{0, 1, 1, 0, 0, 0, 1}, // '+' = '-|'
|
||
{1, 1, 1, 0, 1, 1, 1}, // 'A'
|
||
{0, 0, 1, 1, 1, 1, 1}, // 'b'
|
||
{0, 0, 0, 1, 1, 0, 1}, // 'c'
|
||
{0, 1, 1, 1, 1, 0, 1}, // 'd'
|
||
{1, 0, 0, 1, 1, 1, 1}, // 'E'
|
||
{1, 0, 0, 0, 1, 1, 1}, // 'F'
|
||
{1, 0, 1, 1, 1, 1, 0}, // 'G'
|
||
{0, 0, 1, 0, 1, 1, 1}, // 'h'
|
||
{0, 0, 0, 0, 1, 1, 0}, // 'I'
|
||
{0, 1, 1, 1, 0, 0, 0}, // 'J'
|
||
{0, 0, 0, 1, 0, 0, 0}, // 'K' = '_'
|
||
{0, 0, 0, 1, 1, 1, 0}, // 'L'
|
||
{0, 0, 0, 1, 0, 0, 0}, // 'M' = '_'
|
||
{0, 0, 1, 0, 1, 0, 1}, // 'n'
|
||
{0, 0, 1, 1, 1, 0, 1}, // 'o'
|
||
{1, 1, 0, 0, 1, 1, 1}, // 'P'
|
||
{1, 1, 1, 0, 0, 1, 1}, // 'q'
|
||
{0, 0, 0, 0, 1, 0, 1}, // 'r'
|
||
{1, 0, 1, 1, 0, 1, 1}, // 'S'
|
||
{0, 0, 1, 0, 0, 0, 1}, // 't'
|
||
{0, 1, 1, 1, 1, 1, 0}, // 'U'
|
||
{0, 1, 0, 0, 1, 1, 1}, // 'V'
|
||
{0, 0, 0, 1, 0, 0, 0}, // 'W' = '_'
|
||
{0, 0, 0, 1, 0, 0, 0}, // 'X' = '_'
|
||
{0, 1, 1, 1, 0, 1, 1}, // 'y'
|
||
{0, 0, 0, 1, 0, 0, 0}, // 'Z' = '_'
|
||
|
||
{1, 1, 1, 1, 1, 1, 0}, // '0'
|
||
{0, 1, 1, 0, 0, 0, 0}, // '1'
|
||
{1, 1, 0, 1, 1, 0, 1}, // '2'
|
||
{1, 1, 1, 1, 0, 0, 1}, // '3'
|
||
{0, 1, 1, 0, 0, 1, 1}, // '4'
|
||
{1, 0, 1, 1, 0, 1, 1}, // '5'
|
||
{1, 0, 1, 1, 1, 1, 1}, // '6'
|
||
{1, 1, 1, 0, 0, 0, 0}, // '7'
|
||
{1, 1, 1, 1, 1, 1, 1}, // '8'
|
||
{1, 1, 1, 1, 0, 1, 1}, // '9'
|
||
};
|
||
|
||
// 字符在字库中的编码
|
||
typedef enum
|
||
{CODE_SPACE, CODE_MINUS, CODE_PLUS,
|
||
CODE_A, CODE_B, CODE_C, CODE_D, CODE_E, CODE_F, CODE_G,
|
||
CODE_H, CODE_I, CODE_J, CODE_K, CODE_L, CODE_M, CODE_N,
|
||
CODE_O, CODE_P, CODE_Q, CODE_R, CODE_S, CODE_T,
|
||
CODE_U, CODE_V, CODE_W, CODE_X, CODE_Y, CODE_Z,
|
||
CODE_0, CODE_1, CODE_2, CODE_3, CODE_4, CODE_5, CODE_6, CODE_7, CODE_8, CODE_9}
|
||
TCode;
|
||
|
||
TCode HT1621_Char2Code(char c)
|
||
{
|
||
if(c >= '0' && c <= '9')
|
||
return CODE_0 + (c - '0');
|
||
|
||
if(c >= 'a' && c <= 'z')
|
||
return CODE_A + (c - 'a');
|
||
|
||
if(c >= 'A' && c <= 'Z')
|
||
return CODE_A + (c - 'A');
|
||
|
||
if(c == '-')
|
||
return CODE_MINUS;
|
||
|
||
if(c == '+')
|
||
return CODE_PLUS;
|
||
|
||
return CODE_SPACE;
|
||
}
|
||
|
||
// pin_no: 1~32
|
||
// com_no: 1~4
|
||
void HT1621_WriteBuf(u16 pin_com, u8 bit_val)
|
||
{
|
||
u8 byte_index, bit_index;
|
||
u8 pin_no = pin_com / 10;
|
||
u8 com_no = pin_com % 10;
|
||
|
||
if(pin_no < 1 || pin_no > 32)
|
||
return;
|
||
if(com_no < 1 || com_no > 4)
|
||
return;
|
||
|
||
byte_index = (pin_no - 1) / 2;
|
||
bit_index = com_no - 1; // COM4高位,COM1低位
|
||
if((pin_no - 1) % 2)
|
||
bit_index += 4; // 奇数pin高4位,偶数pin低4位
|
||
if(bit_val)
|
||
VideoBuf.buf[byte_index] |= (1 << bit_index);
|
||
else
|
||
VideoBuf.buf[byte_index] &= ~(1 << bit_index);
|
||
}
|
||
|
||
// 写一个七段码字符
|
||
// pin_comA = (A段的pin_no) * 10 + (A段的com_no)
|
||
void HT1621_WriteChar(char c, u16 pin_comA, u16 pin_comB, u16 pin_comC, u16 pin_comD, u16 pin_comE, u16 pin_comF, u16 pin_comG)
|
||
{
|
||
TCode code = HT1621_Char2Code(c);
|
||
|
||
HT1621_WriteBuf(pin_comA, CLib[code].A);
|
||
HT1621_WriteBuf(pin_comB, CLib[code].B);
|
||
HT1621_WriteBuf(pin_comC, CLib[code].C);
|
||
HT1621_WriteBuf(pin_comD, CLib[code].D);
|
||
HT1621_WriteBuf(pin_comE, CLib[code].E);
|
||
HT1621_WriteBuf(pin_comF, CLib[code].F);
|
||
HT1621_WriteBuf(pin_comG, CLib[code].G);
|
||
}
|
||
|
||
// 写一个七段码数据
|
||
// pin_comA = (A段的pin_no) * 10 + (A段的com_no)
|
||
void HT1621_Write7Seg(u8 val, u16 pin_comA, u16 pin_comB, u16 pin_comC, u16 pin_comD, u16 pin_comE, u16 pin_comF, u16 pin_comG)
|
||
{
|
||
HT1621_WriteBuf(pin_comA, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comB, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comC, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comD, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comE, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comF, val & 1);
|
||
val >>= 1;
|
||
HT1621_WriteBuf(pin_comG, val & 1);
|
||
}
|
||
|
||
u8 HT1621_Pin2Seg(u8 pin)
|
||
{
|
||
// LCD pin 1~12 对应 seg 0~11
|
||
if(pin >= 1 && pin <= 12)
|
||
return pin - 1;
|
||
|
||
// LCD pin 13~18 对应 seg 14~19
|
||
if(pin >= 13 && pin <= 18)
|
||
return pin + 1;
|
||
|
||
// LCD pin 19~32 对应 seg 22~35
|
||
return pin + 3;
|
||
}
|
||
|
||
// 刷新整个显示屏内容
|
||
void HT1621_Refresh()
|
||
{
|
||
__IO uint32_t *memPtrs = &LCD->MEM_0;
|
||
u8 pin = 1;
|
||
u8 i, seg, memnum, seg_shift;
|
||
|
||
// 比较显示内容和标志位,如无改变则不操作
|
||
if(memcmp(&VideoBuf, &Last_VideoBuf, sizeof(VideoBuf)) == 0)
|
||
return;
|
||
|
||
// 保存显示内容和标志位
|
||
Last_VideoBuf = VideoBuf;
|
||
|
||
// 处理闪烁,根据标志位临时改变显示内容
|
||
if(!self_check_state && !VideoBuf.blink_visible)
|
||
{
|
||
// 隐藏数字(显示界面)
|
||
if(VideoBuf.h2press_blink) // 氢压力
|
||
{
|
||
Disp_H2PressText(" ");
|
||
Disp_H2PressPointOff();
|
||
}
|
||
if(VideoBuf.temp_blink) // 温度
|
||
{
|
||
Disp_TempText(" ");
|
||
Disp_TempPointOff();
|
||
}
|
||
if(VideoBuf.pres_blink) // 压力
|
||
{
|
||
Disp_PresText(" ");
|
||
Disp_PresPointOff();
|
||
}
|
||
if(VideoBuf.vacu_blink) // 真空
|
||
{
|
||
Disp_VacuText(" ");
|
||
Disp_TempPointOff();
|
||
}
|
||
if(VideoBuf.battery_blink) // 电池
|
||
Disp_WriteBattery(0);
|
||
|
||
// 光标闪烁(配置界面)
|
||
for(i = 0; i < VideoBuf.cursor_width; i++)
|
||
Disp_DispChar(VideoBuf.cursor_pos + i, ' ');
|
||
}
|
||
|
||
for(i = 0; i < sizeof(VideoBuf.buf); i++)
|
||
{
|
||
seg = HT1621_Pin2Seg(pin++);
|
||
memnum = seg / 4;
|
||
seg_shift = (seg % 4) * 8;
|
||
memPtrs[memnum] &= ~(0xFFul << seg_shift);
|
||
memPtrs[memnum] |= (((uint32_t) (VideoBuf.buf[i] & 0x0F)) << seg_shift);
|
||
|
||
seg = HT1621_Pin2Seg(pin++);
|
||
memnum = seg / 4;
|
||
seg_shift = (seg % 4) * 8;
|
||
memPtrs[memnum] &= ~(0xFFul << seg_shift);
|
||
memPtrs[memnum] |= (((uint32_t) (VideoBuf.buf[i] >> 4)) << seg_shift);
|
||
}
|
||
|
||
// 恢复显示内容和标志位
|
||
VideoBuf = Last_VideoBuf;
|
||
}
|
||
|
||
// 整个屏幕全熄灭
|
||
void HT1621_AllOff()
|
||
{
|
||
self_check_state = 1;
|
||
memset(VideoBuf.buf, 0x00, sizeof(VideoBuf.buf)); // 不影响最后的状态
|
||
HT1621_Refresh();
|
||
self_check_state = 0;
|
||
}
|
||
|
||
// 整个屏幕全点亮
|
||
void HT1621_AllOn()
|
||
{
|
||
self_check_state = 1;
|
||
memset(VideoBuf.buf, 0xFF, sizeof(VideoBuf.buf)); // 不影响最后的状态
|
||
HT1621_Refresh();
|
||
self_check_state = 0;
|
||
}
|
||
|
||
void LCD_Init()
|
||
{
|
||
/* Enable IP clock */
|
||
CLK->APBCLK |= CLK_APBCLK_LCD_EN;
|
||
|
||
/*---------------------------------------------------------------------------------------------------------*/
|
||
/* Init LCD I/O Multi-function */
|
||
/*---------------------------------------------------------------------------------------------------------*/
|
||
/* Set PD.4 multi-function pins for SEG35 */
|
||
SYS->PD_L_MFP &= ~SYS_PD_L_MFP_PD4_MFP_Msk;
|
||
SYS->PD_L_MFP |= SYS_PD_L_MFP_PD4_MFP_LCD_S35;
|
||
|
||
/* Set PD.5 multi-function pins for SEG34 */
|
||
SYS->PD_L_MFP &= ~SYS_PD_L_MFP_PD5_MFP_Msk;
|
||
SYS->PD_L_MFP |= SYS_PD_L_MFP_PD5_MFP_LCD_S34;
|
||
|
||
/* Set PC.15 multi-function pins for SEG33 */
|
||
SYS->PC_H_MFP &= ~SYS_PC_H_MFP_PC15_MFP_Msk;
|
||
SYS->PC_H_MFP |= SYS_PC_H_MFP_PC15_MFP_LCD_S33;
|
||
|
||
/* Set PC.14 multi-function pins for SEG32 */
|
||
SYS->PC_H_MFP &= ~SYS_PC_H_MFP_PC14_MFP_Msk;
|
||
SYS->PC_H_MFP |= SYS_PC_H_MFP_PC14_MFP_LCD_S32;
|
||
|
||
/* Set PB.15 multi-function pins for SEG31 */
|
||
SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB15_MFP_Msk;
|
||
SYS->PB_H_MFP |= SYS_PB_H_MFP_PB15_MFP_LCD_S31;
|
||
|
||
/* Set PB.8 multi-function pins for SEG30 */
|
||
SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB8_MFP_Msk;
|
||
SYS->PB_H_MFP |= SYS_PB_H_MFP_PB8_MFP_LCD_S30;
|
||
|
||
/* Set PE.15 multi-function pins for SEG29 */
|
||
SYS->PE_H_MFP &= ~SYS_PE_H_MFP_PE15_MFP_Msk;
|
||
SYS->PE_H_MFP |= SYS_PE_H_MFP_PE15_MFP_LCD_S29;
|
||
|
||
/* Set PE.14 multi-function pins for SEG28 */
|
||
SYS->PE_H_MFP &= ~SYS_PE_H_MFP_PE14_MFP_Msk;
|
||
SYS->PE_H_MFP |= SYS_PE_H_MFP_PE14_MFP_LCD_S28;
|
||
|
||
/* Set PE.13 multi-function pins for SEG27 */
|
||
SYS->PE_H_MFP &= ~SYS_PE_H_MFP_PE13_MFP_Msk;
|
||
SYS->PE_H_MFP |= SYS_PE_H_MFP_PE13_MFP_LCD_S27;
|
||
|
||
/* Set PB.14 multi-function pins for SEG26 */
|
||
SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB14_MFP_Msk;
|
||
SYS->PB_H_MFP |= SYS_PB_H_MFP_PB14_MFP_LCD_S26;
|
||
|
||
/* Set PB.13 multi-function pins for SEG25 */
|
||
SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB13_MFP_Msk;
|
||
SYS->PB_H_MFP |= SYS_PB_H_MFP_PB13_MFP_LCD_S25;
|
||
|
||
/* Set PB.12 multi-function pins for SEG24 */
|
||
SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB12_MFP_Msk;
|
||
SYS->PB_H_MFP |= SYS_PB_H_MFP_PB12_MFP_LCD_S24;
|
||
|
||
/* Set PA.11 multi-function pins for SEG23 */
|
||
SYS->PA_H_MFP &= ~SYS_PA_H_MFP_PA11_MFP_Msk;
|
||
SYS->PA_H_MFP |= SYS_PA_H_MFP_PA11_MFP_LCD_S23;
|
||
|
||
/* Set PA.10 multi-function pins for SEG22 */
|
||
SYS->PA_H_MFP &= ~SYS_PA_H_MFP_PA10_MFP_Msk;
|
||
SYS->PA_H_MFP |= SYS_PA_H_MFP_PA10_MFP_LCD_S22;
|
||
|
||
/* Set PD.8 multi-function pins for SEG19 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD8_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD8_MFP_LCD_S19;
|
||
|
||
/* Set PD.9 multi-function pins for SEG18 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD9_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD9_MFP_LCD_S18;
|
||
|
||
/* Set PD.10 multi-function pins for SEG17 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD10_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD10_MFP_LCD_S17;
|
||
|
||
/* Set PD.11 multi-function pins for SEG16 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD11_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD11_MFP_LCD_S16;
|
||
|
||
/* Set PD.12 multi-function pins for SEG15 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD12_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD12_MFP_LCD_S15;
|
||
|
||
/* Set PD.13 multi-function pins for SEG14 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD13_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD13_MFP_LCD_S14;
|
||
|
||
/* Set PB.6 multi-function pins for SEG11 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB6_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB6_MFP_LCD_S11;
|
||
|
||
/* Set PB.7 multi-function pins for SEG10 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB7_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB7_MFP_LCD_S10;
|
||
|
||
/* Set PE.8 multi-function pins for SEG9 */
|
||
SYS->PE_H_MFP &= ~SYS_PE_H_MFP_PE8_MFP_Msk;
|
||
SYS->PE_H_MFP |= SYS_PE_H_MFP_PE8_MFP_LCD_S9;
|
||
|
||
/* Set PE.7 multi-function pins for SEG8 */
|
||
SYS->PE_L_MFP &= ~SYS_PE_L_MFP_PE7_MFP_Msk;
|
||
SYS->PE_L_MFP |= SYS_PE_L_MFP_PE7_MFP_LCD_S8;
|
||
|
||
/* Set PB.0 multi-function pins for SEG7 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB0_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB0_MFP_LCD_S7;
|
||
|
||
/* Set PB.1 multi-function pins for SEG6 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB1_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB1_MFP_LCD_S6;
|
||
|
||
/* Set PB.2 multi-function pins for SEG5 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB2_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB2_MFP_LCD_S5;
|
||
|
||
/* Set PB.3 multi-function pins for SEG4 */
|
||
SYS->PB_L_MFP &= ~SYS_PB_L_MFP_PB3_MFP_Msk;
|
||
SYS->PB_L_MFP |= SYS_PB_L_MFP_PB3_MFP_LCD_S4;
|
||
|
||
/* Set PD.6 multi-function pins for SEG3 */
|
||
SYS->PD_L_MFP &= ~SYS_PD_L_MFP_PD6_MFP_Msk;
|
||
SYS->PD_L_MFP |= SYS_PD_L_MFP_PD6_MFP_LCD_S3;
|
||
|
||
/* Set PD.7 multi-function pins for SEG2 */
|
||
SYS->PD_L_MFP &= ~SYS_PD_L_MFP_PD7_MFP_Msk;
|
||
SYS->PD_L_MFP |= SYS_PD_L_MFP_PD7_MFP_LCD_S2;
|
||
|
||
/* Set PD.14 multi-function pins for SEG1 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD14_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD14_MFP_LCD_S1;
|
||
|
||
/* Set PD.15 multi-function pins for SEG0 */
|
||
SYS->PD_H_MFP &= ~SYS_PD_H_MFP_PD15_MFP_Msk;
|
||
SYS->PD_H_MFP |= SYS_PD_H_MFP_PD15_MFP_LCD_S0;
|
||
|
||
/* Set PC.5 multi-function pins for COM3 */
|
||
SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC5_MFP_Msk;
|
||
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC5_MFP_LCD_COM3;
|
||
|
||
/* Set PC.4 multi-function pins for COM2 */
|
||
SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC4_MFP_Msk;
|
||
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC4_MFP_LCD_COM2;
|
||
|
||
/* Set PC.3 multi-function pins for COM1 */
|
||
SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC3_MFP_Msk;
|
||
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC3_MFP_LCD_COM1;
|
||
|
||
/* Set PC.2 multi-function pins for COM0 */
|
||
SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC2_MFP_Msk;
|
||
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC2_MFP_LCD_COM0;
|
||
|
||
// /* Set PC.1 multi-function pins for DH2 */
|
||
// SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC1_MFP_Msk;
|
||
// SYS->PC_L_MFP |= SYS_PC_L_MFP_PC1_MFP_LCD_DH2;
|
||
//
|
||
// /* Set PC.0 multi-function pins for DH1 */
|
||
// SYS->PC_L_MFP &= ~SYS_PC_L_MFP_PC0_MFP_Msk;
|
||
// SYS->PC_L_MFP |= SYS_PC_L_MFP_PC0_MFP_LCD_DH1;
|
||
//
|
||
// /* Set PB.11 multi-function pins for V1 */
|
||
// SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB11_MFP_Msk;
|
||
// SYS->PB_H_MFP |= SYS_PB_H_MFP_PB11_MFP_LCD_V1;
|
||
//
|
||
// /* Set PB.10 multi-function pins for V2 */
|
||
// SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB10_MFP_Msk;
|
||
// SYS->PB_H_MFP |= SYS_PB_H_MFP_PB10_MFP_LCD_V2;
|
||
//
|
||
// /* Set PB.9 multi-function pins for V3 */
|
||
// SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB9_MFP_Msk;
|
||
// SYS->PB_H_MFP |= SYS_PB_H_MFP_PB9_MFP_LCD_V3;
|
||
|
||
/* Disable for PA.11,10 OffD */
|
||
GPIO_DISABLE_DIGITAL_PATH(PA, 0x0C00ul);
|
||
|
||
/* Disable for PB.15,14,13,12,8,7,6,3,2,1,0 OffD */
|
||
GPIO_DISABLE_DIGITAL_PATH(PB, 0xF1CFul);
|
||
|
||
/* Disable forPC.15,14, 5,4,3,2 OffD */
|
||
GPIO_DISABLE_DIGITAL_PATH(PC, 0xC03Cul);
|
||
|
||
/* Disable for PD.15,14,13,12,11,10,9,8,7,6,5,4 OffD */
|
||
GPIO_DISABLE_DIGITAL_PATH(PD, 0xFFF0ul);
|
||
|
||
/* Disable for PE.15,14,13,8,7 OffD */
|
||
GPIO_DISABLE_DIGITAL_PATH(PE, 0xE180ul);
|
||
|
||
//Enable Timer0 clock and select Timer0 clock source
|
||
CLK_EnableModuleClock(TMR0_MODULE);
|
||
CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0);
|
||
}
|
||
|
||
/**
|
||
* @brief LCD Initialization routine.
|
||
*
|
||
* @param[in] u32DrivingType LCD driving type: \ref LCD_C_TYPE / \ref LCD_EXTERNAL_R_TYPE / \ref LCD_INTERNAL_R_TYPE / \ref LCD_EXTERNAL_C_TYPE
|
||
* @param[in] u32ComNum LCD Com number: 1 ~6
|
||
* @param[in] u32BiasLevel LCD bias level: \ref LCD_BIAS_STATIC / \ref LCD_BIAS_HALF / \ref LCD_BIAS_THIRD
|
||
* @param[in] u32FramerateDiv LCD frequency divider: \ref LCD_FREQ_DIV32 / \ref LCD_FREQ_DIV64 / \ref LCD_FREQ_DIV96 / \ref LCD_FREQ_DIV128 /
|
||
* \ref LCD_FREQ_DIV192/ \ref LCD_FREQ_DIV256 / \ref LCD_FREQ_DIV384 / \ref LCD_FREQ_DIV512
|
||
* @param[in] u32DrivingVol LCD charge pump driving voltage: \ref LCD_CPVOl_2_6V / \ref LCD_CPVOl_2_7V / \ref LCD_CPVOl_2_8V / \ref LCD_CPVOl_2_9V /
|
||
* \ref LCD_CPVOl_3V / \ref LCD_CPVOl_3_1V / \ref LCD_CPVOl_3_2V / \ref LCD_CPVOl_3_3V
|
||
*
|
||
* @return LCD frame rate.
|
||
*
|
||
*/
|
||
void LCD_Open_WithoutSystick(uint32_t u32DrivingType, uint32_t u32ComNum, uint32_t u32BiasLevel, uint32_t u32FramerateDiv, uint32_t u32DrivingVol)
|
||
{
|
||
uint32_t clkdiv, muldiv;
|
||
uint32_t lcd_freq_div[] = {32, 64, 96, 128, 192, 256, 384, 512};
|
||
uint32_t multiplex_freq_div[] = {2, 4, 6, 8, 10, 12};
|
||
uint32_t u32clk_src;
|
||
|
||
/* IP reset */
|
||
SYS->IPRST_CTL2 |= SYS_IPRST_CTL2_LCD_RST_Msk;
|
||
SYS->IPRST_CTL2 &= ~SYS_IPRST_CTL2_LCD_RST_Msk;
|
||
|
||
LCD_DisableDisplay();
|
||
|
||
/* Turn all segments off */
|
||
// LCD_SetAllPixels(0); // 这个函数要用到SysTick Timer,屏蔽之
|
||
|
||
|
||
switch(u32DrivingType) {
|
||
case LCD_C_TYPE:
|
||
case LCD_EXTERNAL_C_TYPE:
|
||
|
||
LCD->DISPCTL &= ~LCD_DISPCTL_BV_SEL_Msk; // internal source for charge pump
|
||
LCD->DISPCTL = (LCD->DISPCTL & ~LCD_DISPCTL_CPUMP_FREQ_Msk) | (LCD_CPUMP_DIV1);
|
||
LCD->DISPCTL = (LCD->DISPCTL & ~LCD_DISPCTL_CPUMP_VOL_SET_Msk) | (u32DrivingVol);
|
||
LCD->DISPCTL &= ~LCD_DISPCTL_IBRL_EN_Msk;
|
||
LCD->DISPCTL |= LCD_DISPCTL_CPUMP_EN_Msk; // enable charge pump
|
||
|
||
break;
|
||
|
||
case LCD_EXTERNAL_R_TYPE:
|
||
case LCD_INTERNAL_R_TYPE:
|
||
|
||
LCD->DISPCTL &= ~LCD_DISPCTL_CPUMP_EN_Msk;
|
||
LCD->DISPCTL |= LCD_DISPCTL_BV_SEL_Msk;
|
||
LCD->DISPCTL &= ~LCD_DISPCTL_IBRL_EN_Msk;
|
||
LCD->DISPCTL |= (u32DrivingType == LCD_INTERNAL_R_TYPE)?LCD_DISPCTL_IBRL_EN_Msk:0;
|
||
break;
|
||
|
||
};
|
||
|
||
LCD->CTL &= ~LCD_CTL_FREQ_Msk;
|
||
LCD->CTL |= u32FramerateDiv;
|
||
|
||
LCD->CTL = (LCD->CTL & ~LCD_CTL_MUX_Msk) | ((u32ComNum - 1) << LCD_CTL_MUX_Pos);
|
||
LCD->DISPCTL = (LCD->DISPCTL & ~LCD_DISPCTL_BIAS_SEL_Msk) | u32BiasLevel;
|
||
|
||
if((CLK->CLKSEL1 & CLK_CLKSEL1_LCD_S_Msk) == 0)
|
||
u32clk_src = 32 * 1024;
|
||
else
|
||
u32clk_src = 10 * 1024;
|
||
|
||
clkdiv = (LCD->CTL & LCD_CTL_FREQ_Msk) >> LCD_CTL_FREQ_Pos;
|
||
muldiv = (LCD->CTL & LCD_CTL_MUX_Msk) >> LCD_CTL_MUX_Pos;
|
||
}
|
||
|
||
void LCD_MyOpen()
|
||
{
|
||
/* Do LCD Initialization */
|
||
LCD_Open_WithoutSystick(LCD_INTERNAL_R_TYPE, 4, LCD_BIAS_THIRD, LCD_FREQ_DIV32, LCD_CPVOl_3V);
|
||
LCD_EnableDisplay();
|
||
LCD->CTL |= LCD_CTL_PDDISP_EN_Msk;
|
||
|
||
// 刷新任务,优先级较高
|
||
NVIC_SetPriority (TMR0_IRQn, 2); /* set Priority for Sample Interrupt */
|
||
NVIC_EnableIRQ(TMR0_IRQn);
|
||
|
||
// 设置定时器的周期: 2Hz(500ms)
|
||
TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 2);
|
||
// 启动定时器
|
||
TIMER_EnableInt(TIMER0);
|
||
TIMER_Start(TIMER0);
|
||
}
|
||
|
||
void TMR0_IRQHandler(void)
|
||
{
|
||
static uint32_t halfSeconds = 0;
|
||
uint16_t interval = 30;
|
||
|
||
// clear Timer0 interrupt flag
|
||
NVIC_ClearPendingIRQ(TMR0_IRQn);
|
||
TIMER_ClearIntFlag(TIMER0);
|
||
|
||
// 判断GPS定位是否超时
|
||
if(GPS_Waiting && IsTickOut(GPS_waitTick))
|
||
GPS_Waiting = 0;
|
||
|
||
// 判断是否发送GPS数据
|
||
if(IsTickOut(GPS_tranTick))
|
||
{
|
||
GPS_tranTick = GetDelayTick(dcBuff.configData.intervalGPSTrans * 1000);
|
||
DTU_semGPS = 1;
|
||
}
|
||
|
||
//
|
||
if(MeterInSamplePage() && interval > 3)
|
||
interval = 3;
|
||
|
||
// 判断是否采集数据
|
||
if(Wakeup_GetWorkMode() == WORK_MODE_NORMAL && ++halfSeconds >= interval * 2)
|
||
{
|
||
// 定时采集
|
||
halfSeconds = 0;
|
||
if(!Sample_Busy())
|
||
NVIC_SetPendingIRQ(TMR1_IRQn);
|
||
}
|
||
|
||
// 刷新显示
|
||
Form_OnTimer();
|
||
}
|