TFT LCD控制显示总结(硬件概念、初始化相关配置)(转)

源地址:http://nervfzb.blog.163.com/blog/static/314813992011215105432369/

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

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


信号名称


描述


VSYNC


垂直同步信号


HSYNC


水平同步信号


HCLK


像素时钟信号


VD[23:0]


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


LEND


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


PWREN


电源开关信号

S3C2440提供的接口情况:

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

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

TFT LCD在S3C2440上的初始化:

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


名称


说明


LCDCON1~LCDCON5


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


LCDSADDR1~LCDSADDR3


用于设置帧内存的地址

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

LCDCON1寄存器


功能名称



说明


CLKVAL


[17:8]


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

计算公式: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生产厂家提供资料中的Vsync的Back-Porch参数得知)


LINEVAL


[23:14]


LCD垂直宽度:(LINEVAL + 1)行


VFPD


[13:6]


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


VSPW


[5:0]


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

LCDCON3寄存器


功能



说明


HBPD


[25:19]


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


HOZVAL


[18:8]


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


HFPD


[7:0]


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

LCDCON4寄存器


功能



说明


HSPW


[7:0]


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

LCDCON5寄存器


功能



说明


BPP24BL


[12]


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


FRM565


[11]


当TFT LCD的BPPMODE被设置为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的虚拟屏幕,就是指显示图像的大小最大可达4MB。4MB的图像,即使使用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  } 

参考书籍:

赵春江的博客:《s3c2440的LCD应用》http://blog.csdn.net/zhaocj/archive/2010/03/19/5397180.aspx

韦东山:《嵌入式Linux应用开发完全手册》

S3C2440芯片资料

LQ035NC211屏幕资料

时间: 2024-10-05 22:54:00

TFT LCD控制显示总结(硬件概念、初始化相关配置)(转)的相关文章

服务启动初始化相关配置 如XML、properties、log等文件

/** * */ package com.companyName.dhm.common.init; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.InputStreamReader; import java.util.Iterator; import javax.servlet.Servlet

【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章       STM32H7的LTDC应用之LCD汉字显示和2D图形显示 本章教程为大家讲解LTDC应用中最基本的汉字显示和2D图形显示功能实现. 51.1 初学者重要提示 51.2 LCD相关的基础支持 51.3 LCD硬件设计 51.4 LCD驱动设计 51.5 LCD板级支持包(bsp_ltdc_h7.c和bsp_tft_lcd.c) 51.6 LCD的

嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示

在基于Linux的视频监控采集系统中,摄像头采集到的一帧视频图像数据一般都是经过硬件自动压缩成jpeg格式的,然后再保存到摄像头设备的缓冲区.如果要把采集到的jpeg格式显示在本地LCD屏上,由于我们的Linux系统没有移植任何GUI系统,就要考虑以下方面:1. 将jpeg格式解压缩为位图格式,也就是jpeg解码. 2. 将解码出来的位图格式输出到本地的LCD屏上. 在Linux系统下是通过写入帧缓冲(framebuffer)来实现的. 3. framebuffer相当于为LCD设备提供一个统一

线程安全变量控制显示隐藏loading框

一.线程安全变量控制显示隐藏loading框 问题描述: 同一页面有两个异步网络请求,第一个请求开始,loading旋转,第二个请求开始loading旋转,第一个结束,loading停止旋转,可是这时第二个请求还没有结束,然后loading就结束了,于是问题就来了. 解决方案: 二.由上面问题引申出的问题: 1. #import <libkern/OSAtomic.h> 这段话是从网上copy过来的,总结了一下原子操作的作用.但是文中提到的osbase.h文件找不到.可能是因为版本升级我的li

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库 一.控制显示多少位小数位 有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了 double a = 3.14159265359;double weishu = 5;double b = Math.pow(10,weishu);a = Math.round(a*b)/b; 二.

jquery通过ajax获取数据,控制显示的数据条数

效果图: 现在我们可以先看它的json数据,如图所示:                然后可以对应我们的代码进行理解. jquery通过ajax获取数据,并通过窗口大小控制显示的数据条数,以及可以根据需求隐掉列数据. <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> html,body {

使用TFT LCD制作Arduino触摸屏计算器

Arduino开发板总是可以帮助我们轻松地构建一个项目,并使其看起来更具有吸引力.对一个带有触摸功能的液晶显示屏进行编程听起来可能是一件复杂的工作,但是通过使用Arduino库和扩展模块可以使得这项工作变得非常简单.在本项目中,我们将使用一个2.4寸Arduino TFT液晶屏来构建Arduino触摸屏计算器,它可以执行加法.减法.除法和乘法等所有基本计算. 所需材料 1.    Arduino Uno开发板 2.   2.4寸TFT LCD液晶显示屏模块 3.   9V电池. 了解TFT LC

CSS控制显示超出部分,用省略号显示

常用,但是常忘,我又不是写css的,所以记下来: 先设置一下限制的宽度, display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; CSS控制显示超出部分,用省略号显示

CSS 相对/绝对(relative/absolute)定位与jQuery的控制显示隐藏

曾经写显示隐藏老是用jq方法控制: dom.show(); dom.hide(); 事实上这样还是有非常多缺陷的. 这是html结构: <div class="holi"> here are some test words </div> <div id="button">点击显示</div> 假设使用position:absolute和top-9999px控制点隐藏 .holi{ width: 200px; heigh