TFT液晶屏显示实验 - 畅学网
博学强知,畅腾思维

TFT液晶屏显示实验

发布:Andre tian2014-7-27 10:14分类: 单片机技术 标签: TFT 彩色液晶屏

TFT液晶屏.jpg

1、实验目的

l         了解TFT型彩色LCD彩色显示屏的工作原理和接口。
l         掌握FS2410和LCD显示屏的接口原理。
l         掌握LCD彩色及绘制简单的图形的编程。
2、实验内容
l         编写程序,实现再任意位置画长方形的功能以及显示图片。
3、实验设备
l         S3C2410开发板。
l         ADS1.2集成开发环境,JTAG调试器。
l         串口连接线。
4、实验原理
4.1 LCD原理介绍
电视机所采用的 CRT(阴极射线管)有着体积大、重量重、尺寸受限等缺点。随着电子科技的发展,对移动显示的要求越来越多,CRT 的先天限制,让其小型化、行动化的理想受到阻碍。这使得开发新一代的显示器技术变得更有其必要! 新一代的显示器讲求几个重点:平面直角、画面显示不变形、轻薄短小耗能少,携带方便且同时要与现有的影像信号技术兼容。目前谈论到超薄型显示器技术,最普 及当是 TFT LCD 的应用了,举凡数字相机、笔记型计算机、PDA 等,需要显示复杂信息的电子产品通通少不了它。TFT LCD 技术又包含了,低温多硅晶TFT LCD、反射式TFT LCD 等多项不同的显示技术,下面我们就要来一探 LCD 的历史与原理。
液晶的诞生来自于一项非常特殊物质的发现,早在 1850 年 Virchow, Mettenheimer 和 Valentin 这三个人就发现 nerve fibre 的粹取物中含有这种不寻常的东西。到了 1877 年德国物理学家 Otto Lehmann 运用偏极化的显微镜首次观测到了液晶化的现象,但他对此一现象的成因并不了解。直到公元1888年,奥地利的植物学家 Friedrich Reinitzer(1857-1927)发现了螺旋性甲苯酸盐的化合物(cholesteryl benzoate),确认了这种化合物在加热时具有两个不同温度的熔点,在这两个不同的温度点中,其状态介于一般液态与固态物质之间,类似胶状,但在某一 温度范围内其又具有液体和结晶双方性质,由于其特殊的状态。Reinitzer 后来走访 Lehmann 深入探讨这种物质的表现,其后两人便命名这种物质为「Liquid Crystal」,就是液态结晶物质的意思。Reinitzer 和 Lehmann 这两人被誉为液晶之父。
 
4.2 液晶显示器的种类
超扭转式向列型(Super Twisted Nematic,简称STN)和薄膜式晶体管型(Thin Film Transistor;TFT)为目前的主流液晶屏。
 
STN/DSTN
STN型的显示原理也类似,不同的是TN型的液晶分子是将入射光旋转90度,而STN则可将入射光旋转180~270度。 单纯的 TN 显示器本身只有明暗两种显示(或黑白),无法产生色彩的变化。TN LCD 采用的是“直接驱动”无法显示较多的像素,且画面的对比小,反应速度慢,视角更仅在+30度以下(即观赏角度约60度),显示质量也较差;故TN型LCD 主要用途在于简单的数字符与文字的显示,如:电子表及电子计算器等。 STN的出现改善了视角狭小的缺点并提高对比率,STN以“多任务驱动”增加扫瞄线数提高画素显示,品质较TN来得高。再搭配彩色滤光片的使用,将单色显 示矩阵的任一像素(pixel)分成三个子像素(sub-pixel),分别透过彩色滤光片显示红、绿、蓝三原色,再经由三原色比例之调和,可以显示出逼 近全彩模式的色彩。由于 STN 显示的画面色彩对比度仍只达30:1(对比愈小,画面愈不清楚);反应速度为150ms(毫秒),作为一般操作显示接口尚可,但若要播放电影速度仍然不 够。
由于 STN 仍有不少缺点,后续的 DSTN则通过双扫描方式来显示,由于DSTN采用双扫描技术,因此显示效果相对STN来说,有大幅度提高。DSTN 反应速度可达到 100ms,但因它们都为“被动式驱动”,在电场反复改变电压的过程中,每一像素的恢复过程都较慢,在屏幕画面快速变化时,例如:显示网球比赛的转播,就 会产生所谓的“拖尾”现象。特别是当网球选手击球的那一瞬间,你就可以看到拖屏幕上出现“球迹尾”现象。不过,DSTN 价格便宜、功耗能低,一些 PDA 等,仍使用 DSTN 作为显示装置。
 
