STM32F103RCT6+0.99寸TFT圆屏 软件SPI显示(初级)

目录

前言

一、0.99英寸彩色TFT屏幕

二、硬件设计

三、将图片转成二进制数组

四、软件解析

总结


前言

  本人平时忙于做项目,懒得写文章,借着工作摸鱼的时间写一下,好记录一下自己的学习记录和遇到的坑。之前接触的都是0.96寸OLED显示屏,没怎么用其他屏,还以为其他屏没有那么难,没想到还是有点难度,特别是越学到最后涉及到的知识点和坑就越多。这是本人第一次在CSDN写的文章,所以写的会有点草率。废话不多说,本文章采用的是直接将图片存到STM32的RAM中,然后将读RAM的值,转发给0.99寸TFT屏的显示方法,这种的优点是显示速度快,缺点就是主控芯片的RAM有限,存不了多少张图片。

一、0.99英寸彩色TFT屏幕

  黄保凯中景园0.99寸TFT LCD彩屏高清IPS显示屏液晶屏GC9107圆屏,以下是屏幕实物图

0.99寸TFT LCD彩屏

  买这个裸屏需要自己画一个转接板,FPC连接器连接裸屏,另一个端子连接主控板。

   以下是0.99寸TFT LCD彩屏转接板原理图:

二、硬件设计

STM32F103RCT6与0.99寸TFT圆屏硬件连接图如下:

STM32F103RCT60.99寸TFT圆屏
3.3VVCC
GNDGND
PB7SDA_MOSI
PB6SCL_SCLK
PB5RES
PB4DC
PB3CS
PD2BLK

实物图如下:

三、将图片转成二进制数组

1、由于该屏的像素大小是128*115的,所以在将图片转成二进制数组前,先将图片的像素点转成128*115的。

  将鼠标移到图片位置,右键->打开方式->画图,如下图:

可以看到这个图片还是240*240像素的,不是我们需要的128*115像素的,点击菜单栏上的图像->重新调整大小

切换到像素选项,取消勾选“保持纵横比(M)”,在水平输入128,垂直输入115,点击确定

点击确定后,可以看到图片像素已经改好了,点击保存

2、打开Img2Lcd软件,软件界面如下:

点击菜单栏中的打开,选择要取模的图片并打开,如下图:

观察左下角的输入图像

打开图片后 设置如下

输出数据类型:

扫描模式

输出灰度

最大宽度和高度

在16位彩色的颜色数据排列为 :红色 绿色  蓝色

设置好后点击一下

注意:此软件只能缩小图片不能放大图片!缩小是等比例缩小!

然后观察右下角这个输出图像是实际生成的图片的大小

这一部分勾选高位在前

然后点击保存,选择要保存的位置和命名

然后打开这个文件,可以看到图片已经生成二进制数组了

然后将生成的数组复制到到例程pic.h文件内,直接调用这个数组发送给屏幕就能显示了

完整界面如下:

四、软件解析

  采用的是软件SPI,所以速度相对较慢,本程序是鉴于中景园的程序上修改。这里按.c文件介绍。

  ①lcd_init

先配置TFT屏的引脚,按上面讲的硬件设计对应配置:

void LCD_GPIO_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);	 //使能A端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开AFIO(复用功能)时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //改变指定管脚的映射,JTAG的其他引脚PA15 PB3、PB4有其他用途,设置关闭JTAG部分功能,保留SWD功能
	//SCL:该引脚用于串行接口时钟;SDA:SPI接口输入/输出引脚,数据被锁存在SPI接口的上升沿。SCL 信号。
	//RES:此信号将重置设备,必须应用该信号才能正确初始化芯片。信号处于低电平有效状态。
	//DC:在 4 行串行接口中显示数据/命令选择引脚。;CS:芯片选择引脚;低启用,高禁用
	//CS、DC、RES、SCL=SCLK、SDA=MOSI
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
 	GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
//BLK:液晶屏背光控制信号,高电平点亮
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
 	GPIO_Init(GPIOD, &GPIO_InitStructure);	 
 	GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

 软件SPI发送、接收程序

/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat  要写入的串行数据
      返回值:  无
******************************************************************************/
void LCD_Writ_Bus(u8 dat) 
{	
	u8 i;
	LCD_CS_Clr();//启用芯片
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)//先发送高位
		{
		   LCD_MOSI_Set();//主机发送“1”数据
		}
		else
		{
		   LCD_MOSI_Clr();//主机发送“0”数据
		}
		LCD_SCLK_Set();//上升沿进行数据采集
		dat<<=1;
	}	
  LCD_CS_Set();	
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
	LCD_DC_Clr();//写命令
	LCD_Writ_Bus(dat);//写数据
	LCD_DC_Set();//写数据
}

设置显示屏的显示方向

