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

        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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机,执行虚机分配,现有文档仅提供window环境安装,如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal,我本地使用iTerm2;本地安装XQuartz,作为…

【每天学点AI】实战图像增强技术在人工智能图像处理中的应用

图像增强(Image Enhancement)是人工智能和计算机视觉中一项重要的技术,也是人工智能数据集预处理的一个重要步骤。它旨在提高图像的质量,使其在视觉上更加清晰、细节更丰富。这项技术在自动驾驶、医疗诊断、安防监控等领域有着广泛…

hbase mongodb hive starrocks比较

本文是在学习大数据的几个数据存储系统相关的组件所记录下来的,主要是不同组件的基础概念初步了解与对比。 NoSql 在大数据时代,虽然RDBMS很优秀,但是面对快速增长的数据规模和日渐复杂的数据模型,RDBMS渐渐力不从心&#xff0c…

STM32端口模拟编码器输入

文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…

wireshark使用lua解析自定义协议

wireshark解析自定义协议 1.自定义的lua放入路径2.修改init.lua2.1 开启lua2.2 init.lua文件最后加入自己的lua文件位置,这里需要确保与自己的文件名相同 3.编写lua4.编写c抓包5.wireshark添加自定义协议如何加调试信息 1.自定义的lua放入路径 一般是自己软件的安装…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等,使用docker发布的优势有以下几点: 易于维护。直接docker命令进行管理,如docker stop、docker start等,快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日,第十三届中国创新创业大赛(广东广州赛区)暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍:广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛(广东广州赛区…

FreeRTOS——消息队列

目录 一、概念及其作用 1.1概念 1.2特点 1.3工作原理 二、相关API 2.1创建队列 2.2任务中写队列 2.3任务中读队列 2.4中断中写队列 2.5中断中读队列 三、实现原理 3.1消息队列控制块 3.2消息队列的创建 3.3消息的发送 3.3.1任务中发送 3.3.2中断中发送 3.4消息的…

11 —— 打包模式的应用

需求:在开发模式下想让webpack使用style-loader进行css样式的处理;让它把css代码内嵌在js中;在生产模式下提取css代码 —— 判断当前运行命令时所在的环境 方案:借助cross-env全局软件包,设置参数区分打包运行环境 …

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程:(exec系列) 创建新进程: 测试代码: 测试结果: 三、进程控制函数三 结束进程: 测试代码: 测试结果: 四、…

C#实现blob分析——分别基于OpenCvSharp和Emgu实现

需求和效果预览 对于下图,需要检测左右两侧是否断开: 解决分析 设置左右2个ROI区域,找到ROI内面积最大的连通域,通过面积阈值和连通域宽高比判定是否断开。 可能遇到的问题:部分区域反光严重,二值化阈值不…

ZYNQ-7020嵌入式系统学习笔记(1)——使用ARM核配置UART发送Helloworld

本工程实现调用ZYNQ-7000的内部ARM处理器,通过UART给电脑发送字符串。 硬件:正点原子领航者-7020 开发平台:Vivado 2018、 SDK 1 Vivado部分操作 1.1 新建工程 设置工程名,选择芯片型号。 1.2 添加和配置PS IP 点击IP INTEGR…

冲破AI 浪潮冲击下的 迷茫与焦虑

在这个科技日新月异的时代,人工智能如汹涌浪潮般席卷而来,不断改变我们的生活。你是否对 AI 充满好奇,却不知它将如何改变你的工作与生活?又是否会在 AI 浪潮的冲击下陷入迷茫与焦虑?《AI 时代:弯道超车新思…

【FRP 内网穿透 从0到1 那些注意事项】

【摘要】 最近跟第三方团队调试问题,遇到一个比较烦的操作。就是,你必须要发个版到公网环境,他们才能链接到你的接口地址,才能进行调试。按理说,也没啥,就是费点时间。但是,在调试的时候&#…

基于SpringBoot+RabbitMQ完成应⽤通信

前言: 经过上面俩章学习,我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…

进度条程序

目录 1.回车与换行 2.缓冲区 强制刷新:fflush 策略 3.倒计时程序 4.进度条 4.1先做一下基本的准备工作 4.2现在我们正式来实现 进度: 比率: 旋转光标 表明动态变化: 4.3如果我们要完成一个下载任务 4.3.1实现: 4.3.2光标显示: 4.3.2.1证明一下&#…

软件测试——自动化测试常见函数

在上一篇文章软件测试——自动化测试概念篇-CSDN博客中,给大家演示了一下自动化程序,而本篇文章会带大家详细学习selenium库。 selenium库是python官方的库,里面包含了很多操控浏览器的函数。 本节重点 元素定位操作测试对象窗口等待导航弹…

STM32F103C8T6实时时钟RTC

目录 前言 一、RTC基本硬件结构 二、Unix时间戳 2.1 unix时间戳定义 2.2 时间戳与日历日期时间的转换 2.3 指针函数使用注意事项 ​三、RTC和BKP硬件结构 四、驱动代码解析 前言 STM32F103C8T6外部低速时钟LSE(一般为32.768KHz)用的引脚是PC14和PC…

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下,社交媒体成为品牌营销的主战场。然而,面对海量的用户数据和日益复杂的运营需求,传统营销方法显得力不从心。AI社媒引流王应运而生,帮助企业在多平台中精准触达目标用户,提升营销效率和效果。 1.…

知识中台:提升企业知识管理的智能化水平

在数字化转型的浪潮中,企业知识管理的智能化水平成为提升竞争力的关键。HelpLook知识中台通过集成先进的AI技术,为企业提供了一个智能化的知识管理平台。 一、知识管理智能化的重要性 智能化的知识管理不仅能够提高信息检索的效率,还能通过…