使用STM32F103C8T6单片机的SPI接口连接1.8寸TFT屏幕

一.单片机连接TFT屏幕

使用的是购买屏幕时附带的驱动文件

1.在cube中配置stm32

        首先配置单片机时钟,如图

        然后将时钟设置为72MHz

        下面开始配置引脚,我使用的屏幕共八个引脚,所以除去电源和地之外,需要配置六个引脚,首先配置连接CS,DC,BLK和RST的引脚,分别为PB3,PB4,PB5和PB6,均为输出模式

        其次,配置单片机和屏幕的通信引脚,这里使用stm32的SPI接口,屏幕的SDA引脚接SPI2_MOSI,选择工作模式并打开中断

        设置DMA,点击Add后选择SPI2_TX

        六个引脚就配置好了,生成keil的工程之后直接添加驱动文件

2.在keil中添加驱动

        直接把驱动文件添加到用户文件夹下即可

部分代码如下

#define CS_GPIO GPIO_PIN_3
#define CS_GPIO_PORT GPIOB

#define CMD_DATA_GPIO GPIO_PIN_4
#define CMD_DATA_GPIO_PORT GPIOB

#define BACK_LED_GPIO GPIO_PIN_5
#define BACK_LED_GPIO_PORT GPIOB

#define RESET_GPIO GPIO_PIN_6
#define RESET_GPIO_PORT GPIOB


#define CS_HIGH   HAL_GPIO_WritePin(CS_GPIO_PORT, CS_GPIO, GPIO_PIN_SET)
#define CS_LOW    HAL_GPIO_WritePin(CS_GPIO_PORT, CS_GPIO, GPIO_PIN_RESET)

#define DATA      HAL_GPIO_WritePin(CMD_DATA_GPIO_PORT, CMD_DATA_GPIO, GPIO_PIN_SET)
#define COMMAND   HAL_GPIO_WritePin(CMD_DATA_GPIO_PORT, CMD_DATA_GPIO, GPIO_PIN_RESET)

#define RSTH      HAL_GPIO_WritePin(RESET_GPIO_PORT, RESET_GPIO, GPIO_PIN_SET)
#define RSTL      HAL_GPIO_WritePin(RESET_GPIO_PORT, RESET_GPIO, GPIO_PIN_RESET)

#define LEDH      HAL_GPIO_WritePin(BACK_LED_GPIO_PORT, BACK_LED_GPIO, GPIO_PIN_SET)
#define LEDL      HAL_GPIO_WritePin(BACK_LED_GPIO_PORT, BACK_LED_GPIO, GPIO_PIN_RESET)


void TFT_WRITE_DATA(uint8_t data)
{
	CS_LOW;
	DATA;
	HAL_SPI_Transmit_DMA(&hspi2,&data,1);
	CS_HIGH;
}

void TFT_WRITE_COMMAND(uint8_t command)
{
	CS_LOW;
	COMMAND;
	HAL_SPI_Transmit_DMA(&hspi2,&command,1);
	CS_HIGH;
}

void TFT_WRITE_REG(uint8_t reg,uint16_t reg_value)
{
	TFT_WRITE_COMMAND(reg);
	TFT_WRITE_DATA(reg_value);
}

void TFT_WRITE_u16_DATA(uint16_t temp)
{

		uint8_t tempBuf[2];
		tempBuf[0] = temp>>8;
		tempBuf[1] = temp;
		CS_LOW ;
		DATA ;
		HAL_SPI_Transmit_DMA(&hspi2,tempBuf, 2);
		CS_HIGH ;
}


//Set of coordinate for start point
void set_windows(uint16_t xStar,uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
	TFT_WRITE_COMMAND(lcddev.setxcmd);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(xStar+lcddev.xoffset);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(xEnd+lcddev.xoffset);

	TFT_WRITE_COMMAND(lcddev.setycmd);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(yStar+lcddev.yoffset);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(yEnd+lcddev.yoffset);

	TFT_WRITE_COMMAND(0X2C);//写入内存     读取内存2E
}

//Clear screen to single color
void lcd_clear(uint16_t color)
{
	uint16_t i,m;
	set_windows(0,0,lcddev.width-1,lcddev.height-1);
	DATA;
	CS_LOW;

	for(i=0;i<lcddev.height;i++)
		{
	    for(m=0;m<lcddev.width;m++)
	    {
	    	TFT_WRITE_u16_DATA(color);
			}
		}
	CS_HIGH;
}


