#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_write_data_dma(u32 len, u8 *color) { // printf("lcd_write_data_dma %d \n", len); // int spi_dma_send(spi_dev spi, const void *buf, u32 len); // spi_send_byte(spi1_hdl, buf[i]); DC_H(); // rt_pin_write((rt_base_t)st7789_device.config.user_data, PIN_HIGH); // return rt_lcd_write_data(st7789_device.mcu, &data, 1); CS_L(); DC_H(); // spi_send_byte(spi1_hdl,data); // lcd_write(&data, 1); spi_dma_send(LCD_SPI_CFG, color, len * 2); CS_H(); } void lcd_fill_frame_lv(int x1, int y1, int x2, int y2, u16 *color) { u16 c; int i = 0; lcd_open_window(x1, y1, x2, y2); //lcd_write_cmd(CMD_WRITE); int cnt = (x2 + 1 - x1) * (y2 + 1 - y1); #if 1 u8 color_buf[cnt * 2]; int idx = 0; for (int i = 0; i < cnt; i++) { color_buf[idx] = (u8)(color[i] >> 8); color_buf[idx + 1] = (u8)(color[i]); idx += 2; } lcd_write_data_dma(cnt, color_buf); #else for (int i = 0; i < cnt; i++) { clr_wdt(); c = color[i]; lcd_write_data((u8)(c >> 8)); lcd_write_data((u8)(c)); } #endif } 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(); }