TFT并口写时序图:
图中,当RS为0时,表示写入的是寄存器地址,RS为1的时候,表示写入的是数据(寄存器值/GRAM数据)
并口读时序图:
RS为0时,表示读取的是状态寄存器值,RS为1时,表示读取的是像素数据。
TFT并口写时序图:
图中,当RS为0时,表示写入的是寄存器地址,RS为1的时候,表示写入的是数据(寄存器值/GRAM数据)
并口读时序图:
RS为0时,表示读取的是状态寄存器值,RS为1时,表示读取的是像素数据。
ARM芯片使用的是STM32F105系列,没有FSMC接口,所以采用模拟16bit驱动TFT。TFT屏驱动芯片是SPFD5420A。3.0’屏,400*240大小。
SPFD5420A支持262144color,也就是屏资料介绍里常说的262K色或26万色。262144是怎么算出来的?我们先来了解TFT的显示原理。400*240的屏有96000个像素,每个像素的颜色由RGB三种颜色混合而成。SPFD5420A支持18bit接口,一个像素由R(6)G(6)B(6)共18位组成。如下所示:
R5 |
R4 |
R3 |
R2 |
R1 |
R0 |
G5 |
G4 |
G3 |
G2 |
G1 |
G0 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
那么一个像素能显示的颜色有2^18,也就是262144种颜色。
65K色屏一个像素由R(5)G(6)B(5)共16位组成,2^16=65536种颜色。
16.7M色屏一个像素由R(8)G(8)B(8)共24位组成,2^24=16777216种颜色。
这个参数和屏的大小无关,只和屏驱动芯片支持的RGB组合的位数有关。
SPFD5420A内部有233280byteGRAM,最大的像素为240*432,每个像素18bit,240*432*18/8=233280byte。
SPFD5420A支持8,9,16,18位并口通讯。SPFD5420D有一个16bit索引寄存器IR,一般作为存储器的指针使用。2个18bit数据寄存器,一个是写数据寄存器(WDR),一个是读数据寄存器(RDR)。
TFT屏接口图如下:
选择16bit模式,TFT的DB0和DB9脚没有使用,DB1-DB8接STM32的GPIOE的PIN0-PIN7脚,DB10-DB17接GPIOE的PIN8-PIN15脚。引脚定义如下:
#define TFT_CS GPIO_Pin_0
#define TFT_RS GPIO_Pin_1
#define TFT_RST GPIO_Pin_4
#define TFT_RD GPIO_Pin_5
#define TFT_MISO GPIO_Pin_6
#define TFT_MOSI GPIO_Pin_7
//————-PORTB———————
#define TFT_PCLK GPIO_Pin_12
#define TFT_DE GPIO_Pin_13
#define TFT_WR GPIO_Pin_14
#define TFT_HSYNC GPIO_Pin_15
//————-PORTC———————
#define TFT_BACKLIGHT GPIO_Pin_9
//————-PORTE———————
#define TFT_DATAPORT GPIOE
#define Lcd_Light_ON GPIOC->BSRR = GPIO_Pin_9;
#define Lcd_Light_OFF GPIOC->BRR = GPIO_Pin_9;
#define Set_Cs GPIO_SetBits(GPIOA,GPIO_Pin_0);
#define Clr_Cs GPIO_ResetBits(GPIOA,GPIO_Pin_0);
#define Set_Rs GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define Clr_Rs GPIO_ResetBits(GPIOA,GPIO_Pin_1);
#define Set_nWr GPIO_SetBits(GPIOB,GPIO_Pin_14);
#define Clr_nWr GPIO_ResetBits(GPIOB,GPIO_Pin_14);
#define Set_nRd GPIO_SetBits(GPIOA,GPIO_Pin_5);
#define Clr_nRd GPIO_ResetBits(GPIOA,GPIO_Pin_5);
IO口初始化函数:
static void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = TFT_CS|TFT_RS |TFT_WR|TFT_RST|TFT_RD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TFT_WR;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TFT_BACKLIGHT;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* tft control gpio init */
GPIO_SetBits(GPIOA, TFT_RST); // RST
GPIO_SetBits(GPIOA, TFT_RD); // RD = 1
GPIO_SetBits(GPIOB, TFT_WR); // WR = 1
GPIO_SetBits(GPIOA, TFT_RS); // RS
GPIO_SetBits(GPIOA, TFT_CS); //CS = 1
}
TFT是如何工作的 TFT就是“Thin Film Transistor”的简称,一般代指薄膜液晶显示器,而实际上指的是薄膜晶体管(矩阵)—— 可以“主动的”对屏幕上的各个独立的象素进行控制,这也就是所谓的主动矩阵TFT(active matrix TFT)的来历。那么图象究竟是怎么产生的呢?基本原理很简单:显示屏由许多可以发出任意颜色的光线的象素组成,只要控制各个象素显示相应的颜色就能达到目的了。在TFT LCD中一般采用背光技术,为了能精确地控制每一个象素的颜色和亮度就需要在每一个象素之后安装一个类似百叶窗的开关,当“百叶窗”打开时光线可以透过来,而“百叶窗”关上后光线就无法透过来。当然,在技术上实际上实现起来就不像刚才说的那么简单。LCD(Liquid Crystal Display)就是利用了液晶的特性(当加热时为液态,冷却时就结晶为固态),一般液晶有三种形态:
类似粘土的层列(Smectic)液晶
类似细火柴棒的丝状(Nematic)液晶
类似胆固醇状的(Cholestic)液晶
液晶显示器使用的是丝状,当外界环境变化它的分子结构也会变化,从而具有不同的物理特性——就能够达到让光线通过或者阻挡光线的目的——也就是刚才比方的百叶窗。
大家知道三原色,所以构成显示屏上的每个象素需上面介绍的三个类似的基本组件来构成,分别控制红、绿、蓝三种颜色。
目前使用的最普遍的是扭曲向列TFT液晶显示器(Twisted Nematic TFT LCD),下图就是解释的此类TFT显示器的工作原理。现存的技术差别很大,我们将会在本文的第二部分中详细介绍。
在上、下两层上都有沟槽,其中上层的沟槽是纵向排列,而下层是横向排列的。当不加电压液晶处于自然状态,从发光图2a扭曲向列TFT显示器工作原理图示意图层发散过来的光线通过夹层之后,会发生90度的扭曲,从而能在下层顺利透过。
当两层之间加上电压之后,就会生成一个电场,这时液晶都会垂直排列,所以光线不会发生扭转——结果就是光线无法通过下层。
(2)TFT象素架构:彩色滤光镜依据颜色分为红、绿、蓝三种,依次排列在玻璃基板上组成一组(dot pitch)对应一个象素每一个单色滤光镜称之为子象素(sub-pixel)。也就是说,如果一个TFT显示器最大支持1280×1024分辨率的话,那么至少需要1280×3×1024个子象素和晶体管。对于一个15英寸的TFT显示器(1024×768)那么一个象素大约是0.0188英寸(相当于0.30mm),对于18.1英寸的TFT显示器而言(1280×1024),就是0.011英寸(相当于0.28mm)。
大家知道,象素对于显示器是有决定意义的,每个象素越小显示器可能达到的最大分辨率就会越大。不过由于晶体管物理特性的限制,现阶段TFT每个象素的大小基本就是0.0117英寸(0.297mm),所以对于15英寸的显示器来说,分辨率最大只有1280×1024。