TFT
TN与STN型液晶显示器都是使用场电压驱动方式,如果显示尺寸加大,中心部位对电极变化的反应时间就会拉长,显示器的速度就跟不上。 为了改善这个的问题,主动式矩阵(active-matrix )驱动被提出,主动式 TFT型的液晶显示器的结构较为复杂包括了:背光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料和薄模式晶体管等等(如图3-2)。在TFT型 液晶显器中,导电玻璃上画上网状的细小线路,电极则由是薄膜式晶体管所排列而成的矩阵开关,在每个线路相交的地方配有控制闸,各显示点控制闸配合驱动讯号 作动。电极上之晶体管矩阵依显示讯号开启或关闭液晶分子的电压,使液晶分子轴转向而成“亮”或“暗”的对比,避免了显示器对电场效应的依靠,转以晶体管开 启和关闭的速率作为决定步骤。 也因此,TFT-LCD 的显示质量较 TN/STN佳,画面显示对比可达150:1以上,反应速度逼近 30ms 甚至更快。同时又可以全彩甚至真彩效果显示,产品适用于PDA、笔记型计算机、液晶显示器、汽车导航系统、数字相机及液晶投影机。
 
4.3 S3C2410内置LCD控制器详解
S3C2410X的内置LCD控制器支持单色、每象素2位(4级灰度)、每象素4位(16级灰度)的黑白屏,也支持每象素8位(256色)和每 象素12为(4096色)的彩色LCD,并且也支持每象素16位和每象素24位的真彩显示。
LCD控制器可以通过编程选择支持不同的LCD屏的要求,例如行和列象素,数据总线宽度,就口时序和刷新频率。LCD控制器的主要作用是将定位 于系统存储器的显示缓冲区的LCD图像数据传送到外部LCD驱动器。
 
S3C2410 LCD控制器的特性:
STN LCD屏
l         支持3种扫描方式:4bit单扫描、4位双扫描和8位单扫描的显示类型。
l         支持单色、4级灰度和16级灰度屏
l         支持黑白屏、256色和4096色彩色STN屏(CSTN)
l         支持分辩率为640*480、320*240、160*160以及其它规格的多种LCD
 
TFT LCD屏
l         支持单色(1bpp)、4级灰度(2bpp)、256色(8bpp)调色彩色TFT显示屏(调色彩色TFT显示屏)。
l         支持64K(16bpp)和16M(24bpp)色非调色板显示模式(真彩TFT显示屏)。
l         支持分辩率为640*480,320*240及其它多种规格的LCD

S3C2410 LCD的控制线
l         VFRAME/VSYNC/STV : Frame synchronous signal (STN)/vertical synchronous signal(TFT)/SEC TFT signal
l         VLINE/HSYNC/CPV : Line synchronous pulse signal (STN)/horizontal synchronous signal(TFT)/SEC TFT signal
l         VCLK/LCD_HCLK : Pixel clock signal (STN/TFT)/SEC TFT signal
l         VD[23:0] : LCD pixel data output ports (STN/TFT/SEC TFT)
l         VM/VDEN/TP : AC bias signal for the LCD driver (STN)/data enable signal (TFT)/SEC TFT signal
l         LEND/STH : Line end signal (TFT)/SEC TFT signal
l         LCD_PWREN : LCD panel power enable control signal
l         LCDVF0 : SEC TFT Signal OE
l         LCDVF1 : SEC TFT Signal REV
l         LCDVF2 : SEC TFT Signal REVB
(SEC-Samsung Electronics Company)
 
