单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

这篇具有很好参考价值的文章主要介绍了单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

说明:此篇为学习记录。可能存在错误或者不足。如有问题请指出。

硬件环境

主控芯片:STM32F411CEU6
主控开发板:WeAct STM32F411CEU6最小系统板
TFT-LCD屏幕:合宙1.8寸TFT-LCD,驱动为ST7735s

软件环境

MDK版本:5,32
HAL库版本:1.27.1
STM32CubeMX版本:6.7.0

从手册了解一些必要信息

ST7735s支持8080并口,3线和4线串行接口,模块的驱动方式是4线串行驱动方式也就是四线类SPI通信方式。
手册内容很多,这里简单记录必要的信息。

读写模式以及时序

st7735 并口,单片机,单片机,stm32,嵌入式硬件

1、四线通信方式下,D/CX(DC,D/C)引脚拉低表示命令,拉高表示数据。
2、高位在前
3、片选(CS,CSX)拉低(下降沿)为选中

st7735 并口,单片机,单片机,stm32,嵌入式硬件

和SPI时序相同,不过数据线只有一条,必须接到MOSI上。

st7735 并口,单片机,单片机,stm32,嵌入式硬件

1、向模块读数据时,需要主机先发送指令,然后st7735向主机发送数据,需要拉高CS在其期间直到下个指令。
注:读数据很少用到。

显示缓存(frame memory)寻址

st7735 并口,单片机,单片机,stm32,嵌入式硬件

1、128x160分辨率下,行寻址范围为0-159,列寻址范围为0-127,超过这个范围模块不接受。
2、行列以及扫描顺序都可以镜像翻转,通过配置MADCTL的MY,MX,ML,MH实现。
3、颜色通道可配置为RGB或者BGR模式,通过MADCTL的RGB位可配置。
4、补充,st7735可选择12-bit、16-bit、18-bit即,2k(RGB444)、65K(RGB565)、262k(RGB666)颜色模式。

显示模式

st7735 并口,单片机,单片机,stm32,嵌入式硬件

写入显示缓存前需要指定显示窗口,通过xs,xe,ys,ye设置,完成窗口设置后将像素数据按照扫描方式写入缓存即可进行显示。

st7735 并口,单片机,单片机,stm32,嵌入式硬件
st7735 并口,单片机,单片机,stm32,嵌入式硬件

这几张图说明在控制器缓存和模块写方向都是从左到右、上到下的情况下,MX,MY,MV这几个不同值下的显示情况,如果发现屏幕显示不全或者(0,0)点不是期待的位置可按照这个图重新配置MX,MY,MV这几位的值。

一些指令的解释和初始化程序

这里不放手册的图了,太多了。

st7735 并口,单片机,单片机,stm32,嵌入式硬件
手册上的命令太多了,看麻了,以上几个是可能用到的,如果有需要看手册第十章即可。

