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