VFRAME/VSYNC/STV :LCD控制器和LCD驱动器之间的帧同步信号。他通知LCD屏新的一帧显示,LCD控制器 在一个完整帧的显示后发出VFRAME信号。
VLINE/HSYNC/CPV :LCD控制器和LCD驱动器之间的同步脉冲信号,LCD驱动器通过他来将水平移位寄存器中的 内容显示到LCD屏上。LCD控制器在一整行数据全部传输到LCD驱动去后,插入一个VLINE信号。
VCLK/LCD_HCLK :此信号为LCD控制器和LCD驱动器之间的象素时钟信号,LCD控制器在VCLK的上升沿发送数 据,LCD驱动器在VCLK的下降沿采样数据。
VM:LCD驱动器所使用的交流信号,LCD驱动器使用VM信号改变用于打开或关闭象素的行和列电压的极性,从而 控制象素点的显示或熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步。
VD[23:0] :LCD象素数据输出端口,也就是我们所说的RGB信号线。
 
TFT液晶屏显示实验 - Remember to be happy - py的博客
S3C2410内部的LCD控制器的逻辑示意图
 
REGBANK 是LCD控制器的寄存器组,用来对LCD控制器的各项参数进行设置。而 LCDCDMA 则是LCD控制器专用的DMA信道,负责将视频资料从系统总线(System Bus)上取来,通过 VIDPRCS 从VD[23:0]发送给LCD屏。同时 TIMEGEN 和 LPC3600 负责产生 LCD屏所需要的控制时序,例如VSYNC、HSYNC、VCLK、VDEN,然后从 VIDEO MUX 送给LCD屏。
 
TFT屏时序分析
下图是TFT屏的典型时序。其中VSYNC是帧同步信号,VSYNC每发出1个脉冲,都意味着新的1屏视频资料开始发送。而HSYNC为行同步 信号,每个HSYNC脉冲都表明新的1行视频资料开始发送。而VDEN则用来标明视频资料的有效,VCLK是用来锁存视频资料的像数时钟
并且在帧同步以及行同步的头尾都必须留有回扫时间,例如对于VSYNC来说前回扫时间就是(VSPW+1)+(VBPD+1),后回扫时间就是 (VFPD+1);HSYNC亦类同。这样的时序要求是当初CRT显示器由于电子枪偏转需要时间,但后来成了实际上的工业标准,乃至于后来出现的TFT屏 为了在时序上于CRT兼容,也采用了这样的控制时序。TFT液晶屏显示实验 - Remember to be happy - py的博客
 
例:
YFARM9-EDU-1采用的是Samsung公司的1款3.5寸TFT真彩LCD屏,分辩率为240*320,下图为该屏的时序要求。
 TFT液晶屏显示实验 - Remember to be happy - py的博客
 
通过对比两图,我们不难看出:
VSPW+1=2 -> VSPW=1
VBPD+1=2 -> VBPD=1
LINVAL+1=320-> LINVAL=319
VFPD+1=3 -> VFPD=2
 
HSPW+1=4 -> HSPW=3
HBPD+1=7 -> HBPW=6
HOZVAL+1=240-> HOZVAL=239
HFPD+1=31 -> HFPD=30
以上各参数,除了LINVAL和HOZVAL直接和屏的分辩率有关,其它的参数在实际操作过程中应以上面的为参考,不应偏差太多。
 
在本项目中,多采用参数值如下:
VSPW=4
VBPD=2
LINVAL=319
VFPD=2
 
HSPW=6
HBPW=8
HOZVAL=239
HFPD=8
 
 
5、LCD控制器主要寄存器功能详解
l         LCD 控制器1――LCDCON1
TFT液晶屏显示实验 - Remember to be happy - py的博客
TFT液晶屏显示实验 - Remember to be happy - py的博客
LINECNT :当前行扫描计数器值,标明当前扫描到了多少行。
CLKVAL :决定VCLK的分频 比。LCD控制器输出的VCLK是直接由系统总线(AHB)
的工作频率HCLK(一般为100MHZ)直接分频得到的。做为240*320的TFT屏,应保证得出的VCLK在5~10MHz之间。
    MMODE :VM信号的触发模式(仅对STN屏有效,对TFT屏无意义。)
    PNRMODE :选择当前的显示模式,对于TFT屏而言,应选择[11],即TFT LCD panel。
    BPPMODE :选择色彩模式,对于真彩显示而言,选择16bpp(64K色)即可满足要求。
