单片机—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);

}

代码提供

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

结束语

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • cts测试套件下载(4V)

    目录概述组织caseCTS框架配置文件测试case配置文件启动框架CtsConsoletest组件CtsTest测试类型执行命令总结1概述CTS测试框架是有两个版本的,Android6.0以及之前的版本都统称为V1版本,7.0以及之后的版本为V2(目前Android版本已经迭代到AndroidO了,目前还是用的V2框架),其实两者都是基于基础框架Trade-Federat

  • 按位取反~运算_按位与按位或按位异或运算符

    按位取反~运算_按位与按位或按位异或运算符按位取反~运算首先我们来看按位取反的概念按位取反运算符:对数据的每个二进制位取反,即把0变成1,把1变成0.即~x=-x-1这里按照定义9的二进制为00001001其按位取反为11110110结果为-10这个过程没有任何问题,但是如果忘记了负数的二进制表达方式,就会对这个结果产生疑问,为什么11110110表示-10而不是503?理解按位取反的关键是理解11110110为什么表示-10,也就是负数的二进制表达方式。现在计算机普遍使用补码表示负数。知道补码,求源码的方式是:值取反再加1。

  • Object类通过转为JsonObject或Map获取属性值「建议收藏」

    Object类通过转为JsonObject或Map获取属性值「建议收藏」Object类通过转为JsonObject或Map获取属性值简介:在项目使用中,我们经常会遇到object类,如何快速的获取其属性值?在此,不通过反射机制获取,而是将其转为JsonObject类或者Map,获取其对应属性名的属性值。Object类//object使用情景一:Objecto=redisTemplate.opsForHash().get(vehicleMessage,engineCode);//object使用情景二:Objectob=json.get

  • 怎样发外链,使网站能快速收录,秒收录

    怎样发外链,使网站能快速收录,秒收录本文来自:优优蜘蛛池(http://www.zhizhuchi.vip)1.首先就是大家都熟知的百度网站提交2.利数桥带族用的周边产品添加网站的外链吸引蜘蛛进入你的网站。3.写一篇原创文章加上自己的网站链接后投稿到大型的站长网站。4.到高权重的论坛注册账号,这个人签名里添加上自己网站的超链接,发发贴,顶顶贴,就能无形中增加了。2:利用公司名字和地址在分类信息做外链。3:利用论坛昵称做高质量外链。4:在帖子内容中巧带二级域名链接。SEO优化之网站怎么实现百度秒收录何谓”秒收录”?大家可以经常

  • 数仓分层ods_关键层

    数仓分层ods_关键层数仓搭建——ODS层用户行为数据和业务数据

  • 虚拟机与宿主机网络配置——可互通可上网「建议收藏」

    虚拟机与宿主机网络配置——可互通可上网「建议收藏」     为了学习和使用Linux,多数人选择了使用虚拟机的方式来安装Linux系统。这样我们就可以在windows系统中安装Linux系统了,其中windows机器系统本身我们称作宿主机,安装的虚拟机系统我们简称虚拟机。     由于虚拟机提供的几种网络方式,要么是虚拟机可以ping通宿主机反之不行,要么是虚拟机之间可以互通但宿主机不能访问虚拟机,所以在实际应用中多数被两者间的网络互通和是否…

发表回复

您的电子邮箱地址不会被公开。

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