STM32通过8位并口驱动TFT-1.8寸屏(ST7735)显示器

news2024/11/24 2:28:55

        TFT1.8寸屏,搭配ST7735驱动芯片,是一种专为小型电子设备设计的彩色液晶显示解决方案。该屏幕采用薄膜晶体管(TFT)技术,能够实现高亮度、高对比度和丰富的色彩表现(即16位色彩深度),提供清晰细腻的显示效果。ST7735作为一款集成度高的驱动芯片,不仅支持多种分辨率(在1.8寸屏上通常为128x160像素),还具备RGB RAMDAC、控制器和GPIO接口等功能,并通过SPI接口与微控制器进行通信。此外,ST7735还提供了硬件加速图形绘制功能,如点、线、矩形绘制及文本显示等,进一步提升了显示性能。该组合广泛应用于仪器仪表、智能设备等嵌入式系统中,因其低功耗特性而特别适合便携式设备。通过编写相应的驱动程序,可以方便地初始化ST7735驱动芯片,配置8位并口发送显示数据,使TFT1.8寸屏正常工作。

一、驱动芯片介绍

屏幕尺寸:1.8英寸
分辨率:128x160像素
色彩:支持16位色彩深度(5位红、6位绿、5位蓝各通道),能够提供相对丰富的颜色表现。
接口类型:MCU接口,可通过SPI协议与微控制器进行通信。
驱动型号:ST7735
功能:ST7735是一款低功耗的彩色TFT液晶屏驱动芯片,广泛应用于各种嵌入式系统和电子设备中。它集成了RGB RAMDAC(随机存取的数字模拟转换器)、控制器和GPIO接口,支持硬件加速图形绘制功能,如画点、线、矩形、填充以及文本显示等。
兼容性:可直接以SPI协议,或8位/9位/16位并行连接外部控制器。显示数据可以存储在片内的132x162x18 bits内存中,显示内存的读写不需要外部时钟驱动。
型号差异:ST7735有几种不同的型号,如ST7735、ST7735R、ST7735S等。-R和-S型号在功能上与原始型号一致,但增加了垂直滚动功能,并容忍更高的电压(最高到4.8V)。
        由于TFT1.8寸屏具有体积小、功耗低、色彩丰富等特点,因此非常适合用于智能手表、便携式医疗设备、小型电子仪器等需要显示信息的嵌入式系统中。

二、驱动方式

首先,我们需要根据实际的硬件连接来定义LCD接口所使用的GPIO引脚。

/******************************************************************************
  接口定义,请根据接线修改并修改相应IO初始化--驱动板子和IO要对应 */
//	#define LCD_CS        	//PB1      	//片选
//	#define LCD_RS         	//PB0       //命令/数据切换
//	#define LCD_WR         	//PB11      //写控制端
//	#define LCD_RD         	//PB10    	//读控制端
//	#define LCD_RST     		//PB8      	//复位端
//	#define LCD_BLK         //PB7    		//背光控制
//	#PA0-7,作为8位并口的数据输出端

 使用下 LCD_Init 函数通过PA0~PA7并口与 TFT 进行通信,并执行各种各个寄存器的初始化配置等。

