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

介绍了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_PORT GPIOA
#define P_LEDA_PIN GPIO_PIN_5 //背光
#define P_RD_PORT GPIOA
#define P_RD_PIN GPIO_PIN_9 //RD
#define P_WR_PORT GPIOA
#define P_WR_PIN GPIO_PIN_10 //WR
#define P_CD_PORT GPIOA
#define P_CD_PIN GPIO_PIN_11 //RS 0是命令 1:数据

#define P_CS_PORT GPIOA
#define P_CS_PIN GPIO_PIN_12 //cs 0是选中

#define P_RESET_PORT GPIOA
#define P_RESET_PIN GPIO_PIN_14 //REST

#define P_DATA_PORT GPIOB
#define P_DATA_PIN 0xFFFF

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

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

然后定义如下的控制宏

#define P_CD_LOW P_CD_PORT->DATA &= ~P_CD_PIN
#define P_CD_HIGH P_CD_PORT->DATA |= P_CD_PIN

#define P_RESET_LOW P_RESET_PORT->DATA &= ~P_RESET_PIN
#define P_RESET_HIGH P_RESET_PORT->DATA |= P_RESET_PIN

#define P_WR_LOW P_WR_PORT->DATA &= ~P_WR_PIN
#define P_WR_HIGH P_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 mode
	LCD_WriteData8(0x05);
	LCD_WriteReg(0xC5); //VCOM
	LCD_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);//VCOM
	LCD_WriteData8(0x3F);

	LCD_WriteReg(0xC0); //Power control
	LCD_WriteData8(0x2c);

	LCD_WriteReg(0xC2);
	LCD_WriteData8(0x01);

	LCD_WriteReg(0xC3);
	LCD_WriteData8(0x0F);//0D gvdd

	LCD_WriteReg(0xC4);
	LCD_WriteData8(0x20);

	LCD_WriteReg(0xC6);
	LCD_WriteData8(0X11);//0x0F

	LCD_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 Gamma
	LCD_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 Gamma
	LCD_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);

}

代码提供

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

结束语

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128985.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • db2中You can’t specify target table for update in FROM clause错误

    db2中You can’t specify target table for update in FROM clause错误db2中You can’t specify target table for update in FROM clause错误

    2022年4月23日
    65
  • matlab中dde23函数_时滞模型的matlab编程

    matlab中dde23函数_时滞模型的matlab编程ddex1histz=@(t)2*ones(2,1);ddex1dez=@(t,y,Z)[y(1)*(1+0.1*sin(t)-0.1*Z(1,1)-y(2)/(1+y(1)));    y(2)*((2+sin(t))*10^(-5)+9*Z(1,2)/(1+Z(1,2))-Z(2,1))]; sol=dde23(ddex1dez

    2022年10月1日
    0
  • easyOCR_功能测试包括

    easyOCR_功能测试包括EasyOCR是一个用python编写的OCR三方库。git地址为:https://github.com/JaidedAI/EasyOCR。由于笔者从事的是java开发,对python并不熟悉,所以实际上是从python开发环境安装开始的。类似于jdk,python开发也依赖于python环境,而因为python各版本之间差异很大,很多时候不同组件依赖的是不同的python版本,甚至小版本之间也存在兼容性问题,所以网上推荐使用的是Anaconda环境管理软件。Anaconda可以隔离出多个pytho

    2025年5月23日
    0
  • Java将Map数据转换为JSON对象数据

    Java将Map数据转换为JSON对象数据//pom.xml导入jar包<!–拼接json–><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</versi…

    2022年5月6日
    108
  • java volatile关键字的作用_java volatile关键字作用及使用场景详解

    java volatile关键字的作用_java volatile关键字作用及使用场景详解1.volatile关键字的作用:保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。如以下代码片段,isShutDown被置为true后,doWork方法仍有执行。如用volatile修饰isShutDown变量,可避免此问题。publicclassVolatileTest3{staticclassW…

    2022年5月31日
    33
  • TIFF文件切割_tif文件分割

    TIFF文件切割_tif文件分割TIFF文件由于可以存储多种形式的数据类型,也可以存储大量的数据,故其体积比较大,如果我们想截取其中的一部分图片数据,如下图:截取如下图部分:保存之后同样还是一个TIFF图片。1.自己定义了一个类实现头文件:#pragmaonce#include#include”tiflib.h”#include#include

    2025年6月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号