单片机: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通信方式。
手册内容很多,这里简单记录必要的信息。

读写模式以及时序

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

显示缓存(frame memory)寻址

在这里插入图片描述

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)颜色模式。

显示模式

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述
手册上的命令太多了,看麻了,以上几个是可能用到的,如果有需要看手册第十章即可。

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通信部分源码

在这里插入图片描述

时钟不要太高,不要超过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
或者去合宙淘宝店找下也可以。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
STM32f1系列的单片机可以通过不同的接口来驱动液晶屏幕,常用的接口有GPIO、SPI、I2C等。下面以SPI接口为例介绍如何驱动液晶屏幕。 首先需要了解液晶屏幕的接口类型,一般有8位并行接口、16位并行接口、SPI接口、I2C接口等。其中SPI接口是最常用的一种,它只需要四条线就可以完成数据传输,分别是时钟线(SCK)、数据线(MOSI)、片选线(CS)和数据/命令选择线(DC)。 在STM32f1单片机中,要使用SPI接口需要先初始化SPI控制器,然后配置相关的引脚用于SPI通信。初始化SPI控制器需要设置SPI的时钟分频、数据位数、工作模式等参数,具体的代码可以参考以下示例: ```c SPI_HandleTypeDef hspi; void MX_SPI1_Init(void) { /* SPI1 parameter configuration*/ hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_MASTER; hspi.Init.Direction = SPI_DIRECTION_2LINES; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; hspi.Init.NSS = SPI_NSS_SOFT; hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.TIMode = SPI_TIMODE_DISABLE; hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi) != HAL_OK) { Error_Handler(); } } ``` 上述代码初始化了SPI1控制器,并设置了以下参数: - 工作模式为主机模式(SPI_MODE_MASTER) - 数据传输方向为双向全双工模式(SPI_DIRECTION_2LINES) - 数据位数为8位(SPI_DATASIZE_8BIT) - 时钟极性为低电平空闲(SPI_POLARITY_LOW) - 时钟相位为第一边沿(SPI_PHASE_1EDGE) - NSS信号使用软件控制(SPI_NSS_SOFT) - 波特率分频系数为256(SPI_BAUDRATEPRESCALER_256) - 数据传输顺序为MSB优先(SPI_FIRSTBIT_MSB) 接下来需要配置SPI控制器的引脚,以便进行数据传输。这里以SPI1控制器为例,假设SCK信号使用PB3引脚,MOSI信号使用PB5引脚,CS信号使用PA4引脚,DC信号使用PA5引脚,那么对应的代码如下: ```c void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pin : PA4 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PA5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PB3 PB5 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` 上述代码初始化了SPI1控制器的引脚,并设置了PA4和PA5引脚为输出模式,用于控制液晶屏幕的CS和DC信号。PB3和PB5引脚设置为复用推挽输出模式,用于SPI1的SCK和MOSI信号。 接下来就可以通过SPI接口向液晶屏幕发送数据了,液晶屏幕的控制命令和图像数据分别需要通过DC信号进行区分。具体的代码可以参考以下示例: ```c void LCD_Write_Cmd(uint8_t cmd) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi, &cmd, 1, 1000); } void LCD_Write_Data(uint8_t data) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_SPI_Transmit(&hspi, &data, 1, 1000); } ``` 上述代码中,LCD_Write_Cmd函数用于向液晶屏幕发送控制命令,LCD_Write_Data函数用于向液晶屏幕发送图像数据。其中,HAL_SPI_Transmit函数用于向SPI总线发送数据,第一个参数是SPI控制器的句柄,第二个参数是要发送的数据缓冲区,第三个参数是要发送的数据长度,第四个参数是超时时间。 以上就是STM32f1单片机对液晶屏幕的显示驱动的基本介绍,具体的实现方式需要根据液晶屏幕的具体型号和接口类型进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ydon?tkwhmeIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值