/******************************************************************************
      函数说明:设置起始和结束地址
      入口数据:x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);//列起始地址
		LCD_WR_DATA(x2);//列结束地址
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+45);//行起始地址
		LCD_WR_DATA(y2+45);//行结束地址
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+45);
		LCD_WR_DATA(x2+45);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==3)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==4)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+45);
		LCD_WR_DATA(y2+45);
		LCD_WR_REG(0x2c);//储存器写
	}
	else
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);//储存器写
	}	
}

 这里的USE_HORIZONTAL值为4和5是本人添加的,可以将USE_HORIZONTAL值为0和1显示方向镜像。这样只需要修改USE_HORIZONTAL的值,就可以设置显示屏显示方向,可以在lcd_init.h里面修改。

#define USE_HORIZONTAL 0  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏,4或5为竖屏镜像显示


#if USE_HORIZONTAL==0||USE_HORIZONTAL==1||USE_HORIZONTAL==4||USE_HORIZONTAL==5
#define LCD_W 128 //LCD屏的宽度
#define LCD_H 115 //LCD屏的高度

#else
#define LCD_W 115
#define LCD_H 128
#endif

然后就是0.99寸TFT屏初始化程序。

③lcd.c

lcd.c主要是0.99寸TFT屏显示程序,字符、字符串、中文字符、数字、图片等显示程序,这里就不一 一介绍了。

④main.c

主要是初始化各个函数,显示字符、字符串、中文字符、数字、图片等,还加了光敏二极管,主要用于对光反射。

最终显示效果如下:

总结

采用软件SPI显示,程序简单,容易理解,但是传输速率不高,有明显的感觉到显示方向,适合用于显示图片,不适合动态显示或者显示视频。

最后代码放在CSDN上了,可通过这个链接下载,第一次发布文章,不知道通过这个链接下载要不要钱,如果要钱的话,可以在评论区@我要https://download.csdn.net/download/weixin_45534031/89478446?spm=1001.2014.3001.5503

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用STM32F103RCT6驱动1.44寸TFT LCD显示,首先需要了解TFT LCD显示的基本工作原理和通信接口。 TFT LCD显示由控制器和显示面板组成,控制器负责将图像数据发送到显示面板,并控制显示面板的驱动方式。STM32F103RCT6是一款32位ARM Cortex-M3核心的微控制器,具有丰富的外设和较高的处理能力,适合用于驱动TFT LCD显示。 接下来需要确定TFT LCD显示的通信接口是什么,常见的通信接口有SPI、I2C和8080并行接口等。对于1.44寸TFT LCD显示,通常采用SPI接口进行通信。 在进行硬件连接之前,需要查看TFT LCD显示的规格书和STM32F103RC6的数据手册来了解各个引脚的功能和连接方式。通常,SPI接口需要如下连接:使用STM32F103RCT6的SPI主机模式,分别连接STM32F103RCT6的SPI主机的SCK、MISO、MOSI管脚(对应SPI1或SPI2)与TFT LCD显示的SCK、SDO、SDI管脚,还需要连接片选管脚,以及连接显示的复位管脚和片选管脚以及电源供应和地。 在软件方面,需要先配置STM32F103RCT6的SPI外设,并设置通信速率、数据位长度等参数。然后,编写驱动程序,通过SPITFT LCD显示进行数据通信,将显示数据发送到TFT LCD显示,以实现图像显示的功能。 总的来说,驱动1.44寸TFT LCD显示需要进行硬件设置和软件编程。通过了解TFT LCD显示的通信接口和STM32F103RCT6的外设特性,并编写相应的驱动程序,就可以实现TFT LCD显示的驱动及图像显示功能。 ### 回答2: 要驱动1.44寸TFTLCD显示,首先要使用STM32F103RCT6开发板与显示进行连接。我们可以通过GPIO口实现数据线与显示相连,而控制线则通过专门的引脚连接。 接下来需要编写相关的驱动代码来控制显示。我们可以使用HAL库提供的函数,来设置GPIO口的输出模式,以及数据传输相关的操作。利用SPI或者I2C通信协议,我们可以通过发送命令和数据来控制显示显示内容。 在驱动代码中,我们需要先初始化SPI或者I2C通信,并配置相应的参数,比如时钟频率、传输模式等。 接着,我们需要编写命令和数据的发送函数,通过SPI或I2C发送相关指令给显示。比如,我们可以通过发送命令来设置显示区域、背光亮度等参数。 最后,我们可以编写显示函数来实现在显示显示图像或者文字。通过发送数据来更新显示内容,并且可以设置不同的显示模式,如图形显示、字符显示等。 需要注意的是,针对不同的显示型号,具体的驱动代码可能会有所不同。因此,在编写驱动代码时,需要结合显示的数据手册来编写相应的控制指令和函数。 以上是关于如何驱动1.44寸TFTLCD显示的大致步骤。在实际应用中,还需要对具体的硬件结构和功能要求进行详细调试和开发。 ### 回答3: STM32F103RCT6是一款ARM Cortex-M3内核的微控制器,可以用于控制各种外设和驱动显示。在驱动1.44寸TFT LCD显示时,我们需要按照以下步骤进行设置和编程: 1. 连接硬件:首先,将STM32F103RCT6与1.44寸TFT LCD显示连接起来。根据显示和微控制器的规格书或引脚配置表,将引脚正确连接。 2. 配置GPIO引脚:在STM32F103RCT6的寄存器中,通过设置GPIO引脚的模式和速度,将其配置为输出模式。将对应的引脚配置为控制显示的D/C引脚(用于选择数据/指令)、CS引脚(用于片选)、以及时钟引脚和数据引脚等。 3. 编写驱动程序:使用C语言或其他适合的编程语言,编写代码来控制和驱动1.44寸TFT LCD显示。根据显示的数据手册和命令集,实现显示的初始化、清、写入像素数据等功能。 4. 设置显示参数:根据需要,设置显示的相关参数,例如幕分辨率、颜色模式、显示方向等。这些参数需要根据具体的显示型号来设置。 5. 显示数据:通过驱动程序发送像素数据,将需要显示的图像或文本等内容写入显示。 6. 刷新显示:根据需要,定时刷新显示内容,以保持实时更新的效果。 通过以上步骤,我们可以实现STM32F103RCT6对1.44寸TFT LCD显示的驱动。需要根据具体的硬件和显示型号进行适配和调试,确保驱动程序的正确性和稳定性。同时,根据项目的需求和复杂度,可能需要更详细的代码和配置设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值