176 lines
4.1 KiB
C
176 lines
4.1 KiB
C
|
|
#include "includes.h"
|
|||
|
|
#include "app_config.h"
|
|||
|
|
#include "ui/ui_api.h"
|
|||
|
|
#include "system/includes.h"
|
|||
|
|
#include "system/timer.h"
|
|||
|
|
#include "asm/spi.h"
|
|||
|
|
#include "asm/mcpwm.h"
|
|||
|
|
|
|||
|
|
#if TCFG_LCD_ST7789V_ENABLE
|
|||
|
|
|
|||
|
|
static void delay_ms(unsigned int ms);
|
|||
|
|
|
|||
|
|
/* 初始化代码 */
|
|||
|
|
static const InitCode LcdInit_code[] = {
|
|||
|
|
{0x01, 0}, // soft reset
|
|||
|
|
{REGFLAG_DELAY, 120}, // delay 120ms
|
|||
|
|
{0x11, 0}, // sleep out
|
|||
|
|
{REGFLAG_DELAY, 120},
|
|||
|
|
{0x36, 1, {0x00}},
|
|||
|
|
{0x3A, 1, {0x05}},
|
|||
|
|
{0xB2, 5, {0x0c, 0x0c, 0x00, 0x33, 0x33}},
|
|||
|
|
{0xB7, 1, {0x22}},
|
|||
|
|
{0xBB, 1, {0x36}},
|
|||
|
|
{0xC2, 1, {0x01}},
|
|||
|
|
{0xC3, 1, {0x19}},
|
|||
|
|
{0xC4, 1, {0x20}},
|
|||
|
|
{0xC6, 1, {0x0F}},
|
|||
|
|
{0xD0, 2, {0xA4, 0xA1}},
|
|||
|
|
/* {0xE0,14, {0x70,0x04,0x08,0x09,0x09,0x05,0x2A,0x33,0x41,0x07,0x13,0x13,0x29,0x2F}}, */
|
|||
|
|
/* {0xE1,14, {0x70,0x03,0x09,0x0A,0x09,0x06,0x2B,0x34,0x41,0x07,0x12,0x14,0x28,0x2E}}, */
|
|||
|
|
{0xE0, 14, {0xD0, 0x04, 0x0D, 0x11, 0x13, 0x2B, 0x3F, 0x54, 0x4C, 0x18, 0x0D, 0x0B, 0x1F, 0x23}},
|
|||
|
|
{0xE1, 14, {0xD0, 0x04, 0x0C, 0x11, 0x13, 0x2C, 0x3F, 0x44, 0x51, 0x2F, 0x1F, 0x1F, 0x20, 0x23}},
|
|||
|
|
{0X21, 0},
|
|||
|
|
{0X2A, 4, {0x00, 0x00, 0x00, 0xEF}},
|
|||
|
|
{0X2B, 4, {0x00, 0x00, 0x00, 0xEF}},
|
|||
|
|
{0X29, 0},
|
|||
|
|
{REGFLAG_DELAY, 20},
|
|||
|
|
{0X2C, 0},
|
|||
|
|
{REGFLAG_DELAY, 20},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
void TFT_Write_Cmd(u8 data)
|
|||
|
|
{
|
|||
|
|
lcd_cs_l();
|
|||
|
|
lcd_rs_l();
|
|||
|
|
lcd_spi_send_byte(data);
|
|||
|
|
lcd_cs_h();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void TFT_Write_Data(u8 data)
|
|||
|
|
{
|
|||
|
|
lcd_cs_l();
|
|||
|
|
lcd_rs_h();
|
|||
|
|
lcd_spi_send_byte(data);
|
|||
|
|
lcd_cs_h();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void TFT_Write_Map(char *map, u32 size)
|
|||
|
|
{
|
|||
|
|
spi_dma_send_map(map, size);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void TFT_Set_Draw_Area(int xs, int xe, int ys, int ye)
|
|||
|
|
{
|
|||
|
|
TFT_Write_Cmd(0x2A);
|
|||
|
|
TFT_Write_Data(xs >> 8);
|
|||
|
|
TFT_Write_Data(xs);
|
|||
|
|
TFT_Write_Data(xe >> 8);
|
|||
|
|
TFT_Write_Data(xe);
|
|||
|
|
|
|||
|
|
TFT_Write_Cmd(0x2B);
|
|||
|
|
TFT_Write_Data(ys >> 8);
|
|||
|
|
TFT_Write_Data(ys);
|
|||
|
|
TFT_Write_Data(ye >> 8);
|
|||
|
|
TFT_Write_Data(ye);
|
|||
|
|
|
|||
|
|
TFT_Write_Cmd(0x2C);
|
|||
|
|
|
|||
|
|
lcd_cs_l();
|
|||
|
|
lcd_rs_h();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void TFT_BackLightCtrl(u8 on)
|
|||
|
|
{
|
|||
|
|
#if (TCFG_BACKLIGHT_PWM_MODE == 1)
|
|||
|
|
//注意:duty不能大于prd,并且prd和duty是非标准非线性的,建议用示波器看着来调
|
|||
|
|
extern int pwm_led_output_clk(u8 gpio, u8 prd, u8 duty);
|
|||
|
|
if (on) {
|
|||
|
|
pwm_led_output_clk(TCFG_BACKLIGHT_PWM_IO, 10, 10);
|
|||
|
|
} else {
|
|||
|
|
pwm_led_output_clk(TCFG_BACKLIGHT_PWM_IO, 10, 0);
|
|||
|
|
}
|
|||
|
|
#elif (TCFG_BACKLIGHT_PWM_MODE == 2)
|
|||
|
|
static u8 first_flag = 1;
|
|||
|
|
extern void mcpwm_set_duty(pwm_ch_num_type pwm_ch, pwm_timer_num_type timer_ch, u16 duty);
|
|||
|
|
if (first_flag) {
|
|||
|
|
first_flag = 0;
|
|||
|
|
lcd_mcpwm_init();
|
|||
|
|
}
|
|||
|
|
if (on) {
|
|||
|
|
mcpwm_set_duty(lcd_pwm_p_data.pwm_ch_num, lcd_pwm_p_data.pwm_timer_num, 0);//duty 占空比:0 ~ 10000 对应 100% ~ 0%
|
|||
|
|
} else {
|
|||
|
|
mcpwm_set_duty(lcd_pwm_p_data.pwm_ch_num, lcd_pwm_p_data.pwm_timer_num, 10000);//duty 占空比:0 ~ 10000 对应 100% ~ 0%
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
if (on) {
|
|||
|
|
lcd_bl_h();
|
|||
|
|
} else {
|
|||
|
|
lcd_bl_l();
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void TFT_EnterSleep()
|
|||
|
|
{
|
|||
|
|
TFT_Write_Cmd(0x28);
|
|||
|
|
/* delay_ms(120); */
|
|||
|
|
TFT_Write_Cmd(0x10);
|
|||
|
|
delay_ms(120);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void TFT_ExitSleep()
|
|||
|
|
{
|
|||
|
|
TFT_Write_Cmd(0x11);
|
|||
|
|
delay_ms(120);
|
|||
|
|
TFT_Write_Cmd(0x29);
|
|||
|
|
/* delay_ms(120); */
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void delay_ms(unsigned int ms)
|
|||
|
|
{
|
|||
|
|
delay_2ms((ms + 1) / 2);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
static void lcd_reset()
|
|||
|
|
{
|
|||
|
|
lcd_reset_h();
|
|||
|
|
delay_ms(1000);
|
|||
|
|
lcd_reset_l();
|
|||
|
|
delay_ms(1000);
|
|||
|
|
lcd_reset_h();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#define LCD_WIDTH 240
|
|||
|
|
#define LCD_HIGHT 240
|
|||
|
|
#define LINE_BUFF_SIZE (10*2*LCD_WIDTH*2)
|
|||
|
|
static u8 line_buffer[LINE_BUFF_SIZE] __attribute__((aligned(4)));
|
|||
|
|
|
|||
|
|
REGISTER_LCD_DRIVE() = {
|
|||
|
|
.name = "st7789v",
|
|||
|
|
.lcd_width = LCD_WIDTH,
|
|||
|
|
.lcd_height = LCD_HIGHT,
|
|||
|
|
.color_format = LCD_COLOR_RGB565,
|
|||
|
|
.interface = LCD_SPI,
|
|||
|
|
.column_addr_align = 1,
|
|||
|
|
.row_addr_align = 1,
|
|||
|
|
.dispbuf = line_buffer,
|
|||
|
|
.bufsize = LINE_BUFF_SIZE,
|
|||
|
|
.initcode = LcdInit_code,
|
|||
|
|
.initcode_cnt = sizeof(LcdInit_code) / sizeof(LcdInit_code[0]),
|
|||
|
|
.WriteComm = TFT_Write_Cmd,
|
|||
|
|
.WriteData = TFT_Write_Data,
|
|||
|
|
.WriteMap = TFT_Write_Map,
|
|||
|
|
.SetDrawArea = TFT_Set_Draw_Area,
|
|||
|
|
.Reset = lcd_reset,
|
|||
|
|
.BackLightCtrl = TFT_BackLightCtrl,
|
|||
|
|
.EnterSleep = TFT_EnterSleep,
|
|||
|
|
.ExitSleep = TFT_ExitSleep,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|