嵌入式开发-STM32硬件SPI驱动TFT屏

这次用到的TFT屏

在这里插入图片描述

现在的TFT屏幕已经很便宜了,65536色屏幕,2.8英寸,分辨率320X240的液晶屏才20元,我为了图省事,多配了一个转接板12元,共32元包邮到家,真是香。
上面这个是这次用到的2.8寸TFT屏幕(20元),下面的是0.96寸OLED屏(10元),可见尺寸的巨大差别。当然OLED屏的优势是省电,在手持设备上是首选。
在这里插入图片描述

这个屏幕是SPI接口,最少4线驱动,分别是MOSI数据,CLK时钟,CS片选,DC数据/指令切换,还有2根线可选,是RESET和背光,复位可以用电阻电容上电时拉一下跳变即可,背光可以一直接高电平,也可以用PWM控制亮度。

CubeMX设置

CubeMX教程见这里:嵌入式开发–CubeMX使用入门教程
MCU是STM32H750VBT6,用的是SPI1接口,其他是常规设置,
在这里插入图片描述
支持的最高时钟频率,液晶屏厂家没有给出,ILI9341芯片手册上是这样说的
在这里插入图片描述

最高频率是6.35MHz,但要注意的是这是点频率,而我们在CubeMX中设置并不是这个,而是SPI的时钟频率,每个点是8位,所以这个频率要乘以8才是我们要的,5.35*8=50.8MHz,实测25M没有问题。27.5M花屏,30M以上无显示,可能是我用的杜邦线比较长信号衰减大。
具体设置如下:

在这里插入图片描述

代码编写

厂家只提供了F103系列的软件驱动GPIO来模拟SPI时序的代码,效率太低,于是改用硬件SPI,代码做了一些修改。
显示效果如下,16点阵字库:
在这里插入图片描述

增加的内容

增加了24点阵字库,常用的12或16字库太小了,看着费劲。
下图是24点阵的显示效果
在这里插入图片描述

需要注意问题

这个液晶屏是65536色,或者叫65K色,颜色格式是RGB565,传送数据时,正序和倒序的不同,会导致红蓝颠倒,通过改变大小端的设置,可以修正。理论上ILI9341应该有相关的寄存器设置,懒得去仔细查手册了,直接改的SPI设置搞定。如果有知道的,麻烦告知一下,十分感谢。

代码下载

代码可以在这里下载:嵌入式开发,STM32H750VBT6用硬件SPI方式驱动TFT液晶屏

#include "system.h" #include "SysTick.h" #include "led.h" #include "usart.h" #include "tftlcd.h" #include "dht11.h" #include "ds18b20.h" u8 temp; u8 humi; u8 temp_buf[3],humi_buf[3]; void data_pros() //Êý¾Ý´¦Àíº¯Êý { DHT11_Read_Data(&temp;,&humi;); temp_buf[0]=temp/10+0x30; temp_buf[1]=temp+0x30; temp_buf[2]='\0'; humi_buf[0]=humi/10+0x30; humi_buf[1]=humi+0x30; humi_buf[2]='\0'; } int main() { u8 i=0; u8 temper; SysTick_Init(168); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é LED_Init(); USART1_Init(9600); TFTLCD_Init(); //LCD³õʼ»¯ FRONT_COLOR=BLACK; LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"PRECHIN STM32F4"); LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16,"www.prechin.net"); LCD_ShowString(10,50,tftlcd_data.width,tftlcd_data.height,16,"DHT11 Test"); LCD_ShowString(10,100,tftlcd_data.width,tftlcd_data.height,16,"Temp: C"); LCD_ShowString(10,130,tftlcd_data.width,tftlcd_data.height,16,"Humi: %RH"); FRONT_COLOR=RED; while(DHT11_Init()) //¼ì²âDS18B20ÊÇ·ñ´¿ÔÚ { LCD_ShowString(130,50,tftlcd_data.width,tftlcd_data.height,16,"Error "); delay_ms(500); } LCD_ShowString(130,50,tftlcd_data.width,tftlcd_data.height,16,"Success"); while(1) { i++; if(iP==0) { temper=DS18B20_GetTemperture(); led1=!led1; data_pros(); //¶Áȡһ´ÎDHT11Êý¾Ý×îÉÙÒª´óÓÚ100ms } LCD_ShowString(55,100,tftlcd_data.width,tftlcd_data.height,16,temp_buf); LCD_ShowString(55,130,tftlcd_data.width,tftlcd_data.height,16,humi_buf); LCD_ShowNum(55,160,temper,8,12); delay_ms(10); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老李的森林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值