#include "include.h" #include "app_variable.h" #define TRACE_EN 0 #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif AT(.com_text.tft_spi) static void tft_te_refresh(void) { TICK0CNT = 0; compo_cb.rtc_cnt = RTCCNT; compo_cb.rtc_cnt2 = RTCCON2; compo_cb.rtc_update = true; os_gui_draw(); } AT(.com_text.tft_spi) void tft_bglight_en(void) { LCD_BL_EN(); //LCD BL(开背光) } AT(.com_text.tft_spi) void tft_te_isr(void) { // printf("tft_te_isr\n"); if (WKUPEDG & BIT(16+PORT_TFT_INT_VECTOR)) { WKUPCPND = BIT(16+PORT_TFT_INT_VECTOR); sys_cb.tft_idle_count = 5; if (sys_cb.flag_pwroff) { return; } bool flag_mode_nochange = true; if (sys_cb.te_mode != sys_cb.te_mode_next) { sys_cb.te_mode = sys_cb.te_mode_next; sys_cb.despi_baud = sys_cb.te_mode ? sys_cb.despi_baud1 : sys_cb.despi_baud2; DESPIBAUD = sys_cb.despi_baud; flag_mode_nochange = false; } if (sys_cb.te_mode) { //1TE MODE TICK1CNT = 0; TICK1CON |= BIT(0); //TICK EN } else { //>1TE MODE, 如果Mode change停一个TE if (flag_mode_nochange) { tft_te_refresh(); } } //延时打开背光 if (sys_cb.te_bglight_cnt > 0) { sys_cb.te_bglight_cnt--; if (sys_cb.te_bglight_cnt == 0) { sys_cb.tft_bglight_frist_set = true; } } } } AT(.com_text.tft_spi) void tick_te_isr(void) { if (TICK1CON & BIT(9)) { TICK1CON &= ~BIT(0); TICK1CPND = BIT(9); tft_te_refresh(); } } //将TE量化到0~100, 由于TE中断不及时,可能偶尔会超过100 AT(.com_text.tft_spi) int tft_te_getnorm(void) { return TICK0CNT * 100 * 64 / (int)((XOSC_CLK_HZ / 1000) * TFT_TE_CYCLE); } AT(.com_text.tft_spi) void tft_frame_start(void) { // tft_write_cmd12(0x2C); //TFT_RAMWR sys_cb.flush_is_activ = true; tft_write_data_start(); #if (GUI_SELECT | DISPLAY_TFT) TFT_SPI_DATA_EN(); #endif } AT(.com_text.tft_spi) void tft_frame_end(void) { tft_write_end(); sys_cb.flush_is_activ = false; if (sys_cb.tft_bglight_kick) { sys_cb.tft_bglight_kick = false; sys_cb.te_bglight_cnt = 8; //3TE后打开背光 } } //OLED设置背光 void oled_brightness_set_level(uint8_t level, bool stepless_en) { if (!stepless_en) { level = level * 50; } else { uint16_t level_tmp = 0xff * level / PWM_DUTY_CYCLE_MAX; level = (uint8_t)level_tmp; } oled_set_brightness(level); } //设置背光亮度 void tft_bglight_set_level(uint8_t level, bool stepless_en) { int8_t base_duty = 0; //根据限流电阻调整占空比增益 int8_t duty = 0; if(!stepless_en) { level = level * (PWM_DUTY_CYCLE_MAX / MAX_BRIGHTNESS_LEVEL); } if(PWM_DUTY_CYCLE_MAX < level) { level = PWM_DUTY_CYCLE_MAX; #if defined(TJD_CHARGE_BRIGHTNESS_NO_CHANGE) #else if(func_cb.sta == FUNC_CHARGE) level = 5; #endif } duty = base_duty + level; SysVariable.tft_bglight_duty = duty; if (sys_cb.tft_bglight_last_duty != SysVariable.tft_bglight_duty) { bsp_pwm_duty_set(PORT_TFT_BL, SysVariable.tft_bglight_duty, false); sys_cb.tft_bglight_last_duty = SysVariable.tft_bglight_duty; } } //背光亮度初始设置检测 void tft_bglight_frist_set_check(void) { // printf("tft_bglight_frist_set_check ,sys_cb.tft_bglight_frist_set=%d,sys_cb.te_bglight_cnt=%d \n",sys_cb.tft_bglight_frist_set,sys_cb.te_bglight_cnt); if(!sys_cb.tft_bglight_frist_set) { return ; } if (sys_cb.gui_sleep_sta) { return ; } sys_cb.tft_bglight_frist_set = false; sys_cb.tft_bglight_last_duty = 0; //todo:后续根据客户定制调整 if(0 == SysVariable.tft_bglight_duty) { SysVariable.tft_bglight_duty = PWM_DUTY_CYCLE_MAX; SysVariable.light_level = MAX_BRIGHTNESS_LEVEL; // printf("tft_bglight_frist_set_check \n"); } tft_bglight_set_level(SysVariable.tft_bglight_duty,true); } //设置TE MODE void tft_set_temode(bool mode) { sys_cb.te_mode_next = mode; } void tft_init(void) { //clk init CLKDIVCON2 = (CLKDIVCON2 & ~(BIT(4) * 0xF)) | BIT(4) * 2; // TFTDE div CLKGAT2 |= BIT(4); RSTCON0 |= BIT(8); port_tft_init(); //TE port interrupt port_irq_register(PORT_TFT_INT_VECTOR, tft_te_isr); port_wakeup_init(PORT_TFT_INT, 1, 1); //开内部上拉, 下降沿唤醒 //TICK Timer init CLKGAT0 |= BIT(27); TICK0CON = BIT(6) | BIT(5) | BIT(2); //div64[6:4], xosc26m[3:1] TICK0PR = 0xFFFF; TICK0CNT = 0; TICK0CON |= BIT(0); //TICK EN TICK1CON = BIT(7) | BIT(6) | BIT(5) | BIT(2); //TIE, div64[6:4], xosc26m[3:1] TICK1PR = (int)((XOSC_CLK_HZ / 1000) * TFT_TE_CYCLE_DELAY) / 64; TICK1CNT = 0; sys_irq_init(IRQ_TE_TICK_VECTOR, 0, tick_te_isr); sys_cb.te_mode = false; //初始化 sys_cb.te_mode_next = false; tft_set_temode(DEFAULT_TE_MODE); port_tft_reset(); //DE #if (GUI_SELECT | DISPLAY_TFT) DESPICON = BIT(27) | BIT(2) | BIT(7) | BIT(0); //[28:27]IN RGB565, [9]MultiBit, [7]IE, [3:2]1BIT, [0]EN #elif (GUI_SELECT == GUI_TFT_JD9853) DESPICON = BIT(27) | BIT(26) | BIT(18) | BIT(9) | BIT(7) | BIT(0); //[28:27]IN RGB565, [9]MultiBit, [7]IE, [3:2], [0]EN #else DESPICON = BIT(27) | BIT(9) | BIT(7) | BIT(3) | BIT(2) | BIT(0); //[28:27]IN RGB565, [9]MultiBit, [7]IE, [3:2]4BIT, [0]EN #endif sys_irq_init(IRQ_DESPI_VECTOR, 0, tft_spi_isr); tft_driver_init(); tft_set_window(0, 0, GUI_SCREEN_WIDTH - 1, GUI_SCREEN_HEIGHT - 1); sys_cb.tft_bglight_kick = true; //延时打开背光 } void tft_exit(void) { bsp_pwm_disable(PORT_TFT_BL); //关背光 port_tft_exit(); port_irq_free(PORT_TFT_INT_VECTOR); port_wakeup_exit(PORT_TFT_INT); DESPICON = 0; TICK0CON = 0; TICK1CON = 0; RSTCON0 &= ~BIT(8); CLKGAT2 &= ~BIT(4); }