void LCD_Init(void)
{
#if USE_SIM_SPI
    LCD_SIM_SPI_GPIO_Init();
#endif
	LCD_RES_0();//复位
	HAL_Delay(100);
	LCD_RES_1();
	HAL_Delay(100);
	
	LCD_BLK_1();//打开背光
    HAL_Delay(100);
	
	//************* Start Initial Sequence **********//
	LCD_SPI_Send_Cmd(0x11); //Sleep out 
	HAL_Delay(120);              //Delay 120ms 
	//------------------------------------ST7735S 帧率设置-----------------------------------------// 
	LCD_SPI_Send_Cmd(0xB1); 
	LCD_SPI_Send_Data_8(0x01); 
	LCD_SPI_Send_Data_8(0x2C); 
	LCD_SPI_Send_Data_8(0x2D); 
	LCD_SPI_Send_Cmd(0xB2); 
	LCD_SPI_Send_Data_8(0x01);
	LCD_SPI_Send_Data_8(0x2C); 
	LCD_SPI_Send_Data_8(0x2D); 
	LCD_SPI_Send_Cmd(0xB3); 
	LCD_SPI_Send_Data_8(0x01); 
	LCD_SPI_Send_Data_8(0x2C); 
	LCD_SPI_Send_Data_8(0x2D); 
	LCD_SPI_Send_Data_8(0x01); 
	LCD_SPI_Send_Data_8(0x2C); 
	LCD_SPI_Send_Data_8(0x2D); 
	//------------------------------------End ST7735S Frame Rate---------------------------------// 
	LCD_SPI_Send_Cmd(0xB4); //Dot inversion 
	LCD_SPI_Send_Data_8(0x07); 
	//------------------------------------ST7735S 功率设置---------------------------------// 
	LCD_SPI_Send_Cmd(0xC0); 
	LCD_SPI_Send_Data_8(0xA2); 
	LCD_SPI_Send_Data_8(0x02); 
	LCD_SPI_Send_Data_8(0x84); 
	LCD_SPI_Send_Cmd(0xC1); 
	LCD_SPI_Send_Data_8(0xC5); 
	LCD_SPI_Send_Cmd(0xC2); 
	LCD_SPI_Send_Data_8(0x0A); 
	LCD_SPI_Send_Data_8(0x00); 
	LCD_SPI_Send_Cmd(0xC3); 
	LCD_SPI_Send_Data_8(0x8A); 
	LCD_SPI_Send_Data_8(0x2A); 
	LCD_SPI_Send_Cmd(0xC4); 
	LCD_SPI_Send_Data_8(0x8A); 
	LCD_SPI_Send_Data_8(0xEE); 
	//---------------------------------End ST7735S Power Sequence-------------------------------------// 
	LCD_SPI_Send_Cmd(0xC5); //VCOM 
	LCD_SPI_Send_Data_8(0x0E); 
	LCD_SPI_Send_Cmd(0x36);//0x00 0x80 0x40 0xc0 0x20 0xA0 0x60 0xE0; 
	LCD_SPI_Send_Data_8(0x00);

	//------------------------------------ST7735S Gamma Sequence---------------------------------// 
    LCD_SPI_Send_Cmd(0xE0); 
	LCD_SPI_Send_Data_8(0x04); 
	LCD_SPI_Send_Data_8(0x22); 
	LCD_SPI_Send_Data_8(0x07); 
	LCD_SPI_Send_Data_8(0x0A); 
	LCD_SPI_Send_Data_8(0x2E); 
	LCD_SPI_Send_Data_8(0x30); 
	LCD_SPI_Send_Data_8(0x25); 
	LCD_SPI_Send_Data_8(0x2A); 
	LCD_SPI_Send_Data_8(0x28); 
	LCD_SPI_Send_Data_8(0x26); 
	LCD_SPI_Send_Data_8(0x2E); 
	LCD_SPI_Send_Data_8(0x3A); 
	LCD_SPI_Send_Data_8(0x00); 
	LCD_SPI_Send_Data_8(0x01); 
	LCD_SPI_Send_Data_8(0x03); 
	LCD_SPI_Send_Data_8(0x13); 
	LCD_SPI_Send_Cmd(0xE1); 
	LCD_SPI_Send_Data_8(0x04); 
	LCD_SPI_Send_Data_8(0x16); 
	LCD_SPI_Send_Data_8(0x06); 
	LCD_SPI_Send_Data_8(0x0D); 
	LCD_SPI_Send_Data_8(0x2D); 
	LCD_SPI_Send_Data_8(0x26); 
	LCD_SPI_Send_Data_8(0x23); 
	LCD_SPI_Send_Data_8(0x27); 
	LCD_SPI_Send_Data_8(0x27); 
	LCD_SPI_Send_Data_8(0x25); 
	LCD_SPI_Send_Data_8(0x2D); 
	LCD_SPI_Send_Data_8(0x3B); 
	LCD_SPI_Send_Data_8(0x00); 
	LCD_SPI_Send_Data_8(0x01); 
	LCD_SPI_Send_Data_8(0x04); 
	LCD_SPI_Send_Data_8(0x13); 
	//------------------------------------End ST7735S Gamma Sequence-----------------------------// 
	LCD_SPI_Send_Cmd(0x3A); //65k mode 
	LCD_SPI_Send_Data_8(0x05); 
	LCD_SPI_Send_Cmd(0x29); //Display on 
}

