下图是TFT显示屏的显示效果
该显示屏共分为 2 个版本,4.3 寸版本的 TFT4.3’’_V3.0 和 5.0 寸版本的 TFT5.0’’_V3.0。 两者 PCB 背板电路完全相同,接口脚位定义完全相同,接口时序完全相同,仅使用的显示屏 模组尺寸不同。设计两个尺寸的主要目的是适配不同的开发板使用,以获得较好的物理结构兼容性。
如下图:
排针连接开发板示意图:
FPC 接口连接开发板示意图:
连接注意事项:
触摸功能的话就是相较于电阻触摸屏,电容触摸屏的触摸坐标定位实现更加的复杂,一般都需要使用专用的电容触摸控制器来完成多点触摸信号的感应。所以大部分电容触摸模组都集成好了该电容控制器,对外提供标准的12C总线接口,使用时,只需要主机通过12C总线读取该触摸控制器芯片中存储的实时坐标即可,不需要做其他的操作,去读它这里面寄存器的值就可以了。也因此在电容触摸屏对外的接口上,只需要IIC的信号就可以了。
通用显示屏模组,通用显示屏模组采用的是4.3寸或者5寸的显示屏模组,这两种模组功能相同,接口相同,时序参数也都相同,且在FPC排线的物理位置上的区别,他们也通过不同的PCB板实现了兼容,所以最终使用的时候的程序和驱动完全通用。
RGB888->RGB565
该屏幕的颜色数据支持 24 位输入,即每种颜色(RGB)有 8 位表 示。但是在很多对颜色效果要求不高的系统中,为了节约存储器带宽和控制器的引脚数量, 会使用 16 位色(RGB565)进行图像显示。
实现代码如FPGA-VGA实现是一样的 只需在输出中加入背光信号
代码如下:
`include "disp_parameter_cfg.v"
//800x480
//H_Right_Borde = 0 V_Bottom_Bord = 8
//H_Front_Porch = 40 V_Front_Porch = 2
//H_Sync_Time = 128 V_Sync_Time = 2
//H_Back_Porch = 88 V_Back_Porch = 25
//H_Left_Border = 0 V_Top_Border = 8
//H_Data_Time = 800 V_Data_Time = 480
//H_Total_Time = 1056 V_Total_Time = 525
module TFT_Ctrl(
Clk_33M ,
Reset_n ,
Data_in ,
hcount , //行扫描位置(显示图像行扫描地址)
vcount , //场扫描位置(显示图像场扫描地址)
TFT_HS , //行同步信号
TFT_VS , //场同步信号
TFT_DE , //有效数据输出
TFT_CLK ,
TFT_DATA , //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]
TFT_BL
);
input Clk_33M;
input Reset_n;
input [23:0] Data_in;
output [11:0] hcount;
output [11:0] vcount;
output TFT_HS;
output TFT_VS;
output TFT_DE;
output TFT_CLK;
output [23:0] TFT_DATA; //红绿蓝三色 分别8位量化 R[7:0]G[7:0]B[7:0]
output TFT_BL;
// parameter VGA_HS_end = 11'd127 ,
// hdat_begin = 11'd216 ,
// hdat_end = 11'd1016 ,
// hpixel_end = 11'd1055 ,
// VGA_VS_end = 11'd1 ,
// vdat_begin = 11'd35 ,
// vdat_end = 11'd515 ,
// vline_end = 11'd524 ;
parameter TFT_HS_end = `H_Sync_Time-1 ;
parameter hdat_begin = `H_Sync_Time + `H_Back_Porch +`H_Left_Border - 1'b1;
parameter hdat_end = `H_Total_Time - `H_Right_Border -`H_Front_Porch - 1'b1;
parameter vdat_begin = `V_Sync_Time + `V_Back_Porch +`V_Top_Border - 1'b1;
parameter vdat_end = `V_Total_Time - `V_Bottom_Border -`V_Front_Porch - 1'b1;
parameter hpixel_end = `H_Total_Time -1 ;
parameter TFT_VS_end = `V_Sync_Time-1 ;
parameter vline_end = `V_Total_Time -1 ;
reg [11:0] hcount_r;
reg [11:0] vcount_r;
always@(posedge Clk_33M or negedge Reset_n)
if(!Reset_n)
hcount_r <= 11'd0;
else if(hcount_r == hpixel_end )
hcount_r <= 11'd0;
else
hcount_r <= hcount_r + 1'd1;
always@(posedge Clk_33M or negedge Reset_n)
if(!Reset_n)
vcount_r <= 11'd0;
else if(hcount_r == hpixel_end)
if(vcount_r == vline_end )
vcount_r <= 11'd0;
else
vcount_r <= vcount_r + 1'd1;
else
vcount_r <= vcount_r;
assign TFT_DE = ((hcount_r >= hdat_begin) && (hcount_r < hdat_end)&&
(vcount_r >= vdat_begin) && (vcount_r < vdat_end)) ? 1'b1 : 1'b0;
assign hcount = TFT_DE ? (hcount_r - hdat_begin) : 10'd0;
assign vcount = TFT_DE ? (vcount_r - vdat_begin) : 10'd0;
assign TFT_HS = (hcount_r > TFT_HS_end)? 1'b1 :1'b0;
assign TFT_VS = (vcount_r > TFT_VS_end)? 1'b1 :1'b0;
assign TFT_DATA = (TFT_DE) ? Data_in : 24'h000000;
assign TFT_CLK = ~Clk_33M;
assign TFT_BL = 1;
endmodule
其中disp_parameter_cfg.v中定义了不同分辨率的参数:
//`define Resolution_480x272 1 //时钟为 9MHz
//`define Resolution_640x480 1 //时钟为 25.175MHz
//`define Resolution_800x480 1 //时钟为 33MHz
//`define Resolution_800x600 1 //时钟为 40MHz
//`define Resolution_1024x768 1 //时钟为 65MHz
//`define Resolution_1280x720 1 //时钟为 74.25MHz
`define Resolution_1920x1080 1 //时钟为 148.5MHz
//定义不同分辨率的时序参数
`ifdef Resolution_480x272
`define H_Total_Time 12'd525
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd2
`define H_Sync_Time 12'd41
`define H_Back_Porch 12'd2
`define H_Left_Border 12'd0
`define V_Total_Time 12'd286
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd10
`define V_Back_Porch 12'd2
`define V_Top_Border 12'd0
`elsif Resolution_640x480
`define H_Total_Time 12'd800
`define H_Right_Border 12'd8
`define H_Front_Porch 12'd8
`define H_Sync_Time 12'd96
`define H_Back_Porch 12'd40
`define H_Left_Border 12'd8
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x480
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd525
`define V_Bottom_Border 12'd8
`define V_Front_Porch 12'd2
`define V_Sync_Time 12'd2
`define V_Back_Porch 12'd25
`define V_Top_Border 12'd8
`elsif Resolution_800x600
`define H_Total_Time 12'd1056
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd40
`define H_Sync_Time 12'd128
`define H_Back_Porch 12'd88
`define H_Left_Border 12'd0
`define V_Total_Time 12'd628
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd1
`define V_Sync_Time 12'd4
`define V_Back_Porch 12'd23
`define V_Top_Border 12'd0
`elsif Resolution_1024x768
`define H_Total_Time 12'd1344
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd24
`define H_Sync_Time 12'd136
`define H_Back_Porch 12'd160
`define H_Left_Border 12'd0
`define V_Total_Time 12'd806
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd3
`define V_Sync_Time 12'd6
`define V_Back_Porch 12'd29
`define V_Top_Border 12'd0
`elsif Resolution_1280x720
`define H_Total_Time 12'd1650
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd110
`define H_Sync_Time 12'd40
`define H_Back_Porch 12'd220
`define H_Left_Border 12'd0
`define V_Total_Time 12'd750
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd5
`define V_Sync_Time 12'd5
`define V_Back_Porch 12'd20
`define V_Top_Border 12'd0
`elsif Resolution_1920x1080
`define H_Total_Time 12'd2200
`define H_Right_Border 12'd0
`define H_Front_Porch 12'd88
`define H_Sync_Time 12'd44
`define H_Back_Porch 12'd148
`define H_Left_Border 12'd0
`define V_Total_Time 12'd1125
`define V_Bottom_Border 12'd0
`define V_Front_Porch 12'd4
`define V_Sync_Time 12'd5
`define V_Back_Porch 12'd36
`define V_Top_Border 12'd0
`endif