ENVID :使能LCD信号输出
 
l         LCD 控制器2――LCDCON2
TFT液晶屏显示实验 - Remember to be happy - py的博客
TFT液晶屏显示实验 - Remember to be happy - py的博客
    VBPD , LINEVAL , VFPD , VSPW 的各项含义已经在前面的时序图中得到体现,这里不再赘述。
 
l         LCD 控制器3――LCDCON3
TFT液晶屏显示实验 - Remember to be happy - py的博客
TFT液晶屏显示实验 - Remember to be happy - py的博客    HBPD , HOZVAL , HFPD 的各项含义已经在前面的时序图中得到体现,这里不再赘述。
 
l         LCD 控制器4――LCDCON4
TFT液晶屏显示实验 - Remember to be happy - py的博客
TFT液晶屏显示实验 - Remember to be happy - py的博客    HSPW 的含义已经在前面的时序图中得到体现,这里不再赘述。MVAL 只对 STN屏有效,对TFT屏无意义。
 
l         LCD 控制器5――LCDCON5
TFT液晶屏显示实验 - Remember to be happy - py的博客
TFT液晶屏显示实验 - Remember to be happy - py的博客    VSTATUS :当前VSYNC信号扫描状态,指明当前VSYNC同步信号处于何种扫描阶段。
HSTATUS :当前HSYNC信号扫描状态,指明当前HSYNC同步信号处于何种扫描阶段。
BPP24BL :设定24bpp显示模式时,视频资料在显示缓冲区中的排列顺序(即低位有效还是高位有效)。对于16bpp的 64K色显示模式,该设置位无意义。
FRM565 :对于16bpp显示模式,有2中形式,一种是RGB=5:5:5:1,另一种是5:6:5。后一 种模式最为常用,它的含义是表示64K种色彩的16bit RGB资料中,红色(R)占了5bit,绿色(G)占了6bit,兰色(B)占了5bit。
INVVCLK , INVLINE , INVFRAME , INVVD :通 过前面的时序图,我们知道,CPU的LCD控制器输出的时序默认是正脉冲,而LCD需要VSYNC(VFRAME)、VLINE(HSYNC)均为负脉 冲,因此 INVLINE 和 INVFRAME 必须设为“1 ”,即选择反相输出。 INVVDEN , INVPWREN , INVLEND 的功能同前面的类似。
PWREN :LCD电源使能控制。在CPU LCD控制器的输出信号中,有一个电源使能管脚LCD_PWREN,用来做为LCD屏电源的开关信号。
ENLEND 对普通的TFT屏无效,可以不考虑。
 
l         LCD 控制器5――LCDCON5
TFT液晶屏显示实验 - Remember to be happy - py的博客
    BSWP 和 HWSWP 为字节(Byte)或半字(Half-Word)交换使能。由于不同的GUI对FrameBuffer(显示缓冲区)的管理不同,必要时需要通过调整 BSWP 和 HWSWP 来适应GUI。
 
l         帧缓冲区起始地址寄存器1(LCDSADDR1)
TFT液晶屏显示实验 - Remember to be happy - py的博客
LCDBANK:表明在系统内存中的视频缓冲区,LCD帧缓存英小于4MB。
 
 
 
l         帧缓冲区起始地址寄存器2(LCDSADDR2)
TFT液晶屏显示实验 - Remember to be happy - py的博客
LCDBASEL=LCDBASEU+(PAGEWITH+OFFSIZE)×(LINEVAL+1)
 
l         帧缓冲区起始地址寄存器3(LCDSADDR3)
TFT液晶屏显示实验 - Remember to be happy - py的博客
 
6、程序实现
 
/**************************************************************
320×240 16Bpp TFT LCD数据和控制端口初始化
**************************************************************/
static void Lcd_Port_Init(void)
{
    //rGPCUP = 0xffffffff; // Disable Pull-up register
    rGPCUP = 0x0; // enable Pull-up register
    rGPCCON = 0xaaaa56a9; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
 
    //rGPDUP = 0xffffffff ; // Disable Pull-up register
    rGPDUP = 0x0 ; // enable Pull-up register
    rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
}
 