帧率和功率,伽马设置无需理解。

CubeMX配置以及SPI通信部分源码

st7735 并口,单片机,单片机,stm32,嵌入式硬件

时钟不要太高,不要超过14M,硬件SPI情况下有可能会初始化不成功,加一些延时即可。

#if USE_SIM_SPI
void LCD_SIM_SPI_GPIO_Init(void)
{
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pins : PBPin PBPin PBPin */
  GPIO_InitStruct.Pin = SPI_SIM_SDA_PIN|SPI_SIM_SCL_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void LCD_Writ_Bus(unsigned char dat)
{
    unsigned char i;
	LCD_CS_0();
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_0();
		if(dat&0x80)
		{
		   LCD_MOSI_1();
		}
		else
		{
		   LCD_MOSI_0();
		}
		LCD_SCLK_1();
		dat<<=1;
	}	
  LCD_CS_1();	
}

void LCD_WR_DATA(unsigned char dat)
{
    LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}

void LCD_WR_DATA8(unsigned char dat)
{
    LCD_Writ_Bus(dat);
}

void LCD_WR_REG(unsigned char dat)
{
    LCD_DC_0();//写命令
	LCD_Writ_Bus(dat);
	LCD_DC_1();//写数据
}

void LCD_SPI_Send_Cmd(unsigned char CMD)
{
    LCD_WR_REG(CMD);
}

void LCD_SPI_Send_Data_8(unsigned char data)
{
    LCD_WR_DATA8(data);
}

void LCD_SPI_Send_Data_816(unsigned int data)
{
    LCD_WR_DATA(data);
}
#else
/********************************************
@Function name;             void LCD_SPI_Send_Cmd(unsigned char CMD)
@Function description;      LCD发送指令
@Function input;
@Function output;
@Date;
*********************************************/
/**********FUNTCTION NOTICE********

**************************/
void LCD_SPI_Send_Cmd(unsigned char CMD)
{   
    LCD_CS_0();
    LCD_DC_0();  
    HAL_SPI_Transmit(&hspi2, &CMD, 1, 0xffff);
    LCD_CS_1();  
   // HAL_Delay(1);
}

/********************************************
@Function name;		    void LCD_SPI_Send_Data_8(unsigned char data)
@Function description;	发送八位数据
@Function input;		
@Function output;		
@Date;			
*********************************************/
/**********FUNTCTION NOTICE********

**************************/
void LCD_SPI_Send_Data_8(unsigned char data)
{
    LCD_CS_0();
    LCD_DC_1();
    HAL_SPI_Transmit(&hspi2, &data, 1, 0xffff);
    LCD_CS_1();
   // HAL_Delay(1);
}

/********************************************
@Function name;		   void LCD_SPI_Send_Data_16(unsigned int data) 
@Function description;	发送十六位数据
@Function input;		
@Function output;		
@Date;			特别注意很少需要直接发送十六位数据,RGB565模式下发送像素数据需要。
*********************************************/
/**********FUNTCTION NOTICE********

**************************/
void LCD_SPI_Send_Data_16(unsigned int data)
{
    LCD_SPI_Send_Data_8(data >> 8);
    LCD_SPI_Send_Data_8(data);
}
#endif

附件:参考手册以及例程(来自合宙Lua社区,其实就是中景园的例程)

Lua社区:https://doc.openluat.com/wiki/21?wiki_page_id=2650
例程下载:https://cdn.openluat-luatcommunity.openluat.com/attachment/20211112203446851_ST7735_1.8LCD%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81_%E5%90%88%E5%AE%99.zip
或者去合宙淘宝店找下也可以。文章来源地址https://www.toymoban.com/news/detail-772121.html