/*******************************************************************************/
//函数:void LCD_Init(void)
//函数功能:初始化lcd
/*******************************************************************************/
void LCD_Init(void){ 	

	LCD_BLK_Off;           //关闭背光
	
	
	//LCD_SoftRest();        //软复位 
	LCD_HardwareRest();			//硬复位命令
	
	LCD_RD_SET;
	
	LCD_WR_REG(0x11);     // Sleep out
	HAL_Delay(120);                //HAL_Delay 120ms 
	LCD_WR_REG(0xB1);     //In Normal mode
	LCD_WR_DATA(0x05);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x3C);    
	LCD_WR_REG(0xB2);     //In Idle mode 
	LCD_WR_DATA(0x05);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_REG(0xB3);     //In Partial mode
	LCD_WR_DATA(0x05);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x05);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_REG(0xB4);     
	LCD_WR_DATA(0x03);   //Normal mode dot inversion
	LCD_WR_REG(0xC0);     //Power Control
	LCD_WR_DATA(0x28);   //AVDD=4.6V, GVDD=4.3V
	LCD_WR_DATA(0x08);   //GVCL=-4.3V
	LCD_WR_DATA(0x04);   //MODE=2X
	LCD_WR_REG(0xC1);     //Power Control
	LCD_WR_DATA(0xC0);   //V25=2.4, VGH=2*4.6+2.4-0.5=11.1, VGL=-7.5
	LCD_WR_REG(0xC2);     
	LCD_WR_DATA(0x0D); 
	LCD_WR_DATA(0x00);   
	LCD_WR_REG(0xC3);     
	LCD_WR_DATA(0x8D);   
	LCD_WR_DATA(0x2A);   
	LCD_WR_REG(0xC4);     
	LCD_WR_DATA(0x8D);   
	LCD_WR_DATA(0xEE);   
	LCD_WR_REG(0xC5);     //Vcom      
	LCD_WR_DATA(0x18);   
	LCD_WR_REG(0x36);     
	LCD_WR_DATA(0xC0);  
	LCD_WR_REG(0xE0);     
	LCD_WR_DATA(0x04);   
	LCD_WR_DATA(0x1B);   
	LCD_WR_DATA(0x1C);   
	LCD_WR_DATA(0x1E);   
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x33);
	LCD_WR_DATA(0x29); 
	LCD_WR_DATA(0x2B);   
	LCD_WR_DATA(0x2A);   
	LCD_WR_DATA(0x26);   
	LCD_WR_DATA(0x2E);   
	LCD_WR_DATA(0x39);   
	LCD_WR_DATA(0x00);   
	LCD_WR_DATA(0x02);   
	LCD_WR_DATA(0x02);   
	LCD_WR_DATA(0x10);   

	LCD_WR_REG(0xE1);     
	LCD_WR_DATA(0x04);   
	LCD_WR_DATA(0x1B);   
	LCD_WR_DATA(0x1C);   
	LCD_WR_DATA(0x1E);  
	LCD_WR_DATA(0x3C);   
	LCD_WR_DATA(0x33);  
	LCD_WR_DATA(0x29);  
	LCD_WR_DATA(0x2B);   
	LCD_WR_DATA(0x29);   
	LCD_WR_DATA(0x26);   
	LCD_WR_DATA(0x2E);   
	LCD_WR_DATA(0x39);   
	LCD_WR_DATA(0x00);   
	LCD_WR_DATA(0x02);   
	LCD_WR_DATA(0x02);   
	LCD_WR_DATA(0x10);   

	LCD_WR_REG(0x3A);     
	LCD_WR_DATA(0x05);   

	LCD_WR_REG(0x11);     // Sleep out
	HAL_Delay(120);

	
	LCD_WR_REG(0x2A);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x7F);
	
	LCD_WR_REG(0x2B);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x00);
	LCD_WR_DATA(0x9F);

	LCD_WR_REG(0x29);		 // Display OnHAL_Delay(20);
	HAL_Delay(20); //HAL_Delay 20ms
	LCD_WR_REG(0x2C);
	HAL_Delay(20); //HAL_Delay 20ms
	
	LCD_Display_Dir(LCD_DIR_Mode);	//选择--屏幕显示方式
	
	LCD_BLK_On;					//点亮背光
	
	LCD_Clear(WHITE);
	
}

       基于STM32 HAL库编写的,使用下面这些函数通过PA0~PA7并口与TFT进行通信,并执行各种控制操作,如写入寄存器、写入数据、显示开启/关闭等。

/********************************************************************/
//函数:uint8_t DB_OUT(uint8_t TxData)
//函数功能: PA0-PA7输出数据
//TxData:要写入的字节
//*******************************************************************/
void DB_OUT(uint8_t  TxData){		 			 
	GPIOA->BSRR = TxData;		// 设置  TxData  高电平
  GPIOA->BRR  = ~TxData;	// 清除 ~TxData  高电平(即设置其余脚为低电平)
}




//********************************************************************/
//函数:void LCD_WR_REG(uint8_t regval)
//函数功能:
//写寄存器函数
//regval:寄存器值
//*******************************************************************/
void LCD_WR_REG(uint8_t regval){   
	LCD_CS_CLR;  //LCD_CS=0  //片选
	LCD_RS_CLR;  //LCD_RS=0  //设置命令状态
	DB_OUT(regval);
	LCD_WR_CLR;
	LCD_WR_SET;
	LCD_CS_SET;  //LCD_CS=1	 
}



//*******************************************************************/
//函数:void LCD_WR_DATA(uint8_t data)   //写8位数据
//函数功能:
//液晶屏--写8位数据函数
//*******************************************************************/
void LCD_WR_DATA(uint8_t data){
	LCD_CS_CLR;  //LCD_CS=0  //片选
	LCD_RS_SET;	 //LCD_RS=1   //设置数据状态
	DB_OUT(data);	
	LCD_WR_CLR;	
	LCD_WR_SET;
	LCD_CS_SET;  //LCD_CS=1   			 
}


//*******************************************************************/
//函数:void LCD_WR_DATA16(uint16_t data)   //写16位数据
//函数功能:写LCD数据
//输入参数:
//data:要写入的值
//*******************************************************************/
void LCD_WR_DATA16(uint16_t data){	
 	LCD_CS_CLR;  //LCD_CS=0  //片选
	LCD_RS_SET;	 //LCD_RS=1   //设置数据状态
	DB_OUT(data>>8);
	LCD_WR_CLR;
	LCD_WR_SET;
	DB_OUT(data);
	LCD_WR_CLR;
	LCD_WR_SET;
	LCD_CS_SET;    //LCD_CS=1
}


