TFTLCD原理及代码步骤

本文详细介绍了TFTLCD的工作原理,特别是使用SPI通信协议驱动ILI9341屏幕的步骤,包括配置GPIO、发送初始化指令、打点指令以及设计界面的函数应用。通过理解这些基本操作,开发者能够有效地控制和定制TFTLCD显示内容。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文仅仅简单介绍TFTLCD的工作原理,工作原理其实简单了解就好,会正确使用相关的函数就行


一、TFTLCD工作原理什么?

薄膜晶体管液晶显示屏 色彩更真实,还原度更高

在这里插入图片描述
尺寸:屏幕对角线的长度;单位为英寸。
像素点:显示数据的最小单位,多个像素点去组合显示数据内容,背景色/前景色
分辨率:屏幕横和宽分布多少像素点
颜色深度:像素点显示的时需要多少位的数据表示颜色(RGB888RGB565);
本篇是采用SPI通信,这里简单介绍一下通信的类型

串行:数据按位发送,占用引脚较少,时长较长(8位数据占周期),
区分:数据高位先发/低位先发通信速度慢
并行:数据按字节来发,每一个位占用一根线,一个周期同时发送
功耗高、所用资源多、抗干扰性差、一般用于短距离通信
CPU显卡存储
全双工/半双工/单工:数据传输方向,设备做发送端/接收端
同步:发送端发送时接收端在接,及时接数据(通信双方有没有统一的时钟信号);
异步:发送端只处理发送,接收端自己扫描信号,处理接收;(波特率)
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,.
并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现
在越来越多的芯片集成了这种通信协议。
SPI是一个环形总线结构,由ss(Cs). sck. sdi. sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行
数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo. 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi. 上的电平将被接收到主设备的寄存器中。
驱动是ILI9341

二、驱动屏幕的步骤

1.看屏幕确定驱动(看驱动器,看手册,看屏幕支持的通信接口)

2.建立通信时序(可以通过单片机进行控制)

SPI


3.发送初始化指令,控制屏幕初始化

代码如下(示例):