到了这里,关于单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F4单片机实现接收超时中断+DMA实现串口的不定长接收和DMA发送

    环形缓冲区+定时器超时中断的方式 优点 环形缓冲区可以接收多帧数据 数据帧超时间隔可以设置 缺点 设备任务比较繁重时,使用中断接收可能会丢失数据。尤其是在长时间关闭中断或者串口中断优先级不高时 频繁进出中断。在使用RTOS的系统中,每收到一个数据就会进行一

    2024年02月15日
    浏览(28)
  • STM32F4X USART串口使用

    串口是MCU与外部通信的重要通信接口,也是MCU在开发过程中的调试利器。串口通信有几个重要的参数,分别是波特率、起始位、数据位、校验位。双方在进行串口通信前必须要约定好通信的参数,否则会导致通信失败。 起始位是自动产生,无需配置,通常是产生一个低电平为

    2024年02月11日
    浏览(14)
  • STM32F4X 定时器中断

    定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外,定时器还可以跟GPIO结合使用,利用定时器产生PWM波形,利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法,定时功能。 STM32F4X将定时器分成3类,分别是基本定时器,

    2024年02月12日
    浏览(18)
  • STM32F4X 独立看门狗 IWDG

    我们都知道,当一个嵌入式在运行过程中发生死机或者程序跑飞的情况的时候,我们一般都是要手动进行开关机或者复位,让程序能够重新运行。但是当一个嵌入式系统被安装到一些特殊位置时,如果发生了死机又不能及时进行手动复位,这时候就需要看门狗了。看门狗的作

    2024年02月11日
    浏览(18)
  • STM32F4X RNG随机数发生器

    随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机数被广泛应用于密码学、模拟实验、游戏开发领域等。 RNG的控制寄存器的bit0使能随机数发生器是否工作,bit1则使能是否使用中断 状态寄存器是判断随机数

    2024年02月10日
    浏览(20)
  • STM32F4X SDIO(四) SDIO控制器

    STM32F4X内部有一个SDIO控制器,开发者可以使用这个控制器跟SD卡进行通信,下面就来简单了解一下STM32F4X的SDIO控制器的使用。 下图为STM32F4X的SDIO控制器框图,框图可以分为以下5部分, 适配器寄存器 、 FIFO 、 控制单元 、 命令路径 、 数据路径 。 SDIO控制器时钟 STM32F4X的所有

    2024年02月07日
    浏览(23)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(23)
  • 【单片机】STM32单片机,定时器的输入捕获,基于捕获的频率计,STM32F103

    下面的定时器都具有输入捕获能力: 查看另一篇文章:https://qq742971636.blog.csdn.net/article/details/131471539 外部计数频率计的缺点:需要两个定时器配合,最高能测量的频率是否有限制我没具体尝试。 基于捕获的频率计的缺点:最高能测量的频率有限制。 TIM3_CH1 PWM PA6 10KHZ。 输入

    2024年02月14日
    浏览(23)
  • 【单片机学习笔记】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc环境搭建

    为摒弃在接受keil邮件,研究了下gun编译,以STM32F407为例,简单记录 Git 选择对应版本直接安装即可https://git-scm.com/download/win make gcc ​ 1)将上述软件包放置于C盘根目录 2)添加环境变量 3)cmd命令行测试环境 分别输入 启动文件及LD文件 目录路径表示问题 字节对齐及指定位置存

    2024年02月07日
    浏览(22)
  • STM32F103单片机通过SPI全双工通信协议与W25Q64(FLASH)进行通信【串行同步通信(数据线与时钟线配合),(一主多从模式)】附相关驱动代码详解

    1.W25Qxx系列是一种低成本、小型化、使用简单的 非易失性存储器 ,常应用于数据存储、字库存储、固件程序存储等场景 2.存储介质: Nor Flash(闪存) 3.时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 4.存储容量(24位地址): W25Q40: 4Mbit / 512KByte W25Q80: 8Mbit / 1MByte W25Q16: 16

    2024年04月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包