zoukankan      html  css  js  c++  java
  • LCD

    TFT液晶屏:显示屏可以做的很大

    STN液晶屏:不能做大屏,否则反应迟钝 

    水平同步信号 = 画出一条横越屏幕线的时间,
    垂直同步信号 = 从屏幕顶部画到底部,再返回原始位置的时间,

     

    外部引脚信号:
    VSYNC: 垂直同步信号,表示扫描1帧的开始。
    HSYNC: 水平同步信号,表示扫描1行的开始。
    VDEN:数据使能信号。
    VD[23:0] : LCD像素数据输出端口。
    VCLK:像素时钟信号。
    寄存器参数:
    VSPW:垂直同步信号的脉宽,单位为1行(Line)的时间。
    VFPD: 垂直同步信号的前肩,单位为1行(Line)的时间。
    VBPD: 垂直同步信号的后肩,单位为1行(Line)的时间。
    LINEVAL :垂直显示尺寸-1,即屏行宽-1。
    HBPD:水平同步信号的后肩,单位为1VCLK的时间。
    HFPD:水平同步信号的前肩,单位为1VCLK的时间。
    HSPW:水平同步信号的脉宽,单位为1VCLK的时间。
    HOZVAL:水平显示尺寸-1,即屏列宽-1。
    由上图可知:
    扫描一帧所需的时间:=((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。
    扫描一行所所需的时间:= ((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。
    而一个VCLK时间由LCD寄存器LCDCON1内的CLKVAL决定:=HCLK/[2*(CLKVAL+1)]
    因此扫描一帧所需的时间:
    T=[(VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1)]* [(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/[2*(CLKVAL+1)]
    即帧频率为:1/T

     

    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屏电源的开关信号。允许ENVID控制LCD_PWREN来进行LCD电源的打开关闭
    ENLEND 对普通的TFT屏无效,可以不考虑。
    BSWP 和 HWSWP 为字节(Byte)或半字(Half-Word)交换使能。由于不同的GUI对FrameBuffer(显示缓冲区)的管理不同,必要时需要通过调整 BSWP 和 HWSWP 来适应GUI。

     

    TFT LCD是嵌入式中比较常用的显示器,S3C2440/S3C2410都提供了接口进行支持。这里总结下其接口的相关特性。

    TFT LCD硬件需要的控制信号:

    信号名称

    描述

    VSYNC

    垂直同步信号

    HSYNC

    水平同步信号

    HCLK

    像素时钟信号

    VD[23:0]

    数据信号(TFT LCD的数据接口还有串行形式,这里的是并行方式的)

    LEND

    行结束信号(具体操作中不是必须)

    PWREN

    电源开关信号

    S3C2440提供的接口情况:

    由于S3C2440支持多种屏,所以其很多控制管脚是复用的。

     

     

    由上面的对应关系,GPC0——GPC4是负责TFT LCD控制信号LENDVCLKVLINEHSYNC)、VFRAMVSYNC)、VMVDEN)的管脚;S3C2440支持的TFT LCD是采用并行方式的数据接口,GPC8——GPC15是负责VD0——VD7的数据信号;GPD0——GPD15是负责VD8——VD23的数据信号;GPG4是负责TFT LCD电源开关的信号管脚。

    TFT LCDS3C2440上的初始化:

    S3C2440上通过配置寄存器来初始化其LCD控制器,下面主要总结下TFT LCD初始化所用到的寄存器:

    名称

    说明

    LCDCON1~LCDCON5

    指定使用的LCD类型、设置LCD各类控制信号的时间特性等

    LCDSADDR1~LCDSADDR3

    用于设置帧内存的地址

    S3C2440使用LCDCON1~LCDCON5来初始化LCD控制器的控制功能。下面的图表展示了各个寄存器初始化情况:

    LCDCON1寄存器

    功能名称

    说明

    CLKVAL

    [17:8]

    设置TFT LCDVCLK(像素时钟)的大小

    计算公式:VCLK = HCLK /[(CLKVAL +1) × 2]

    PNRMODE

    [6:5]

    设置LCD的类型,对于TFT LCD设为0x3

    BPPMODE

    [4:1]

    设置像素模式,对于TFT LCD可以设置为如下几个值:

    0x8 —— 1bpp

    0x9 —— 2bpp

    0xa —— 4bpp

    0xb —— 8bpp

    0xc —— 16bpp

    0xd —— 24bpp

    ENVID

    [0]

    LCD信号输出使能位,0:禁止,1:使能 (打开这个LCD控制器才能输出LCD信号,注意区别电源开关信号)

    LCDCON2寄存器

    功能

    说明

    VBPD

    [31:24]

    TFT LCD信号的垂直信号后肩-1(通过查阅对应的TFT LCD生产厂家提供资料中的VsyncBack-Porch参数得知)

    LINEVAL

    [23:14]

    LCD垂直宽度:(LINEVAL + 1)

    VFPD

    [13:6]

    TFT LCD信号的垂直信号前肩-1(通过查阅对应的TFT LCD生产厂家提供资料中的VsyncFront-Porch参数得知)

    VSPW

    [5:0]

    TFT LCD信号的垂直信号脉宽-1(通过查阅对应的TFT LCD生产厂家提供资料中的VsyncPulse Width参数得知)

    LCDCON3寄存器

    功能

    说明

    HBPD

    [25:19]

    TFT LCD信号的水平信号后肩-1(通过查阅对应的TFT LCD生产厂家提供资料中的HsyncBack-Porch参数得知)

    HOZVAL

    [18:8]

    LCD的水平宽度:(HOZVAL +1)列(像素)

    HFPD

    [7:0]

    TFT LCD信号的水平信号前肩-1(通过查阅对应的TFT LCD生产厂家提供资料中的HsyncFront-Porch参数得知)

    LCDCON4寄存器

    功能

    说明

    HSPW

    [7:0]

    TFT LCD信号的水平信号脉宽-1(通过查阅对应的TFT LCD生产厂家提供资料中的HsyncPulse Width参数得知)

    LCDCON5寄存器

    功能

    说明

    BPP24BL

    [12]

    TFT LCDBPPMODE被设置成为24bpp时,需要设置这个表示14字节数据(32位)中哪3个字节是像素数据:0——LSB有效(低地址的3个字节);1——MSB有效(高地址的3个字节)

    FRM565

    [11]

    TFT LCDBPPMODE被设置为16bpp时,一个像素所使用的数据格式:0——5:5:5:1格式;1——5:6:5格式

    INVVCLK

    [10]

    设置VCLK信号有效沿的极性:0——VCLK的下降沿读取数据;1——VCLK的上升沿读取数据

    INVVLINE

    [9]

    设置VLINE/HSYNC脉冲的极性:0——正常的极性;1——反转的极性

    INVVFRAME

    [8]

    设置VFRAME/VSYNC脉冲的极性:0——正常的极性;1——反转的极性

    INVVD

    [7]

    设置VD数据线表示数据(0/1)的极性:0——正常的极性;1——反转的极性

    INVVDEN

    [6]

    设置VDEN信号的极性:0——正常的极性;1——反转的极性

    INVPWREN

    [5]

    设置PWREN信号的极性:0——正常的极性;1——反转的极性

    INVLEND

    [4]

    设置LEND信号的极性:0——正常的极性;1——反转的极性

    PWREN

    [3]

    LCD_PWREN信号输出使能:0——禁止;1——使能

    ENLEND

    [2]

    LEND信号输出使能:0——禁止;1——使能

    BSWP

    [1]

    字节交换使能:0——禁止;1——使能

    HWSWP

    [0]

    半字(2字节)交换使能:0——禁止;1——使能

    S3C2440支持4MB的虚拟屏幕,就是指显示图像的大小最大可达4MB4MB的图像,即使使用24bpp的模式也是一个比较大的图片(1024×1024)。为了更好的使用这个特性S3C2440对于图像数据的读取处理给出了一个直观的图像,这个图像中,可以看到屏幕可以当成一个窗口在这个4MB的图像区域滑动。这个窗口可大可小,但是这个一般由你的设备的屏幕决定(TQ2440的屏幕为3.5寸,大小为320×240)。

     

     

    上面表示虚拟屏幕的地址空间必须4MB对齐,所以取其起始地址的[30:22]表示虚拟屏幕的地址。窗口在这个4MB的空间内滑动,所以窗口的起始地址就取[21:1]就可以了,它们之间的配合是一种偏移量的配合。但是由于内存中的数据是一行行的存放,所以需要使用偏移量来描述窗口每一行之间的偏移量。

    S3C2440使用LCDSADDR1~LCDSADDR3初始化描述图像数据存放处的情况,下面图表展示如何描述图像数据存放内存,这个区域中的数据会被自动读取显示到屏幕上:

    LCDSADDR1寄存器

    功能

    说明

    LCDBANK

    [29:21]

    用来保存帧内存其实地址[30:22],帧内存起始地址必须4MB对齐

    LCDBASEU

    [20:0]

    TFT LCD模式下,这会用来保存视口(LCD屏幕左上角像素)所对应的内存起始地址[21:1],这块内存也称为LCD的帧缓冲区

    LCDSADDR2寄存器

    功能

    说明

    LCDBASEL

    [20:0]

    对于TFT LCD,用来保存LCD的帧缓冲结束地址[21:1],其值等于下面计算公式的结果:

    LCDBASEL = LCDBASEU + (PAGEWIDTH + OFFSIZE) × (LINEVAL + 1)

    LCDSADDR3寄存器

    功能

    说明

    OFFSIZE

    [21:11]

    表示上一行最后一个数据和下一行第一个数据地址之间的差值的一半,即以半字为单位的地址差(0表示两行数据是紧接的,1表示它们之间有2个字节的偏移,以此类推)

    PAGEWIDTH

    [10:0]

    视口的宽度,以半字为单位

    在所有寄存器配置完成后,不要忘记打开电源。将GPG4管脚置1启动LCD显示。最后开启整个的信号使能。

    程序分析:

             具体到程序上,初始化配置可以封装到一个函数中去。函数尽量增强可扩展型,所以在初始化的过程中可以指定要显示图像的图像模式,同时对不同图像模式对数据的不同要求对帧内存的初始化也做了相应的封装。

    01  void lcd_init(unsigned char pic_mode) 
    02  { 
    03      //配置LCD相关引脚 
    04      GPCUP = 0x00000000; 
    05      GPCCON = 0xaaaa02a9; 
    06      GPDUP = 0x00000000; 
    07      GPDCON = 0xaaaaaaaa; 
    08      //配置寄存器确定相关时序 
    09      LCDCON1 = (CLKVAL << 8) | (MVAL_USED << 7) | (PNRMODE_TFT << 5) / 
    10                | (BPPMODE_TFT(pic_mode) << 1) | 0; 
    11      LCDCON2 = (VBPD << 24) | (LINEVAL << 14) | (VFPD << 6) | VSPW; 
    12      LCDCON3 = (HBPD << 19) | (HOZVAL << 8) | HFPD; 
    13      LCDCON4 = HSPW; 
    14      LCDCON5 = (BPP24BL << 12) | (FRM565 << 11) | / 
    15                (INVVCLK << 10) | (INVVLINE << 9) | / 
    16                (INVVFRAME << 8) | (0 << 7) | (INVVDEN << 6) | / 
    17                (PWREN << 3) | (BSWP << 1) | HWSWP; 
    18      //配置寄存器指明图像数据的内存地址 
    19      LCDSADDR1 = ((LCD_BUFFER >> 22) << 21) | / 
    20                  M5D(LCD_BUFFER >> 1); 
    21      switch(pic_mode) 
    22      { 
    23      case BPP24: 
    24          LCDSADDR2 = M5D((LCD_BUFFER + / 
    25                           (LCD_WIDTH * LCD_HEIGHT * 4)) >> 1); 
    26          LCDSADDR3 = LCD_WIDTH * 32 / 16;//two half words 
    27          break; 
    28      case BPP16: 
    29          LCDSADDR2 = M5D((LCD_BUFFER + (LCD_WIDTH * / 
    30                                         LCD_HEIGHT * 2)) >> 1); 
    31          LCDSADDR3 = LCD_WIDTH * 32 / 32;//one half words 
    32          break; 
    33      default: 
    34          break; 
    35      } 
    36      LCDINTMSK |= 3;//屏蔽LCD中断 
    37      TCONSEL = 0;//无效LPC3480 
    38   
    39      GPGUP = (GPGUP & (~(1 << 4))) | (1 << 4);//GPG4上拉电阻无效 
    40      GPGCON = (GPGCON & (~(3 << 8))) | (3 << 8);//设置GPG4LCD_PWREN 
    41      GPGDAT = GPGDAT | (1 << 4);//GPG4置1打开电源信号 
    42   
    43      LCDCON5 = (LCDCON5 & (~(1 << 3))) | (1 << 3);//有效PWREN信号 
    44      LCDCON5 = (LCDCON5 & (~(1 << 5))) | (0 << 5);//PWREN信号极性不翻转 
    45   
    46      LCDCON1 |= 1;//LCD开启(LCD信号输出使能位) 
    47  } 

     http://blog.csdn.net/jaylondon/article/details/6363741

  • 相关阅读:
    记一下后续要看的点
    vue 封装request.js
    shuf命令简单用法
    Redis string 字符串
    Redis 事务操作
    Redis Zset 有序集合
    php操作redis的一些基本操作
    pytest自动化测试入门介绍
    idea&myeclipse 自动生成serialVersionUID
    leetCode1104. 二叉树寻路(medium)
  • 原文地址:https://www.cnblogs.com/liuchengchuxiao/p/4187629.html
Copyright © 2011-2022 走看看