> 文档中心 > 单片机---HLK-W801并口驱动ST7789

单片机---HLK-W801并口驱动ST7789


目的

买了这块并口的屏幕,是为了做一个nes模拟器的游戏机,之前用的SPI的屏幕,显示游戏画面还是比较耗时,毕竟是串行数据,所以准备试一下并行接口的屏幕,顺便理解一下并口8080的驱动方式。

在这里插入图片描述

并口协议

8080 时序也叫因特尔总线,一般mcu(mpu)模式的lcd上。
Inter总线控制线有四根:

  • RD:写使能
  • WR:读使能
  • DC(RS): - 数据/命令
  • CS:片选
    然后就是若干根数据线,例如8或者16根。
    写时序图
    在这里插入图片描述
    读时序图
    在这里插入图片描述
    这里值得注意的就是,数据的读写,都是在RD或者WR的上升沿有效,这个很重要。所以我们可以先写数据,再制造一个上升沿,或者先拉低,写入数据后再拉高都是可以的。但是从图上来看,推荐前者。
    在这里插入图片描述

ST7789 引脚定义

ST7789的用法有好几种,今天只说一下16bit的并口驱动。
硬件连接

#define P_LEDA_PORTGPIOA#define P_LEDA_PINGPIO_PIN_5//背光#define P_RD_PORTGPIOA#define P_RD_PINGPIO_PIN_9  //RD#define P_WR_PORTGPIOA#define P_WR_PINGPIO_PIN_10//WR#define P_CD_PORTGPIOA#define P_CD_PINGPIO_PIN_11      //RS  0是命令  1:数据#define P_CS_PORTGPIOA#define P_CS_PINGPIO_PIN_12//cs 0是选中#define P_RESET_PORTGPIOA#define P_RESET_PINGPIO_PIN_14 //REST#define P_DATA_PORTGPIOB#define P_DATA_PIN0xFFFF

其中,
背光,有的屏幕叫BLK,我们可以直接接高电平。
CS,我们可以直接接低电平,默认选中。
RD,我们可以直接拉高电平,不用读取功能。
CD,有的屏幕叫RS。

数据线,我们用的是GPIOB 0~15。这里要细心一点,接错了就会花屏
在这里插入图片描述

然后定义如下的控制宏

#define P_CD_LOWP_CD_PORT->DATA &= ~P_CD_PIN#define P_CD_HIGHP_CD_PORT->DATA |= P_CD_PIN#define P_RESET_LOWP_RESET_PORT->DATA &= ~P_RESET_PIN#define P_RESET_HIGHP_RESET_PORT->DATA |= P_RESET_PIN#define P_WR_LOWP_WR_PORT->DATA &= ~P_WR_PIN#define P_WR_HIGHP_WR_PORT->DATA |= P_WR_PIN

这里是w801的写法,引脚的高低置位。
在这里插入图片描述

ST7789核心函数

LCD显示屏最基础的两个控制 函数,就是写寄存器和写数据,

void P_WriteReg(uint16_t reg){P_CD_LOW;WRITE_REG(P_DATA_PORT->DATA,reg);P_WR_LOW;P_WR_HIGH;P_CD_HIGH;}void P_WriteData(uint16_t data){WRITE_REG(P_DATA_PORT->DATA,data);P_WR_LOW;P_WR_HIGH;}

这里我们将控制线的修改,完全放在写寄存器上,因为写寄存器用的少,这样写数据的时候,就效率高了一些。
在这里插入图片描述

然后就是初始化函数

void LCD_Init(void){LCD_Reset_On();HAL_Delay(120);LCD_Reset_Off();HAL_Delay(120);LCD_WriteReg(0x3A);    //65k modeLCD_WriteData8(0x05);LCD_WriteReg(0xC5); //VCOMLCD_WriteData8(0x1A);LCD_WriteReg(0x36); // 屏幕显示方向设置LCD_WriteData8(0x00);//-------------ST7789V Frame rate setting-----------//LCD_WriteReg(0xb2);LCD_WriteData8(0x05);LCD_WriteData8(0x05);LCD_WriteData8(0x00);LCD_WriteData8(0x33);LCD_WriteData8(0x33);LCD_WriteReg(0xb7);LCD_WriteData8(0x35);//--------------ST7789V Power setting---------------//LCD_WriteReg(0xBB);//VCOMLCD_WriteData8(0x3F);LCD_WriteReg(0xC0); //Power controlLCD_WriteData8(0x2c);LCD_WriteReg(0xC2);LCD_WriteData8(0x01);LCD_WriteReg(0xC3);LCD_WriteData8(0x0F);//0D gvddLCD_WriteReg(0xC4);LCD_WriteData8(0x20);LCD_WriteReg(0xC6);LCD_WriteData8(0X11);//0x0FLCD_WriteReg(0xd0);LCD_WriteData8(0xa4);LCD_WriteData8(0xa1);LCD_WriteReg(0xE8);LCD_WriteData8(0x03);LCD_WriteReg(0xE9);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);//---------------ST7789V gamma setting-------------//LCD_WriteReg(0xE0); //Set GammaLCD_WriteData8(0xD0);LCD_WriteData8(0x05);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);LCD_WriteData8(0x14);LCD_WriteData8(0x28);LCD_WriteData8(0x33);LCD_WriteData8(0x3F);LCD_WriteData8(0x07);LCD_WriteData8(0x13);LCD_WriteData8(0x14);LCD_WriteData8(0x28);LCD_WriteData8(0x30);LCD_WriteReg(0XE1); //Set GammaLCD_WriteData8(0xD0);LCD_WriteData8(0x05);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);LCD_WriteData8(0x03);LCD_WriteData8(0x24);LCD_WriteData8(0x32);LCD_WriteData8(0x32);LCD_WriteData8(0x3B);LCD_WriteData8(0x14);LCD_WriteData8(0x13);LCD_WriteData8(0x28);LCD_WriteData8(0x2F);LCD_WriteReg(0x11);HAL_Delay(120);LCD_Clear(0x0000); /*先手动清屏再显示,防止花屏显示*/LCD_WriteReg(0x29); //开启显示 }

其中屏幕方向是可以修改的
LCD_WriteReg(0x36); // 屏幕显示方向设置
LCD_WriteData8(0x00);

0x00 就是正常的竖屏
0xA0 是向左横屏
还有两种0x60, 0xC0 估计是倒置和向右横屏,有兴趣的可以试一下。
在这里插入图片描述

易出错点

16bit驱动最容易出错的地方就是坐标设置,我以为坐标是16bit的,那么我就直接写四个坐标不就行了,恰恰错了,这里需要兼容8bit的,要把每个16bit分两次写入。否则就会出现花屏问题。
这个bug我搞了一天。
在这里插入图片描述

void LCD_Address_Set(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye){LCD_WriteReg(0x2a);LCD_WriteData(xs>>8);LCD_WriteData(xs&0xff);LCD_WriteData(xe>>8);LCD_WriteData(xe&0xff);LCD_WriteReg(0x2b);LCD_WriteData(ys>>8);LCD_WriteData(ys&0xff);LCD_WriteData(ye>>8);LCD_WriteData(ye&0xff);LCD_WriteReg(0x2c);}

代码提供

《完整代码下载》
其实是建议大家按照前面的方法自己写出来,基本的重要地方都已经提供了,所以还是要自己尝试一下,印象才更深刻。
在这里插入图片描述

结束语

谁支持我们伟大复兴,谁就是朋友,谁阻拦,那就是敌人。
在这里插入图片描述