288 lines
6.2 KiB
C
288 lines
6.2 KiB
C
|
|
#include "drv_st7789.h"
|
|||
|
|
#include "asm/spi.h"
|
|||
|
|
|
|||
|
|
extern void delay(unsigned int cnt);
|
|||
|
|
|
|||
|
|
#define RST_L() gpio_set_output_value(LCD_RST_PIN, 0);
|
|||
|
|
#define RST_H() gpio_set_output_value(LCD_RST_PIN, 1);
|
|||
|
|
#define DC_L() gpio_set_output_value(LCD_DC_PIN, 0);
|
|||
|
|
#define DC_H() gpio_set_output_value(LCD_DC_PIN, 1);
|
|||
|
|
#define CS_L() gpio_set_output_value(LCD_CS_PIN, 0);
|
|||
|
|
#define CS_H() gpio_set_output_value(LCD_CS_PIN, 1);
|
|||
|
|
#define BL_L() gpio_set_output_value(LCD_BL_PIN, 0);
|
|||
|
|
#define BL_H() gpio_set_output_value(LCD_BL_PIN, 1);
|
|||
|
|
|
|||
|
|
static void hw_init(void)
|
|||
|
|
{
|
|||
|
|
// reset pin
|
|||
|
|
gpio_set_pull_up(LCD_RST_PIN, 0);
|
|||
|
|
gpio_set_pull_down(LCD_RST_PIN, 0);
|
|||
|
|
gpio_set_direction(LCD_RST_PIN, 0);
|
|||
|
|
RST_L();
|
|||
|
|
|
|||
|
|
// bl pin
|
|||
|
|
gpio_set_pull_up(LCD_BL_PIN, 0);
|
|||
|
|
gpio_set_pull_down(LCD_BL_PIN, 0);
|
|||
|
|
gpio_set_direction(LCD_BL_PIN, 0);
|
|||
|
|
BL_L();
|
|||
|
|
|
|||
|
|
// dc pin
|
|||
|
|
gpio_set_pull_up(LCD_DC_PIN, 0);
|
|||
|
|
gpio_set_pull_down(LCD_DC_PIN, 0);
|
|||
|
|
gpio_set_direction(LCD_DC_PIN, 0);
|
|||
|
|
DC_H();
|
|||
|
|
|
|||
|
|
// cs pin
|
|||
|
|
gpio_set_pull_up(LCD_CS_PIN, 0);
|
|||
|
|
gpio_set_pull_down(LCD_CS_PIN, 0);
|
|||
|
|
gpio_set_direction(LCD_CS_PIN, 0);
|
|||
|
|
CS_H();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void lcd_write(u8 *buf, int leng)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < leng; i++)
|
|||
|
|
{
|
|||
|
|
spi_send_byte(LCD_SPI_CFG, buf[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_write_data(u8 data)
|
|||
|
|
{
|
|||
|
|
DC_H();
|
|||
|
|
delay(2);
|
|||
|
|
CS_L();
|
|||
|
|
delay(2);
|
|||
|
|
DC_H();
|
|||
|
|
delay(2);
|
|||
|
|
lcd_write(&data, 1);
|
|||
|
|
CS_H();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_write_data_ex(u16 dat)
|
|||
|
|
{
|
|||
|
|
DC_H();
|
|||
|
|
delay(2);
|
|||
|
|
CS_L();
|
|||
|
|
delay(2);
|
|||
|
|
DC_H();
|
|||
|
|
delay(2);
|
|||
|
|
// lcd_write(&data, 1);
|
|||
|
|
spi_send_byte(LCD_SPI_CFG, dat >> 8);
|
|||
|
|
spi_send_byte(LCD_SPI_CFG, dat);
|
|||
|
|
CS_H();
|
|||
|
|
// TFTLCD_Writ_Bus(dat>>8);
|
|||
|
|
// TFTLCD_Writ_Bus(dat);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_write_cmd(u8 cmd)
|
|||
|
|
{
|
|||
|
|
DC_L();
|
|||
|
|
delay(2);
|
|||
|
|
CS_L();
|
|||
|
|
delay(2);
|
|||
|
|
DC_L();
|
|||
|
|
delay(2);
|
|||
|
|
spi_send_byte(LCD_SPI_CFG, cmd);
|
|||
|
|
CS_H();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_open_window(u16 x1, u16 y1, u16 x2, u16 y2)
|
|||
|
|
{
|
|||
|
|
if (USE_HORIZONTAL == 0)
|
|||
|
|
{
|
|||
|
|
lcd_write_cmd(0x2a);
|
|||
|
|
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2b);
|
|||
|
|
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2c);
|
|||
|
|
}
|
|||
|
|
else if (USE_HORIZONTAL == 1)
|
|||
|
|
{
|
|||
|
|
lcd_write_cmd(0x2a);
|
|||
|
|
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2b);
|
|||
|
|
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2c);
|
|||
|
|
}
|
|||
|
|
else if (USE_HORIZONTAL == 2)
|
|||
|
|
{
|
|||
|
|
lcd_write_cmd(0x2a);
|
|||
|
|
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2b);
|
|||
|
|
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
|
|||
|
|
lcd_write_cmd(0x2c);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
lcd_write_cmd(0x2a);
|
|||
|
|
lcd_write_data_ex(x1);
|
|||
|
|
lcd_write_data_ex(x2);
|
|||
|
|
lcd_write_cmd(0x2b);
|
|||
|
|
lcd_write_data_ex(y1);
|
|||
|
|
lcd_write_data_ex(y2);
|
|||
|
|
lcd_write_cmd(0x2c);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void st7789_init_cmd(void)
|
|||
|
|
{
|
|||
|
|
lcd_write_cmd(0x36);
|
|||
|
|
if (USE_HORIZONTAL == 0)
|
|||
|
|
lcd_write_data(0x00);
|
|||
|
|
else if (USE_HORIZONTAL == 1)
|
|||
|
|
lcd_write_data(0x60);
|
|||
|
|
else if (USE_HORIZONTAL == 2)
|
|||
|
|
lcd_write_data(0xa0);
|
|||
|
|
else
|
|||
|
|
lcd_write_data(0xc0);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0x3A);
|
|||
|
|
lcd_write_data(0x05);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xB2);
|
|||
|
|
lcd_write_data(0x0C);
|
|||
|
|
lcd_write_data(0x0C);
|
|||
|
|
lcd_write_data(0x00);
|
|||
|
|
lcd_write_data(0x33);
|
|||
|
|
lcd_write_data(0x33);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xB7);
|
|||
|
|
lcd_write_data(0x35);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xBB);
|
|||
|
|
lcd_write_data(0x19);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xC0);
|
|||
|
|
lcd_write_data(0x2C);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xC2);
|
|||
|
|
lcd_write_data(0x01);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xC3);
|
|||
|
|
lcd_write_data(0x12);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xC4);
|
|||
|
|
lcd_write_data(0x20);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xC6);
|
|||
|
|
lcd_write_data(0x0F);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xD0);
|
|||
|
|
lcd_write_data(0xA4);
|
|||
|
|
lcd_write_data(0xA1);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xE0);
|
|||
|
|
lcd_write_data(0xD0);
|
|||
|
|
lcd_write_data(0x04);
|
|||
|
|
lcd_write_data(0x0D);
|
|||
|
|
lcd_write_data(0x11);
|
|||
|
|
lcd_write_data(0x13);
|
|||
|
|
lcd_write_data(0x2B);
|
|||
|
|
lcd_write_data(0x3F);
|
|||
|
|
lcd_write_data(0x54);
|
|||
|
|
lcd_write_data(0x4C);
|
|||
|
|
lcd_write_data(0x18);
|
|||
|
|
lcd_write_data(0x0D);
|
|||
|
|
lcd_write_data(0x0B);
|
|||
|
|
lcd_write_data(0x1F);
|
|||
|
|
lcd_write_data(0x23);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0xE1);
|
|||
|
|
lcd_write_data(0xD0);
|
|||
|
|
lcd_write_data(0x04);
|
|||
|
|
lcd_write_data(0x0C);
|
|||
|
|
lcd_write_data(0x11);
|
|||
|
|
lcd_write_data(0x13);
|
|||
|
|
lcd_write_data(0x2C);
|
|||
|
|
lcd_write_data(0x3F);
|
|||
|
|
lcd_write_data(0x44);
|
|||
|
|
lcd_write_data(0x51);
|
|||
|
|
lcd_write_data(0x2F);
|
|||
|
|
lcd_write_data(0x1F);
|
|||
|
|
lcd_write_data(0x1F);
|
|||
|
|
lcd_write_data(0x20);
|
|||
|
|
lcd_write_data(0x23);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0x21);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0x11);
|
|||
|
|
// Delay (120);
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0x29);
|
|||
|
|
|
|||
|
|
// 设置列地址
|
|||
|
|
lcd_write_cmd(0x2A); // 列地址设置
|
|||
|
|
lcd_write_data(0x00); // 起始列地址高位
|
|||
|
|
lcd_write_data(0x00); // 起始列地址低位
|
|||
|
|
lcd_write_data(0x00); // 结束列地址高位
|
|||
|
|
lcd_write_data(0xEF); // 结束列地址低位(240 列)
|
|||
|
|
|
|||
|
|
// 设置行地址
|
|||
|
|
lcd_write_cmd(0x2B); // 行地址设置
|
|||
|
|
lcd_write_data(0x00); // 起始行地址高位
|
|||
|
|
lcd_write_data(0x00); // 起始行地址低位
|
|||
|
|
lcd_write_data(0x00); // 结束行地址高位
|
|||
|
|
lcd_write_data(0xC5); // 结束行地址低位(198 行)
|
|||
|
|
|
|||
|
|
lcd_write_cmd(0x2C); // 内存写入
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_fill(u16 xsta, u16 ysta, u16 xend, u16 yend, u16 color)
|
|||
|
|
{
|
|||
|
|
u16 i, j;
|
|||
|
|
lcd_open_window(xsta, ysta, xend - 1, yend - 1);
|
|||
|
|
for (i = ysta; i < yend; i++)
|
|||
|
|
{
|
|||
|
|
for (j = xsta; j < xend; j++)
|
|||
|
|
{
|
|||
|
|
lcd_write_data_ex(color);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void lcd_st7789_init(void)
|
|||
|
|
{
|
|||
|
|
printf("lcd_st7789_init\n");
|
|||
|
|
|
|||
|
|
hw_init();
|
|||
|
|
|
|||
|
|
EXP_PWR_ON();
|
|||
|
|
clr_wdt();
|
|||
|
|
os_time_dly(1);
|
|||
|
|
|
|||
|
|
spi_open(LCD_SPI_CFG);
|
|||
|
|
|
|||
|
|
int delay_cnt = 0;
|
|||
|
|
|
|||
|
|
RST_L();
|
|||
|
|
while (1)
|
|||
|
|
{
|
|||
|
|
clr_wdt();
|
|||
|
|
os_time_dly(1);
|
|||
|
|
delay_cnt++;
|
|||
|
|
if (delay_cnt > 10)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
RST_H();
|
|||
|
|
|
|||
|
|
clr_wdt();
|
|||
|
|
os_time_dly(1);
|
|||
|
|
|
|||
|
|
st7789_init_cmd();
|
|||
|
|
|
|||
|
|
lcd_fill(0, 0, LCD_W, LCD_H, RED);
|
|||
|
|
|
|||
|
|
BL_H();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|