下图是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 = 525module 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;elsehcount_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;elsevcount_r <= vcount_r + 1'd1;elsevcount_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