//*******************************************************************/
//函数:void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue)  //写液晶屏寄存器
//函数功能:写寄存器
//输入参数: 
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
//*******************************************************************/
void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue){	
	LCD_WR_REG(LCD_Reg);		   //写入要写的寄存器序号	 
	LCD_WR_DATA(LCD_RegValue);//写入数据	    		 
}


//*******************************************************************/
//函数:void LCD_WriteRAM_Prepare(void)   
//函数功能:开始写GRAM  命令
//*******************************************************************/
void LCD_WriteRAM_Prepare(void){
 	LCD_WR_REG(lcddev.wramcmd);	  
}	



//*******************************************************************/
//函数:LCD_WriteRAM(uint16_t RGB_Code)   
//函数功能:写入点阵颜色值
//输入参数:
//RGB_Code:颜色值
//*******************************************************************/
void LCD_WriteRAM(uint16_t RGB_Code){							    
	LCD_RS_SET;
	LCD_CS_CLR;
	DB_OUT(RGB_Code>>8);
	LCD_WR_CLR;
	LCD_WR_SET;
	DB_OUT(RGB_Code&0X00ff);
	LCD_WR_CLR;
	LCD_WR_SET;
	LCD_CS_SET;
}





//********************************************************************************/
//函数:void LCD_DisplayOn(void)
//函数功能:
//LCD开启显示
//*******************************************************************/
void LCD_DisplayOn(void){					   
	LCD_WR_REG(0X29);	//开启显示
}	


//*******************************************************************/
//函数:void LCD_DisplayOff(void)
//函数功能:
//LCD关闭显示
//*******************************************************************/
void LCD_DisplayOff(void){	   
	LCD_WR_REG(0X28);	//关闭显示
} 

//********************************************************************************/
//函数:void LCD_SoftRest(void)
//函数功能:给屏幕发命令,执行软复位命令
//LCD开启显示
//*******************************************************************/
void LCD_SoftRest(void){					   
	LCD_WR_REG(0x01);	//发送软复位命令
	HAL_Delay(100);  // delay 50 ms 
}	


//********************************************************************************/
//函数:void LCD_SoftRest(void)
//函数功能:给屏幕发命令,执行硬复位命令
//LCD开启显示
//*******************************************************************/
void LCD_HardwareRest(void){
	LCD_RST_SET;
	HAL_Delay(10);
	
	LCD_RST_CLR;     //液晶屏复位 --硬复位--使能 
	HAL_Delay(20);   // delay 20 ms 
	LCD_RST_SET;      //液晶屏复位 --硬复位--失能 
	HAL_Delay(20);   // delay 20 ms 
}	



//*******************************************************************/
//函数:void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
//函数功能:设置光标位置
//输入参数:
//Xpos:横坐标
//Ypos:纵坐标
//*******************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos){	 
	LCD_WR_REG(lcddev.setxcmd); 
	LCD_WR_DATA(Xpos>>8); 
	LCD_WR_DATA(Xpos&0XFF);	
  	
	LCD_WR_REG(lcddev.setycmd); 
	LCD_WR_DATA(Ypos>>8); 
	LCD_WR_DATA(Ypos&0XFF);
	
}

         通过调用 Demo_Menu 函数,进行示例的演示。

//****************************************************************************************/
//函数:void Demo_Menu(void)
//功能描述: 演示程序菜单
/****************************************************************************************/
void Demo_Menu(void){

	LCD_Clear(WHITE); //清屏
	
	Draw_Font24B(4,30,RED,"液晶屏测试");

	Draw_Font16B(4,60,BLUE,"1: 电子颜色填充");

	Draw_Font16B(4,80,BLUE,"2: 文字显示");

	Draw_Font16B(4,100,BLUE,"3: 图片显示");

	Draw_Font16B(4,120,RED,"shop155800028.taobao.com");

	HAL_Delay(2000);//延时
		
	Color_Test();       //颜色填充测试
  Font_Test();        //字体字形显示测试
	Show_Picture();     //显示一张图片
	
	
	LCD_Clear(WHITE); //清屏
	LCD_ShowString(0,0,20,20,12,RED,"!#2");
	DisplayButtonUp(5,20,25,35);
	DisplayButtonDown(45,20,65,35);
	LCD_ShowxNum(5,40,99,3,12,RED,0);
	LCD_ShowNum(55,40,888,3,12,RED);
	HAL_Delay(2000);	

}

三、主函数main运行

LCD_Init();           //初始化LCD SPI 接口
	
	
POINT_COLOR =   RED;      //画笔颜色:红色
BACK_COLOR	=	GREEN;	  //字符背景颜色
	