void tft_init()
{

	RSTL;
	Delay_us(100000);
	
	RSTH;
	Delay_us(100000);

	TFT_WRITE_COMMAND(0x11);
	Delay_us(120000);

	TFT_WRITE_COMMAND(0xB1);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);

	TFT_WRITE_COMMAND(0xB2);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);


	TFT_WRITE_COMMAND(0xB3);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_DATA(0x2C);
	TFT_WRITE_DATA(0x2D);

	TFT_WRITE_COMMAND(0xB4);
	TFT_WRITE_DATA(0x07);

	TFT_WRITE_COMMAND(0xC0);
	TFT_WRITE_DATA(0xA2);
	TFT_WRITE_DATA(0x02);
	TFT_WRITE_DATA(0x84);
	TFT_WRITE_COMMAND(0xC1);
	TFT_WRITE_DATA(0xC5);


	TFT_WRITE_COMMAND(0xC2);
	TFT_WRITE_DATA(0x0A);
	TFT_WRITE_DATA(0x00);

	TFT_WRITE_COMMAND(0xC3);
	TFT_WRITE_DATA(0x8A);
	TFT_WRITE_DATA(0x2A);
	TFT_WRITE_COMMAND(0xC4);
	TFT_WRITE_DATA(0x8A);
	TFT_WRITE_DATA(0xEE);

	TFT_WRITE_COMMAND(0xC5);
	TFT_WRITE_DATA(0x0E);

	TFT_WRITE_COMMAND(0x36);//RGB mode
	TFT_WRITE_DATA(0xC0);//c0

	TFT_WRITE_COMMAND(0xe0);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x1A);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x18);
	TFT_WRITE_DATA(0x2F);
	TFT_WRITE_DATA(0x28);

	TFT_WRITE_DATA(0x20);
	TFT_WRITE_DATA(0x22);
	TFT_WRITE_DATA(0x1F);

	TFT_WRITE_DATA(0x1B);
	TFT_WRITE_DATA(0x23);
	TFT_WRITE_DATA(0x37);

	TFT_WRITE_DATA(0x00);

	TFT_WRITE_DATA(0x07);
	TFT_WRITE_DATA(0x02);
	TFT_WRITE_DATA(0x10);

	TFT_WRITE_COMMAND(0xe1);
	TFT_WRITE_DATA(0x0F);
	TFT_WRITE_DATA(0x1B);
	TFT_WRITE_DATA(0x0F);

	TFT_WRITE_DATA(0x17);

	TFT_WRITE_DATA(0x33);
	TFT_WRITE_DATA(0x2C);

	TFT_WRITE_DATA(0x29);

	TFT_WRITE_DATA(0x2E);
	TFT_WRITE_DATA(0x28);
	TFT_WRITE_DATA(0x30);

	TFT_WRITE_DATA(0x30);

	TFT_WRITE_DATA(0x39);
	TFT_WRITE_DATA(0x3F);

	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x07);
	TFT_WRITE_DATA(0x03);
	TFT_WRITE_DATA(0x10);

	TFT_WRITE_COMMAND(0x2A);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x7F);

	TFT_WRITE_COMMAND(0x2B);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x00);
	TFT_WRITE_DATA(0x9F);

	TFT_WRITE_COMMAND(0xF0);
	TFT_WRITE_DATA(0x01);
	TFT_WRITE_COMMAND(0xF6);
	TFT_WRITE_DATA(0x00);

	TFT_WRITE_COMMAND(0x3A);
	TFT_WRITE_DATA(0x05);
	TFT_WRITE_COMMAND(0x29);
	lcd_set_direction();

	//TFT_WRITE_REG(0x36,(1<<6)|(1<<7));

	TFT_WRITE_COMMAND(0xc0);
	TFT_WRITE_DATA(0x0A);

	lcd_clear(0xffe0);
	LEDH;
}

### 使用STM32C8T6 HAL库实现2.4TFT触摸彩屏驱动 为了在STM32C8T6使用2.4英TFT触摸彩屏,通常会采用SPI接口进行通信。下面是一个简单的初始化和显示示例代码。 #### 初始化配置 首先,在`main.c`文件中包含必要的头文件并定义全局变量: ```c #include "stm32f1xx_hal.h" #include "ili9341.h" // 假设ILI9341作为LCD控制器 #include "xpt2046.h" // XPT2046用于触控功能 ``` 接着设置GPIO引脚以及SPI外设: ```c static void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = DISABLE; hspi1.Init.CRCCalculation = DISABLE; hspi1.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } } ``` 之后调用液晶显示屏的初始化函数[^1]: ```c void LCD_Init(void){ ILI9341_Init(); } ``` 对于触摸屏部分,则需单独初始化XPT2046芯片: ```c void TOUCH_Init(void){ XPT2046_Init(); } ``` 最后可以在主循环里加入测试绘图逻辑来验证屏幕工作正常与否: ```c int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); LCD_Init(); TOUCH_Init(); while (1) { DrawRectangle(50, 50, 100, 100); Delay_ms(1000); FillScreen(WHITE); Delay_ms(1000); DrawCircle(120, 160, 50); Delay_ms(1000); } } // 绘制矩形框 void DrawRectangle(uint16_t x0,uint16_t y0,uint16_t w,uint16_t h){ uint16_t i,j; for(i=x0;i<x0+w;i++){ for(j=y0;j<y0+h;j++){ Set_Pixel(i,j,RED); } } } // 设置像素颜色 void Set_Pixel(int16_t x,int16_t y,uint16_t color){ ILI9341_SetCursor(x,y); ILI9341_Write_Data(color); } // 延迟函数 void Delay_ms(__IO uint32_t ms){ HAL_Delay(ms); } // 清除整个屏幕填充指定颜色 void FillScreen(uint16_t Color){ int16_t x=0,y=0,w,h; w=ILI9341_GetWidth(); h=ILI9341_GetHeight(); ILI9341_Fill_Screen(Color); } // 绘制圆形 void DrawCircle(int xc , int yc , int r ) { int d,x,y ; d = 3 - (r << 1 ); x = 0 ;y=r ; while( x <= y ) { Set_Pixel((xc+x),(yc+y),BLUE);Set_Pixel((xc-x),(yc-y),BLUE); Set_Pixel((xc+y),(yc+x),BLUE);Set_Pixel((xc-y),(yc-x),BLUE); Set_Pixel((xc-x),(yc+y),BLUE);Set_Pixel((xc+x),(yc-y),BLUE); Set_Pixel((xc-y),(yc+x),BLUE);Set_Pixel((xc+y),(yc- --y)*2+5; } } ``` 上述代码展示了如何通过STM32CubeMX生成的基础框架配合第三方图形库完成基本的画面绘制操作。需要注意的是实际项目开发过程中还需要考虑更多细节比如电源管理、异常处理等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值