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