/**************************************************************
320×240 16Bpp TFT LCD功能模块初始化
**************************************************************/
static void Lcd_Init(void)
{
         //CLKVAL=5;MMODE=0;PNRMODE=11:11 = TFT LCD panel
         //BPPMODE=1100=16 bpp for TFT;ENVID0=Disable the video output and the LCD control signal.
         rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
    //VBPD=2;LINEVAL=319;VFPD=2;VSPW=4
         rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
         //HBPD=8;HOZVAL=239;HFPD=8
         rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
         //MVAL=13;HSPW=6
         rLCDCON4=(MVAL<<8)|(HSPW_240320);
         //FRM565=1,5:6:5 Format;INVVLINE,INVVFRAME,INVVD:normal
         //BSWP=0 ;HWSWP=1
         //FRM5:6:5,HSYNC and VSYNC are inverted----LQ035Q7DB02
rLCDCON5=(1<<11)|(0<<9)|(0<<8)|(0<<6)|(BSWP<<1)|(HWSWP);                  
         rLCDSADDR1=(((U32)LCD_BUFER>>22)<<21)|M5D((U32)LCD_BUFER>>1);
         rLCDSADDR2=M5D( ((U32)LCD_BUFER+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*2))>
>1 );
         //OFFSIZE=640-240=400;PAGEWIDTH=240
          rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)/1)<<11)|(LCD_XSIZE_TFT_240320/1);
}
 
/**************************************************************
LCD视频和控制信号输出或者停止,1开启视频输出
**************************************************************/
static void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
         rLCDCON1|=1; // ENVID=ON
    else
         rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
}
 
/**************************************************************
320×240 16Bpp TFT LCD全屏填充特定颜色单元或清屏
**************************************************************/
static void Lcd_ClearScr(U16 c)
{
         unsigned int x,y ;
                  
    for( y = 0 ; y < SCR_YSIZE_TFT_240320 ; y++ )
    {
    for( x = 0 ; x < SCR_XSIZE_TFT_240320 ; x++ )
    {
                            LCD_BUFER[y][x] = c;
    }
    }
}
 
 
///////////////////////////////源码分析 /////////////////////////////////
/*主函数 main.c*/
#include "2410addr.h"
#include "2410lib.h"
#include "timer.h"
#define CLOCK_LCD (1<<5)
#define EnableModuleClock(m) (rCLKCON |= (m)) //模块时钟使能
void Main(void)
{
 SetClockDivider(1, 1);//设置时钟分频(FCLK,HCLK,PCLK)
 SetSysFclk(DFT_FCLK_VAL);//设置CPU工作时钟
 Delay( 0 ) ;
    
 Port_Init();//GPIO端口初始化
 Isr_Init();//中断模式初始化
 
 Uart_Select(0);// 选择串口0
 Uart_Init(0, UART_BAUD);//初始化串口
 EnableModuleClock(CLOCK_LCD);// 使LCD时钟有效
 
 Lcd_Tft_240X320_Init();//初始化LCD
 Test_Lcd_Tft_240X320();//LCD 驱动测试
}

//LCD初始化
void Lcd_Tft_240X320_Init( void )
{   
    //320×240 16Bpp TFT LCD数据和控制端口初始
    Lcd_Port_Init();
    Lcd_Init();
    Lcd_EnvidOnOff(1);  //turn on vedio
 Lcd_ClearScr(0xffff);  //fill all screen with some color
 #define LCD_BLANK  16
 #define C_UP  ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
 #define C_RIGHT  ( LCD_XSIZE_TFT_240320 - LCD_BLANK*2 )
 #define V_BLACK  ( ( LCD_YSIZE_TFT_240320 - LCD_BLANK*4 ) / 6 )
 Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE_TFT_240320 - LCD_BLANK ), ( LCD_YSIZE_TFT_240320 - LCD_BLANK ),0x0000);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x001f);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07e0);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf800);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe0);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81f);  //fill a Rectangle with some color
 Glib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07ff);  //fill a Rectangle with some color
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/3070 人参与

发表评论:

欢迎使用手机扫描访问本站,还可以关注微信哦~