/**************************************************************************************
 * 描  述 : 初始化控制TFTLCD的IO
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************************/
void LCD_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* 使能FSMC时钟*/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
    
    /* 使能FSMC对应相应管脚时钟*/
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE 
	                          | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOG 
	                          | RCC_APB2Periph_GPIOF , ENABLE);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    /* 配置LCD背光控制管脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;		
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    /* 配置LCD复位控制管脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; 	 
    GPIO_Init(GPIOD, &GPIO_InitStructure);  		   
    
    /* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10*/	
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | 
                                  GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | 
                                  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
                                  GPIO_Pin_15;
    GPIO_Init(GPIOE, &GPIO_InitStructure); 
    
		/* 配置FSMC相对应的控制线
		 * PD4-FSMC_NOE   :LCD-RD
		 * PD5-FSMC_NWE   :LCD-WR
		 * PG12-FSMC_NE4  :LCD-CS
		 * PG0-FSMC_A10   :LCD-DC
		*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
    GPIO_Init(GPIOG, &GPIO_InitStructure);  
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
    GPIO_Init(GPIOG, &GPIO_InitStructure); 
    
    /* 开背光 */
		GPIO_ResetBits(GPIOD, GPIO_Pin_13);  
}
/**************************************************************************************
 * 描  述 : TFTLCD 初始化寄存器
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************************/
void LCD_REG_Config(void)
{
  LCD_ILI9341_CMD(0x11); 
  Delay_ms(120); 
 
  LCD_ILI9341_CMD(0x36);  
  LCD_ILI9341_Parameter(0x00); 

  LCD_ILI9341_CMD(0x3A); 
  LCD_ILI9341_Parameter(0X05); 
 
  LCD_ILI9341_CMD(0xB2);  
  LCD_ILI9341_Parameter(0x0C); 
  LCD_ILI9341_Parameter(0x0C); 
  LCD_ILI9341_Parameter(0x00); 
  LCD_ILI9341_Parameter(0x33);
  LCD_ILI9341_Parameter(0x33);

  LCD_ILI9341_CMD(0xB7);  
  LCD_ILI9341_Parameter(0x35); 

  LCD_ILI9341_CMD(0xBB);  				//vcom
  LCD_ILI9341_Parameter(0x32);    //30

  LCD_ILI9341_CMD(0xC0);  				  //
  LCD_ILI9341_Parameter(0x2C); 

  LCD_ILI9341_CMD(0xC2);  
  LCD_ILI9341_Parameter(0x01); 
 
  LCD_ILI9341_CMD(0xC3);  	   //vrh
  LCD_ILI9341_Parameter(0x10); 	   //17		   0D

  LCD_ILI9341_CMD(0xC4);  			   //vdv
  LCD_ILI9341_Parameter(0x20);	  //20

  LCD_ILI9341_CMD(0xC6);  
  LCD_ILI9341_Parameter(0x0f);     //0f 调触摸闪动

  LCD_ILI9341_CMD(0xD0);  
  LCD_ILI9341_Parameter(0xA4); 
  LCD_ILI9341_Parameter(0xA1); 
 
  LCD_ILI9341_CMD(0xE0);    //Set Gamma 
  LCD_ILI9341_Parameter(0xd0); 
  LCD_ILI9341_Parameter(0x00); 
  LCD_ILI9341_Parameter(0x02); 
  LCD_ILI9341_Parameter(0x07); 
  LCD_ILI9341_Parameter(0x0a); 
  LCD_ILI9341_Parameter(0x28); 
  LCD_ILI9341_Parameter(0x32); 
  LCD_ILI9341_Parameter(0X44); 
  LCD_ILI9341_Parameter(0x42); 
  LCD_ILI9341_Parameter(0x06); 
  LCD_ILI9341_Parameter(0x0e); 
  LCD_ILI9341_Parameter(0x12); 
  LCD_ILI9341_Parameter(0x17); 
 
  LCD_ILI9341_CMD(0XE1);    //Set Gamma 
  LCD_ILI9341_Parameter(0xd0); 
  LCD_ILI9341_Parameter(0x00); 
  LCD_ILI9341_Parameter(0x02); 
  LCD_ILI9341_Parameter(0x07); 
  LCD_ILI9341_Parameter(0x0a); 
  LCD_ILI9341_Parameter(0x28); 
  LCD_ILI9341_Parameter(0x31); 
  LCD_ILI9341_Parameter(0x54); 
  LCD_ILI9341_Parameter(0x47); 
  LCD_ILI9341_Parameter(0x0e); 
  LCD_ILI9341_Parameter(0x1c); 
  LCD_ILI9341_Parameter(0x17); 
  LCD_ILI9341_Parameter(0x1b); 
  LCD_ILI9341_Parameter(0x1e); 

  LCD_ILI9341_CMD(0x2A); 
  LCD_ILI9341_Parameter(0x00);
  LCD_ILI9341_Parameter(0x00);
  LCD_ILI9341_Parameter(0x00);
  LCD_ILI9341_Parameter(0xef);	

  LCD_ILI9341_CMD(0x2B); 
  LCD_ILI9341_Parameter(0x00);
  LCD_ILI9341_Parameter(0x00);
  LCD_ILI9341_Parameter(0x01);
  LCD_ILI9341_Parameter(0x3f); 

  LCD_ILI9341_CMD(0x29); //display on
  LCD_ILI9341_CMD(0x2c);
}

4.打点指令(一个像素亮起:指定颜色)

uint16_t LCD_GetPoint(uint16_t x , uint16_t y);

5.依靠函数,设计界面(根据功能,需求)

void LCD_Init(void);
void Lcd_GramScan( uint16_t option );
void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color);
void LCD_SetCursor(uint16_t x, uint16_t y);
void LCD_OpenWindow(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void LCD_SetPoint(uint16_t x , uint16_t y , uint16_t color);
uint16_t LCD_GetPoint(uint16_t x , uint16_t y);
void LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color);
void LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color);
void LCD_DisNum(uint16_t x, uint16_t y, uint32_t num, uint16_t color);

总结

很用函数就行,如果想显示汉字和图片,用取模软件就好了。

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值