移植st7789屏幕驱动
真的不要太简单~
ST7789是一款高度集成的彩色TFT液晶显示屏控制器芯片,通常用于驱动小到中等尺寸的液晶屏。例如淘宝上常见的1.4寸、1.47寸、1.69寸屏幕等等。


为什么RES引脚直接接的VCC,因为不知道具体是哪一块出了问题。RES引脚接到推挽输出的IO引脚后,屏幕也能点亮,但是亮度莫名其妙很低。手上几个屏都测试了一下,都这样。
1st7789驱动
移植
现在就开始吧,首先新建st7789.c和st7789.h文件。然后创建用于初始化st7789芯片的命令序列表。
static lcd_init_cmd_t st7789_init_cmds[] = {
{0x01, {0}, 0x80, 120},
/* Sleep Out */
{0x11, {0}, 0x80, 120},
/* Memory Data Access Control, MX=MV=1, MY=ML=MH=0, RGB=0 */
{0x36, {0x00}, 1},
/* Interface Pixel Format, 16bits/pixel for RGB/MCU interface */
{0x3A, {0x05}, 1},
这个序列表使用的是这样的数据结构:

在创建列表后编写初始化函数,这里把gpio和spi的初始化也都放在里面了。
然后就是编写一下写命令和写数据的函数,写命令时需要设置一下DC引脚,然后写完立即将DC引脚切换回高电平。
static void st7789_send_cmd(uint8_t cmd) {
gpio_set_level(disp_pin_dc, 0);
dirver_spi_send_data(&cmd, 1);
gpio_set_level(disp_pin_dc, 1);
}
static void st7789_send_data(void *data, uint16_t length) {
dirver_spi_send_data(data, length);
}
编写屏幕翻转配置函数:
printf("Display orientation: %s
", orientation_str[orientation]);
uint8_t data[] = {0xC0, 0x00, 0x60, 0xA0};
printf("0x36 command value: 0x%02X
", data[orientation]);
st7789_send_cmd(ST7789_MADCTL);
st7789_send_data((void *)&data[orientation], 1);
最后再写一下写屏函数即可,这里为了快速刷屏,设置了比较大的缓存区。目前还不会使用XR806的DMA,学会了可以减少缓存RAM的大小。
uint8_t data[4] = {0};
uint16_t offsetx1 = x1;
uint16_t offsetx2 = x2;
uint16_t offsety1 = y1;
uint16_t offsety2 = y2;
#if (TFT_DISPLAY_OFFSETS)
offsetx1 += TFT_DISPLAY_X_OFFSET;
offsetx2 += TFT_DISPLAY_X_OFFSET;
offsety1 += TFT_DISPLAY_Y_OFFSET;
offsety2 += TFT_DISPLAY_Y_OFFSET;
2刷屏函数
添加
还需要添加一个刷屏函数作为测试,现在补一下。
由于1.69寸屏幕不需要设置屏幕窗口偏移量,就直接按满屏来刷了。
void lcd_clear(uint16_t color) { st7789_flush(0, 240, 0, 320, color); }
然后在main.c里调用屏幕初始化和刷屏函数就可以啦。
3刷屏效果
展示
经过测试,手上的1.47寸屏幕和1.69寸st7789屏幕都可以正常驱动。就是偏移值和屏幕分辨率设置需要再优化一下代码。

审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !