STM32应用之TFT1.44寸屏ST7735驱动 SPI通信

3 篇文章 0 订阅
3 篇文章 0 订阅

STM32应用之TFT1.44寸屏ST7735驱动

GitHub项目下载链接:点我下载
硬件平台:stm32f103rct和1.44寸128x128 TFT屏(st7735驱动)
IDE:keil MDK

一些可能的问题:
1、首先为了驱动一款TFT屏,理所应当的应该知道屏幕的驱动芯片,比如我们这次使用的TFT屏就是ST7735R的驱动芯片,所以理所应当的要查找芯片手册,ST7735的芯片手册上网查也是一大堆,这个不赘述。
当然,一款驱动芯片不止能驱动一种分辨率,我们使用的就是128x128的屏幕,但这款驱动芯片最低支持132x132的屏幕,这会导致绘图时画面偏移,从芯片手册中可以了解到 ↓↓↓↓↓↓↓

在这里插入图片描述
关于这个问题,我们过后解答,先卖一个关子。

2、ST7735有非常多的命令,对于一个 初学者来说不可能全部看完,所以在初始化代码中会有非常多的命令和参数初始化,我们一般直接使用网上各路前辈的初始化代码(因为实在太多了XD)。

引脚定义:
在这里插入图片描述

BLK:背光控制
RS:就是芯片手册中的 DC(数据与命令)
RST:复位
CS:片选(低电平选中)
SC:接SCLK
DI:接MOSI
GND:地
VCC:最好接3.3v

贴代码:
tft_144.h:

#ifndef _TFT_144_H_
#define _TFT_144_H_

#include "stm32f10x_conf.h"
#include <stdlib.h>

/* parameters */
#define WIDTH  128
#define LENGTH 128

/* pins definitions */
#define LA0	GPIO_Pin_6		// GPIOC
#define LSDI GPIO_Pin_15	// GPIOB
#define LSCL GPIO_Pin_13	// GPIOB
#define LCS GPIO_Pin_12		// GPIOB

#define LA0_SET() GPIOC->BSRR = 1<<6
#define LA0_CLR() GPIOC->BRR = 1<<6

#define LCS_SET() GPIOB->BSRR = 1<<12
#define LCS_CLR() GPIOB->BRR = 1<<12

/* functions */
void TFT_GPIO ( void );		// TFT的GPIO初始化
void TFT_MEM  ( void );		// 显存的分配
void TFT_INIT ( void );		// TFT初始化

#define LCMD 0		// 命令
#define LDAT 1		// 数据
void writeCmdData ( unsigned char Byte, unsigned char opt );

#define RED		0xf800
#define GREEN	0x07e0
#define BLUE	0x001f
#define YELLOW	0xffe0
#define BLACK	0x0000
#define WHITE	0xffff
void setPos( int sx, int ex, int sy, int ey );	// 设置绘图区域
void write2Byte( unsigned int twoByte );		// 写两个字节,因为color数据是16位
void writeAnColor( unsigned int color );		// 填充全屏

#endif

tft_144.c:

#include "tft_144.h"

unsigned short int* LCD_MEM;

void TFT_GPIO ( void ) {

	SPI_InitTypeDef MYSPI;
	GPIO_InitTypeDef TFTIO;

	//时钟使能
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
	//SPI配置
	MYSPI.SPI_Mode = SPI_Mode_Master;
	MYSPI.SPI_CPOL = SPI_CPOL_High;
	MYSPI.SPI_CPHA = SPI_CPHA_2Edge;
	MYSPI.SPI_FirstBit = SPI_FirstBit_MSB;
	MYSPI.SPI_DataSize = SPI_DataSize_8b;
	MYSPI.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
	MYSPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	MYSPI.SPI_NSS = SPI_NSS_Soft;
	SPI_Init( SPI2, &MYSPI );
	SPI_Cmd( SPI2, ENABLE );
	//引脚配置
	TFTIO.GPIO_Mode = GPIO_Mode_Out_PP;
	TFTIO.GPIO_Speed = GPIO_Speed_50MHz;
	TFTIO.GPIO_Pin = LA0;
	GPIO_Init( GPIOC, &TFTIO );
	
	TFTIO.GPIO_Mode = GPIO_Mode_AF_PP;
	TFTIO.GPIO_Speed = GPIO_Speed_50MHz;
	TFTIO.GPIO_Pin = LSDI|LSCL|LCS;
	GPIO_Init( GPIOB, &TFTIO );

}

/* assemble the video memory */
void TFT_MEM  ( void ) {
	LCD_MEM = (unsigned short int*)\
			  malloc( sizeof(unsigned short int)*( WIDTH*LENGTH ) );
}

void TFT_INIT ( void ) {

	TFT_GPIO();
	//TFT_MEM();
	//以下的初始化代码复制粘贴即可,不用深究
	writeCmdData(0x28, LCMD);
	writeCmdData(0x11, LCMD);//Sleep exit 
		
	//ST7735R Frame Rate
	writeCmdData(0xB1, LCMD); 
	writeCmdData(0x01, LDAT); 
	writeCmdData(0x2C, LDAT); 
	writeCmdData(0x2D, LDAT); 

	writeCmdData(0xB2, LCMD); 
	writeCmdData(0x01, LDAT); 
	writeCmdData(0x2C, LDAT); 
	writeCmdData(0x2D, LDAT); 

	writeCmdData(0xB3, LCMD); 
	writeCmdData(0x01, LDAT); 
	writeCmdData(0x2C, LDAT); 
	writeCmdData(0x2D, LDAT); 
	writeCmdData(0x01, LDAT); 
	writeCmdData(0x2C, LDAT); 
	writeCmdData(0x2D, LDAT); 
	
	writeCmdData(0xB4, LCMD); //Column inversion 
	writeCmdData(0x07, LDAT); 
	
	//ST7735R Power Sequence
	writeCmdData(0xC0, LCMD); 
	writeCmdData(0xA2, LDAT); 
	writeCmdData(0x02, LDAT); 
	writeCmdData(0x84, LDAT); 
	writeCmdData(0xC1, LCMD); 
	writeCmdData(0xC5, LDAT); 

	writeCmdData(0xC2, LCMD); 
	writeCmdData(0x0A, LDAT); 
	writeCmdData(0x00, LDAT); 

	writeCmdData(0xC3, LCMD); 
	writeCmdData(0x8A, LDAT); 
	writeCmdData(0x2A, LDAT); 
	writeCmdData(0xC4, LCMD); 
	writeCmdData(0x8A, LDAT); 
	writeCmdData(0xEE, LDAT); 
	
	writeCmdData(0xC5, LCMD); //VCOM 
	writeCmdData(0x0E, LDAT); 
	
	writeCmdData(0x36, LCMD); //MX, MY, RGB mode 
	writeCmdData(0xC8, LDAT); //竖屏C8 横屏08 A8	
	
	//ST7735R Gamma Sequence
	writeCmdData(0xe0, LCMD); 
	writeCmdData(0x0f, LDAT); 
	writeCmdData(0x1a, LDAT); 
	writeCmdData(0x0f, LDAT); 
	writeCmdData(0x18, LDAT); 
	writeCmdData(0x2f, LDAT); 
	writeCmdData(0x28, LDAT); 
	writeCmdData(0x20, LDAT); 
	writeCmdData(0x22, LDAT); 
	writeCmdData(0x1f, LDAT); 
	writeCmdData(0x1b, LDAT); 
	writeCmdData(0x23, LDAT); 
	writeCmdData(0x37, LDAT); 
	writeCmdData(0x00, LDAT); 	
	writeCmdData(0x07, LDAT); 
	writeCmdData(0x02, LDAT); 
	writeCmdData(0x10, LDAT); 

	writeCmdData(0xe1, LCMD); 
	writeCmdData(0x0f, LDAT); 
	writeCmdData(0x1b, LDAT); 
	writeCmdData(0x0f, LDAT); 
	writeCmdData(0x17, LDAT); 
	writeCmdData(0x33, LDAT); 
	writeCmdData(0x2c, LDAT); 
	writeCmdData(0x29, LDAT); 
	writeCmdData(0x2e, LDAT); 
	writeCmdData(0x30, LDAT); 
	writeCmdData(0x30, LDAT); 
	writeCmdData(0x39, LDAT); 
	writeCmdData(0x3f, LDAT); 
	writeCmdData(0x00, LDAT); 
	writeCmdData(0x07, LDAT); 
	writeCmdData(0x03, LDAT); 
	writeCmdData(0x10, LDAT);  
	
	writeCmdData(0xF0, LCMD); //Enable test command  
	writeCmdData(0x01, LDAT); 
	writeCmdData(0xF6, LCMD); //Disable ram power save mode 
	writeCmdData(0x00, LDAT); 
	
	writeCmdData(0x3A, LCMD); //65k mode 
	writeCmdData(0x05, LDAT); 
	
	writeCmdData(0x29, LCMD);//Display on
	
	writeAnColor( YELLOW );

}

void writeCmdData ( unsigned char Byte, unsigned char opt ) {
	//根据opt设置传入的是数据还是命令
	if ( opt == LCMD ) {
		LA0_CLR();
	} else if ( opt == LDAT ) {
		LA0_SET();
	}
	LCS_CLR();		//低电平使能
	SPI_I2S_SendData( SPI2, Byte );
	while( !( (SPI2->SR)&(SPI_I2S_FLAG_TXE) ) );
	LCS_SET();		//取消片选
}

void setPos( int sx, int ex, int sy, int ey ) {
	// X轴
	// 注意这里的“sx+2”,就是之前所说的偏移问题的解决方法
	writeCmdData( 0x2a, LCMD );
	writeCmdData( 0x00, LDAT );
	writeCmdData( sx+2, LDAT );
	writeCmdData( 0x00, LDAT );
	writeCmdData( ex+2, LDAT );
	// Y轴
	writeCmdData( 0x2b, LCMD );
	writeCmdData( 0x00, LDAT );
	writeCmdData( sy+3, LDAT );
	writeCmdData( 0x00, LDAT );
	writeCmdData( ey+3, LDAT );
	// 很重要!最后的写入命令
	writeCmdData( 0x2c, LCMD );
}

