提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文仅仅简单介绍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);
总结
很用函数就行,如果想显示汉字和图片,用取模软件就好了。