while(1){
		
    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
	Demo_Menu();		//演示程序	
	HAL_Delay(1000);	
}

四、完整代码下载

项目代码下载链接:https://download.csdn.net/download/qq_26043945/90012385

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome离线安装包下载

1、问Chrome的官网:https://www.google.cn/chrome/ 直接下载的是在线安装包,安装需要联网。 2、如果需要在无法联网的设备上安装Chrome,需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址:https://www.google.c…

二进制 分析工具:Radare2、r2frida、Binutils、file、string、as、nm、ldd、objdump、readelf、strip

1、二进制 分析工具 工欲善其事,必先利其器,在二进制安全的学习中,​使用工具尤为重要。遇到一个不熟悉的文件时, 首先要确定 "这是什么类型的文件",回答这个问题的首要原则是,绝不要根据文件的扩…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化,植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础,也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来,用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能,请访问网站,并点击聚焦时出现在地…

Windows系统编程 - 注册表

文章目录 前言注册表介绍打开和关闭注册表RegOpenKeyExRegCloseKey测试案例 创建删除子键RegCreateKeyEx创建子键RegDeleteKey删除子键 写入删除键值RegQueryValueExRegSetValueExRegDeleteValue测试案例 子键和项的枚举RegEnumKeyExRegEnumValueRegQueryInfoKey测试案例 总结 …

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建,本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目; Generic Webhook Trigger 插件 实现代码推送后,触…

Failed to start Docker Application Container Engine

说明: 1)访问应用业务,读取不到数据,show databases;查看数据库报错 2)重启docker服务,服务启动失败,查看日志报错如下图所示 3)报错信息:chmod /data/docker: read-only…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…

Kafka 生产者优化与数据处理经验

Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

Hello-Go

Hello-Go 环境变量 GOPATH 和 GOROOT :不同于其他语言,go中没有项目的说法,只有包,其中有两个重要的路径,GOROOT 和 GOPATH Go开发相关的环境变量如下: GOROOT:GOROOT就是Go的安装目录&…

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难,首先我们可以看到,界面是由答题进度、题目、选项ABCD组成,现在就是要考虑实现方式,答题进度可以使用Textviewprogressbar实现,题目直接使用Textview,…

基于Java Springboot高校工作室管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

React(二)

文章目录 项目地址七、数据流7.1 子组件传递数据给父组件7.1.1 方式一:給父设置回调函数,传递给子7.1.2 方式二:直接将父的setState传递给子7.2 给props传递jsx7.2.1 方式一:直接传递组件给子类7.2.2 方式二:传递函数给子组件7.3 props类型验证7.4 props的多层传递7.5 cla…

浅谈丨功能安全测试,汽车的守护者

随着新能源汽车迅猛的发展,各类车型频频面世,同时辅助驾驶/自动驾驶等智驾功能也在不断迭代,使得整个汽车系统的复杂性越来越高,最终导致消费者不得不对如今的汽车质量和安全性提出质疑。 如何打破质疑? 那就不得不搬…

bridge-multicast-igmpsnooping

# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…

密码学11

概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…

MIT 6.S081 | 操作系统 | Lab1: Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 文章目录 Lab1: Xv6 and Unix utilities实验任务1.启动XV6(easy)2.Sleep(easy)-练手的,就是熟悉一下怎么在xv6项目中加.c文件,生成可执行程序并进行测试的1.解析rm.c2.argc 如何被赋值3.Sleep代码4.makefile编辑5.通过make…

在SpringBoot项目中集成MongoDB

文章目录 1. 准备工作2. 在SpringBoot项目中集成MongoDB2.1 引入依赖2.2 编写配置文件2.3 实体类 3. 测试4. 文档操作4.1 插入操作4.1.1 单次插入4.1.2 批量插入 4.2 查询操作4.2.1 根据id查询4.2.2 根据特定条件查询4.2.3 正则查询4.2.4 查询所有文档4.2.5 排序后返回 4.3 删除…

美团-Leaf ID算法集成到SpringBoot项目

提前准备 下载源码 GitHub地址&#xff1a;https://github.com/Meituan-Dianping/Leaf 下载下来 然后 maven install 安装到本地仓库 再需要用到该ID算法的项目中引入 以下内容 <!-- 本地仓库中的Leaf --> <dependency><artifactId>leaf-boot-starte…

AI+若依框架项目

基础应用篇 1.若依搭建 技术选型 RuoYi-Vue版本&#xff0c;采用了前后端分离的单体架构设计&#xff1a; 软件环境&#xff1a;JDK、MySQL 、Redis 、Maven、Node 技术选型&#xff1a;Spring Boot、Spring Security、MyBatis、Jwt、V 官方推荐 课程版本 JDK > 1.8 …