void write2Byte( unsigned int twoByte ) {
 	// 根据芯片手册可知先传输高8位,后传输低8位,总共16位
	writeCmdData( twoByte>>8, LDAT );
	writeCmdData( twoByte, LDAT );
}

void writeAnColor( unsigned int color ) {
	unsigned char x = 0;
	unsigned char y = 0;
	setPos( 0, 127, 0, 127 );
	for ( y = 0; y < LENGTH; y++ ) {
		for ( x = 0; x < WIDTH; x++ ) {
			write2Byte( color );
		}
	}
}

main.c

#include <stdio.h>
#include "stm32f10x_conf.h"
/* User's inc */
#include "tft_144.h"

int main () {

	TFT_INIT();
	
	while ( 1 );
	
}

  • 16
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 屏幕 要驱动1.44寸TFT屏幕,需要使用STM32的硬件SPI接口。首先,需要连接TFT屏幕的引脚到STM32SPI接口引脚上。然后,需要编写SPI驱动程序来控制TFT屏幕的显示。 在编写SPI驱动程序时,需要设置SPI接口的时钟频率、数据位数、传输模式等参数。然后,可以使用SPI接口发送命令和数据到TFT屏幕,以控制其显示内容。 需要注意的是,不同型号的TFT屏幕可能有不同的控制方式和命令格式,因此需要根据具体的TFT屏幕型号来编写相应的驱动程序。 ### 回答2: STM32是一款主流的单片机,而1.44寸TFT是一款常用的LCD显示屏,通过硬件SPI驱动TFT可以在STM32应用中起到重要作用。下面我们来探讨一下STM32硬件SPI驱动1.44寸TFT的具体过程。 1. 硬件准备 首先,我们需要准备好TFT显示屏和STM32单片机。TFT显示屏一般会有一个标准的SPI接口,具体接口可以参考显示屏的规格书。STM32单片机有多个SPI接口,我们需要确认使用哪个接口,并在程序中进行相应的配置。 2. 硬件连接 将TFT显示屏的SPI接口与STM32单片机的对应SPI接口连接起来,通常需要连接SCK、MISO、MOSI、CS、DC、RESET等信号。 3. 编写驱动程序 接下来,我们需要编写STM32硬件SPI驱动1.44寸TFT的程序。首先需要进行SPI初始化配置,包括时钟、数据大小、模式等的设置。对于1.44寸TFT,一般涉及到的操作有初始化、设置像素、设置画面方向、显示字符串等。 4. 调试测试 编写完程序之后,需要进行调试测试。可以通过串口打印调试信息,查看TFT是否能够正常显示。同时也需要注意常见的调试错误,例如信号连接不良、SPI时钟频率设置错误等。 综上所述,STM32硬件SPI驱动1.44寸TFT需要进行硬件准备、硬件连接、编写驱动程序以及调试测试等步骤。只有在各个步骤都正确无误的情况下,TFT才能够正常显示,驱动程序也才能够正常执行。因此需要仔细对待每一个步骤,确保程序的顺利实现。 ### 回答3: STM32是一种常用的微控制器,常常用于控制多种电子设备。硬件SPI驱动可以实现电子设备的串行数据传输,因此STM32硬件SPI驱动1.44寸TFT就成为了一个常见的应用场景。 1.44寸TFT是一种基于微处理器的彩色液晶显示屏,广泛用于电子设备中显示文本、图像和动画等。它与STM32通过硬件SPI进行数据传输,有以下几个关键问题需要注意: 1. 通信协议的设置。STM32硬件SPI支持多种通信协议,必须根据TFT的通信协议来设置SPI通信模式。通常情况下,TFT使用的是SPI模式3,采用极性为1和相位为1的通信方式。 2. 数据传输的格式。TFT数据传输格式通常是字节序传输,需要将发送的数据按照特定的格式进行打包,然后通过SPI通信口发送到TFT。此时可以使用STM32SPI数据寄存器,以并行的方式实现数据的快速传输。 3. 时钟频率的设置。SPI通信的时钟频率影响数据传输速度,需要根据TFT的工作时钟频率和数据传输要求设置SPI时钟频率。在设置时钟频率时需要注意SPI时序的要求,以确保数据传输的正确性。 基于上述问题,STM32硬件SPI驱动1.44寸TFT需要实现以下几个步骤: 1. 初始化SPI通信模式。根据TFT的通信协议,设置SPI通信模式为模式3,并设置极性和相位。 2. 打包数据格式。根据TFT的数据传输格式,将需要传输的数据按照特定的格式打包,以便能够快速地发送给TFT。 3. 设置时钟频率。根据TFT的时钟频率和数据传输要求,设置SPI的时钟频率。 4. 启动SPI数据传输。使用STM32SPI数据寄存器,通过硬件SPI实现数据的快速传输。 总之,STM32硬件SPI驱动1.44寸TFT需要注意SPI通信协议、数据传输格式、时钟频率和数据传输寄存器的设置,以确保数据能够正确地传输到TFT并显示出来。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值