1、TFT-LCD屏简介
LCD( Liquid Crystal Display),即液晶显示器,可分为被动矩阵式和主动矩阵式两种不同的控制方式,主动矩阵式也称为 TFT( Thin Film Transistor)。 主动式 TFT 型的液晶显示器的结构较为复杂包括了:背光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料和薄模式晶体管等等。
一个完整的 LCD 显示系统由三部分组成:主控系统、 LCD 显示控制器、 LCD 显示屏。市场上,高端一点的主控系统一般内部集成有 LCD 显示控制器;一般的单片机内部往往都是不集成有 LCD 显示控制器。主控内部没有集成 LCD 控制器的,一般需要外置 LCD 控制器或者使用自带有控制器的 LCD 显示屏。

2、LCD屏的参数
- 分辨率:屏幕上能显示的像素点的个数,包括水平分辨率和垂直分辨率。我的开发板上面用的LCD屏的分辨率是固定的,固定为横向320x纵向480。即:水平方向有 320 个像素点,垂直方向有480个像素点。
- LCD屏每一个像素点的颜色都是彩色的,可以理解每一个像素点都有3个彩色灯:红色、绿色、蓝色,将红绿蓝以不同的色彩强度进行混合就可以产生千变万化的彩色。
- 颜色位深:表示 RGB (红绿蓝)颜色的二进制位数,常见的有 16BPP(bit per pixel)如: 16BPP 表示一个像素点的颜色使用 16 个二进制位表示。,总共是16位。
- RGB565,用5位来表示红色、6位来表示绿色、5位来表示蓝色,关系如下图:
电脑的屏是24BPP的。
颜色位越大则可以显示的颜色的种类越多。
3、TFT-LCD控制器的原理
TFT-LCD控制器的型号是ILI9486,每一款屏都有一个数据手册来描述屏基本的原理。
ILI9486和CPU通讯的接口有很多,而我们选择用的接口是16位的并口,即需要16个数据管脚来传输数据。
3.1、ILI9486接口
- IM[2:0] 选择接口模式的管脚
当IM2管脚接低电平,IM1管脚接高电平,IM0管脚接低电平,则选择的数据通讯接口是8080的16位并口通信接口
- RESX 复位管脚
硬件复位TFT-LCD控制器
已经直接连接到RC复位电路
- CSX CS:chip select
8080并口通讯的芯片选择管脚,简称片选脚
低电平:ILI9486被选中,并且可访问
高电平:ILI9486未被选中,不可访问、
- DCX 数据命令
数据命令管脚,用于控制ILI9486接收到的16进制数是用于设置参数,还是用于显示在LCD屏上。
低电平:命令
高电平:数据(参数)
- RDX 8080并口通讯的读数据时钟管脚
读信号管脚:主控在RDX的上升沿读取数据
- WRX 8080并口通讯写数据时钟管脚
写信号管脚,主控在WRX的上升沿是发送数据。
- DB[17:0] 总线管脚
8080并口通讯数据传输管脚,用于发送数据给ILI9486,也用于从ILI9486中读取数据。
由于我们选择的是RGB565的像素格式,只需要16个管脚即可传输16位数据。
我们只用到DB[15:0]
4、8080并口通信的原理
8080并口通信接口的简介8080并口传输位数可选:8/9/16/18,我们选择用16位并口传输。主要需要的管脚如下:
CSX:用于使能或者禁止ILI9486
WRX:写信号(写时钟),每一个时钟信号,主控发送16位数据
RDX:读信号(读时钟),每一个时钟信号,主控读取16位数据
DC : 数据命令管脚,决定DB[15:0]的位数据是写到显存还是写到命令寄存器。
DB[15:0]:并口通信管脚
补充知识点:显存:水池存储水,显存是存储线显示图像文字字符数据的,显存越大可以存储的图像信息越多,显示效果越好。主控写图像文字数据到ILI9486时,其实就是写到显存中。
5、8080并口写时序
8080接口传输16位数据的时序图如下图所示:
①操作ILI9486时,必须将CSX管脚拉低
②在写数据或者写命令时,WRX通过拉低在拉高来模拟产生一个上升沿
③在写数据或者写命令时,RDX不产生脉冲该信号,而是保持为高电平
④下图中,一个WRX脉冲时钟可以传输16位数据
⑤DC是数据命令控制管脚,DB[15:0]的位数据是写到命令寄存器,还是写到显存,就是用DC管脚电平高低来进行区分的
该时序对应的伪代码如下:
(1)主控写命令的伪代码
//CS管脚输出低电平
//DC管脚拉低电平
//WRX管脚拉电平
//DB[15:0] 准备16位数据
//WRX拉高电平
(2)主控写数据的伪代码
//CS管脚输出低电平
//DC管脚拉高电平
//WRX管脚拉电平
//DB[15:0] 准备16位数据
//WRX拉高电平
8080 接口写像素点(数据)的时序
(1)一次传输传输一个像素点数据,一个像素点数据有16位
(2)最高的数据通过D15管脚输出,最低位的数据通过D0输出
(3)红色是高5位;绿色是中间6位,蓝色是最低5位
ILI9486的常用命令
1、主控发送0x01命令到ILI9486可以让ILI9486进行软件复位。发送命令的时序要求是:DC低电平,RDX保持高电平,WRX产生一个上升沿,D[15:8]的数值是无效的,D[7:0]的值是有效
2、列地址设置命令:
设置一个显示窗口的列地址。列地址的取值范围是[0:319]。
主控在设置列地址时的步骤如下:
①主控发送发送一条命令:0x2A
②主控发送列地址的起始地址(SC:start column),16位的起始地址分两次发送
③主控发送列地址的结束地址(EC:end column),16位的结束地址分两次发送
3、页(行)地址设置命令:
设置一个显示窗口的页(行)地址。页(行)地址的取值范围是[0:479]。
主控在设置页(行)地址时的步骤如下:
①主控发送发送一条命令:0x2B
②主控发送页(行)地址的起始地址(SP:start page),16位的起始地址分两次发送
③主控发送页(行)地址的结束地址(EP:end page),16位的结束地址分两次发送
4、写像素点数据到显存中:
主控首先发送命令0x2C,告诉ILI9486,主控即将发送像素点数据。主控可以连续地写像素点数据到TFT-LCD屏中的显存即上图中的D1[15:0]~Dx[15:0]~Dn[15:0]。
主控连续写像素点数据到显存中时,显存保存了一个像素点的数据后地址会自动递增来准备接收下一个像素点的数据
5、显存访问控制命令:
用于设置显存的增长方向,常用的是MY为0,MX为0,MV为0的模式
6、软件设计
原理图
其中注释的为库函数的配置
#include "stm32f4xx.h"
//常用的颜色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0xF81F
#define GRED 0xFFE0
#define GBLUE 0x07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0xBC40 //棕色
#define BRRED 0xFC07 //棕红色
#define GRAY 0x8430 //灰色
//字体取模
const unsigned char chinese_1[] =
{
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,/*"中",0*/
/* (16 X 16 , 宋体 )*/
};
const unsigned char chinese_2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x08,0x01,0x80,0x30,
0x0F,0xFF,0xFF,0xF0,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,
0x0F,0xFF,0xFF,0xE0,0x0C,0x01,0x80,0x20,0x0C,0x01,0x80,0x20,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,
0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
/* (32 X 32 , 宋体 )*/
};
const unsigned char chinese_3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,