#include "includes.h" #include // 是否自检屏状态 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(); }