mcu_ab568x/app/platform/gui/tft/tft.c
2025-05-30 18:03:10 +08:00

249 lines
6.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}