移植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条评论
快来发表一下你的评论吧 !