S3C2440上LCD驱动详解

S3C2440上LCD驱动详解
S3C2440上LCD驱动详解

S3C2440上LCD驱动(FrameBuffer)实例开发讲解一、开发环境

·主机:VMWare--Fedora 9

·开发板:Mini2440--64MB Nand, Kernel:2.6.30.4

·编译器:arm-linux-gcc-4.3.2

二、背景知识

1. LCD工作的硬件需求:

要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG 的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD 控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。

2. S3C2440内部LCD控制器结构图:

我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器:

a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;

b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的;

c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上;

d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;

e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN 就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的

STN/TFT屏)。

3. 常见TFT屏工作时序分析:

LCD提供的外部接口信号:

VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT信号;HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT信号;

VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC TFT信号;

VD[23:0]:LCD像素数据输出端口(TFT/STN/SEC TFT);

VDEN/VM/TP:数据使能信号(TFT)/LCD驱动交流偏置信号(STN)/SEC TFT 信号;

LEND/STH:行结束信号(TFT)/SEC TFT信号;

LCD_LPCOE:SEC TFT OE信号;

LCD_LPCREV:SEC TFT REV信号;

LCD_LPCREVB:SEC TFT REVB信号。

所有显示器显示图像的原理都是从上到下,从左到右的。这是什么意思呢?这么说吧,一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。那么这幅图在LCD上的显示原理就是:

A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD

上显示,在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟

信号;

B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在

上面的时序图中就称之为1 Line;

C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针

在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行

切换;

D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图

显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC;

E:然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定

的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样

或者不一样,目的只是为了将图像持续的显示在LCD上)。那么这一副一副

的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看

出1 Line只是1 Frame中的一行;

F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,

那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC。

上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册)

VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后

的无效的行数,对应驱动中的upper_margin;

VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以

前的无效的行数,对应驱动中的lower_margin;

VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;

HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数

据开始之间的VCLK的个数,对应驱动中的left_margin;

HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平

同步信号开始之间的VCLK的个数,对应驱动中的right_margin;

HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK

计算,对应驱动中的hsync_len;

对于以上这些参数的值将分别保存到REGBANK寄存器组中的

LCDCON1/2/3/4/5寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)

LCDCON1:17 - 8位CLKVAL

6 - 5位扫描模式(对于STN屏:4位单/双扫、8位单扫)

4 - 1位色位模式(1BPP、8BPP、16BPP等)

LCDCON2:31 - 24位VBPD

23 - 14位LINEVAL

13 - 6位VFPD

5 - 0位VSPW

LCDCON3:25 - 19位HBPD

18 - 8位HOZVAL

7 - 0位HFPD

LCDCON4:7 - 0位HSPW

LCDCON5:

4. 帧缓冲(FrameBuffer):

帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过FrameBuffer定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。下面来看一下在不同色位模式下缓冲区与显示点的对应关系:

三、帧缓冲(FrameBuffer)设备驱动结构:

帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在

/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数,最大允许有32个FrameBuffer,定义在/include/linux/fb.h中的FB_MAX,对应于文件系统下/dev/fb%d设备文件。

1. 帧缓冲设备驱动在Linux子系统中的结构如下:

我们从上面这幅图看,帧缓冲设备在Linux中也可以看做是一个完整的子系统,大体由fbmem.c和xxxfb.c组成。向上给应用程序提供完善的设备文件操作接口(即对FrameBuffer设备进行read、write、ioctl等操作),接口在Linux提供的fbmem.c文件中实现;向下提供了硬件操作的接口,只是这些接口Linux并没有提供实现,因为这要根据具体的LCD控制器硬件进行设置,所以这就是我们要做的事情了(即xxxfb.c部分的实现)。

2. 帧缓冲相关的重要数据结构:

从帧缓冲设备驱动程序结构看,该驱动主要跟fb_info结构体有关,该结构体记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及对底层硬件操作的函数指针。在Linux中,每一个帧缓冲设备都必须对应一个fb_info,fb_info 在/linux/fb.h中的定义如下:(只列出重要的一些)

struct fb_info {

int node;

int flags;

struct fb_var_screeninfo var;/*LCD可变参数结构体*/

struct fb_fix_screeninfo fix;/*LCD固定参数结构体*/

struct fb_monspecs monspecs;/*LCD显示器标准*/

struct work_struct queue;/*帧缓冲事件队列*/

struct fb_pixmap pixmap;/*图像硬件mapper*/

struct fb_pixmap sprite;/*光标硬件mapper*/

struct fb_cmap cmap;/*当前的颜色表*/

struct fb_videomode *mode;/*当前的显示模式*/

#ifdef CONFIG_FB_BACKLIGHT

struct backlight_device *bl_dev;/*对应的背光设备*/

struct mutex bl_curve_mutex;

u8 bl_curve[FB_BACKLIGHT_LEVELS];/*背光调整*/

#endif

#ifdef CONFIG_FB_DEFERRED_IO

struct delayed_work deferred_work;

struct fb_deferred_io *fbdefio;

#endif

struct fb_ops *fbops; /*对底层硬件操作的函数指针*/

struct device *device;

struct device *dev;/*fb设备*/

int class_flag;

#ifdef CONFIG_FB_TILEBLITTING

struct fb_tile_ops *tileops;/*图块Blitting*/

#endif

char __iomem *screen_base;/*虚拟基地址*/

unsigned long screen_size;/*LCD IO映射的虚拟内存大小*/

void*pseudo_palette;/*伪16色颜色表*/

#define FBINFO_STATE_RUNNING 0

#define FBINFO_STATE_SUSPENDED 1

u32 state;/*LCD的挂起或恢复状态*/

void*fbcon_par;

void*par;

};

其中,比较重要的成员有struct fb_var_screeninfo var、struct

fb_fix_screeninfo fix和struct fb_ops *fbops,他们也都是结构体。下面我们一个一个的来看。

fb_var_screeninfo结构体主要记录用户可以修改的控制器的参数,比如屏幕的分辨率和每个像素的比特数等,该结构体定义如下:

struct fb_var_screeninfo {

__u32 xres;/*可见屏幕一行有多少个像素点*/

__u32 yres;/*可见屏幕一列有多少个像素点*/

__u32 xres_virtual;/*虚拟屏幕一行有多少个像素点*/

__u32 yres_virtual;/*虚拟屏幕一列有多少个像素点*/

__u32 xoffset;/*虚拟到可见屏幕之间的行偏移*/

__u32 yoffset;/*虚拟到可见屏幕之间的列偏移*/

__u32 bits_per_pixel;/*每个像素的位数即BPP*/

__u32 grayscale;/*非0时,指的是灰度*/

struct fb_bitfield red;/*fb缓存的R位域*/

struct fb_bitfield green;/*fb缓存的G位域*/

struct fb_bitfield blue;/*fb缓存的B位域*/

struct fb_bitfield transp;/*透明度*/

__u32 nonstd;/* != 0 非标准像素格式*/

__u32 activate;

__u32 height;/*高度*/

__u32 width;/*宽度*/

__u32 accel_flags;

/*定时:除了pixclock本身外,其他的都以像素时钟为单位*/

__u32 pixclock;/*像素时钟(皮秒)*/

__u32 left_margin;/*行切换,从同步到绘图之间的延迟*/

__u32 right_margin;/*行切换,从绘图到同步之间的延迟*/

__u32 upper_margin;/*帧切换,从同步到绘图之间的延迟*/

__u32 lower_margin;/*帧切换,从绘图到同步之间的延迟*/

__u32 hsync_len;/*水平同步的长度*/

__u32 vsync_len;/*垂直同步的长度*/

__u32 sync;

__u32 vmode;

__u32 rotate;

__u32 reserved[5];/*保留*/

};

而fb_fix_screeninfo结构体又主要记录用户不可以修改的控制器的参数,比如屏幕缓冲区的物理地址和长度等,该结构体的定义如下:

struct fb_fix_screeninfo {

char id[16];/*字符串形式的标示符*/

unsigned long smem_start;/*fb缓存的开始位置*/

__u32 smem_len;/*fb缓存的长度*/

__u32 type;/*看FB_TYPE_* */

__u32 type_aux;/*分界*/

__u32 visual;/*看FB_VISUAL_* */

__u16 xpanstep;/*如果没有硬件panning就赋值为0 */

__u16 ypanstep;/*如果没有硬件panning就赋值为0 */

__u16 ywrapstep;/*如果没有硬件ywrap就赋值为0 */

__u32 line_length;/*一行的字节数*/

unsigned long mmio_start;/*内存映射IO的开始位置*/

__u32 mmio_len;/*内存映射IO的长度*/

__u32 accel;

__u16 reserved[3];/*保留*/

};

fb_ops结构体是对底层硬件操作的函数指针,该结构体中定义了对硬件的操作有:(这里只列出了常用的操作)

struct fb_ops {

struct module *owner;

//检查可变参数并进行设置

int(*fb_check_var)(struct fb_var_screeninfo *var,struct fb_info *info);

//根据设置的值进行更新,使之有效

int(*fb_set_par)(struct fb_info *info);

//设置颜色寄存器

int(*fb_setcolreg)(unsigned regno,unsigned red,unsigned green,

unsigned blue,unsigned transp,struct fb_info *info);

//显示空白

int(*fb_blank)(int blank,struct fb_info *info);

//矩形填充

void(*fb_fillrect)(struct fb_info *info,const struct fb_fillrect *rect);

//复制数据

void(*fb_copyarea)(struct fb_info *info,const struct fb_copyarea *region);

//图形填充

void(*fb_imageblit)(struct fb_info *info,const struct fb_image *image);

};

3. 帧缓冲设备作为平台设备:

在S3C2440中,LCD控制器被集成在芯片的内部作为一个相对独立的单元,所以Linux把它看做是一个平台设备,故在内核代码

/arch/arm/plat-s3c24xx/devs.c中定义有LCD相关的平台设备及资源,代码如下:

/* LCD Controller */

//LCD控制器的资源信息

static struct resource s3c_lcd_resource[]={

[0]={

.start = S3C24XX_PA_LCD, //控制器IO端口开始地址

.end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,//控制器IO端口结

束地址

.flags = IORESOURCE_MEM,//标识为LCD控制器IO端口,在驱动中

引用这个就表示引用IO端口

},

[1]={

.start = IRQ_LCD,//LCD中断

.end = IRQ_LCD,

.flags = IORESOURCE_IRQ,//标识为LCD中断

}

};

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

struct platform_device s3c_device_lcd ={

.name ="s3c2410-lcd",//作为平台设备的LCD设备名

.id =-1,

.num_resources = ARRAY_SIZE(s3c_lcd_resource),//资源数量

.resource = s3c_lcd_resource,//引用上面定义的资源

.dev ={

.dma_mask =&s3c_device_lcd_dmamask,

.coherent_dma_mask = 0xffffffffUL

}

};

EXPORT_SYMBOL(s3c_device_lcd);//导出定义的LCD平台设备,好在

mach-smdk2440.c的smdk2440_devices[]中添加到平台设备列表中

除此之外,Linux还在/arch/arm/mach-s3c2410/include/mach/fb.h中为LCD 平台设备定义了一个s3c2410fb_mach_info结构体,该结构体主要是记录LCD的硬件参数信息(比如该结构体的s3c2410fb_display成员结构中就用于记录LCD 的屏幕尺寸、屏幕信息、可变的屏幕参数、LCD配置寄存器等),这样在写驱动的时候就直接使用这个结构体。下面,我们来看一下内核是如果使用这个结构体的。在/arch/arm/mach-s3c2440/mach-smdk2440.c中定义有:

/* LCD driver info */

//LCD硬件的配置信息,注意这里我使用的LCD是NEC 3.5寸TFT屏,这

些参数要根据具体的LCD屏进行设置

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata ={

//这个地方的设置是配置LCD寄存器5,这些宏定义在regs-lcd.h中,计

算后二进制为:111111111111,然后对照数据手册上LCDCON5的各位来

看,注意是从右边开始

.lcdcon5 = S3C2410_LCDCON5_FRM565 |

S3C2410_LCDCON5_INVVLINE |

S3C2410_LCDCON5_INVVFRAME |

S3C2410_LCDCON5_PWREN |

S3C2410_LCDCON5_HWSWP,

.type = S3C2410_LCDCON1_TFT,//TFT类型

/* NEC 3.5'' */

.width = 240,//屏幕宽度

.height = 320,//屏幕高度

//以下一些参数在上面的时序图分析中讲到过,各参数的值请跟据具体的LCD屏数据手册结合上面时序分析来设定

.pixclock = 100000,//像素时钟

.xres = 240,//水平可见的有效像素

.yres = 320,//垂直可见的有效像素

.bpp = 16,//色位模式

.left_margin = 19,//行切换,从同步到绘图之间的延迟

.right_margin = 36,//行切换,从绘图到同步之间的延迟

.hsync_len = 5,//水平同步的长度

.upper_margin = 1,//帧切换,从同步到绘图之间的延迟

.lower_margin = 5,//帧切换,从绘图到同步之间的延迟

.vsync_len = 1,//垂直同步的长度

};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata ={

.displays =&smdk2440_lcd_cfg,//应用上面定义的配置信息

.num_displays = 1,

.default_display = 0,

.gpccon = 0xaaaa555a,//将GPC0、GPC1配置成LEND和VCLK,将GPC8-15配置成VD0-7,其他配置成普通输出IO口

.gpccon_mask = 0xffffffff,

.gpcup = 0x0000ffff,//禁止GPIOC的上拉功能

.gpcup_mask = 0xffffffff,

.gpdcon = 0xaaaaaaaa,//将GPD0-15配置成VD8-23

.gpdcon_mask = 0xffffffff,

.gpdup = 0x0000ffff,//禁止GPIOD的上拉功能

.gpdup_mask = 0xffffffff,

.lpcsel = 0x0,//这个是三星TFT屏的参数,这里不用

};

注意:可能有很多朋友不知道上面红色部分的参数是做什么的,其值又是怎么设置的?其实它是跟你的开发板LCD控制器密切相关的,看了下面两幅图相信就大概知道他们是干什么用的:

上面第一幅图是开发板原理图的LCD控制器部分,第二幅图是S3c2440数据手册中IO端口C和IO端口D控制器部分。原理图中使用了GPC8-15和GPD0-15来用做LCD控制器VD0-VD23的数据端口,又分别使用GPC0、GPC1端口用做LCD控制器的LEND和VCLK信号,对于GPC2-7则是用做STN屏或者三星专业TFT屏的相关信号。然而,S3C2440的各个IO口并不是单一的功能,都是复用端口,要使用他们首先要对他们进行配置。所以上面红色部分的参数就是把GPC和GPD的部分端口配置成LCD控制功能模式。

从以上讲述的内容来看,要使LCD控制器支持其他的LCD屏,重要的是根据LCD的数据手册修改以上这些参数的值。下面,我们再看一下在驱动中是如果引用到s3c2410fb_mach_info结构体的(注意上面讲的是在内核中如何使用的)。在mach-smdk2440.c中有:

//S3C2440初始化函数

static void __init smdk2440_machine_init(void)

{

//调用该函数将上面定义的LCD硬件信息保存到平台数据中

s3c24xx_fb_set_platdata(&smdk2440_fb_info);

s3c_i2c0_set_platdata(NULL);

platform_add_devices(smdk2440_devices,

ARRAY_SIZE(smdk2440_devices));

smdk_machine_init();

}

s3c24xx_fb_set_platdata定义在plat-s3c24xx/devs.c中:

void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)

{

struct s3c2410fb_mach_info *npd;

npd = kmalloc(sizeof(*npd), GFP_KERNEL);

if(npd){

memcpy(npd, pd,sizeof(*npd));

//这里就是将内核中定义的s3c2410fb_mach_info结构体数据保存到

LCD平台数据中,所以在写驱动的时候就可以直接在平台数据中获取

s3c2410fb_mach_info结构体的数据(即LCD各种参数信息)进行操作

s3c_device_lcd.dev.platform_data = npd;

}else{

printk(KERN_ERR "no memory for LCD platform data\n");

}

}

这里再讲一个小知识:不知大家有没有留意,在平台设备驱动中,

platform_data可以保存各自平台设备实例的数据,但这些数据的类型都是不同

的,为什么都可以保存?这就要看看platform_data的定义,定义在

/linux/device.h中,void *platform_data是一个void类型的指针,在Linux 中void可保存任何数据类型。

四、帧缓冲(FrameBuffer)设备驱动实例代码:

①、建立驱动文件:my2440_lcd.c,依就是驱动程序的最基本结构:FrameBuffer驱动的初始化和卸载部分及其他,如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/*FrameBuffer设备名称*/

static char driver_name[] = "my2440_lcd";

/*定义一个结构体用来维护驱动程序中各函数中用到的变量

先别看结构体要定义这些成员,到各函数使用的地方就明白了*/

struct my2440fb_var

{

int lcd_irq_no;/*保存LCD中断号*/

struct clk *lcd_clock;/*保存从平台时钟队列中获取的LCD时钟*/

struct resource *lcd_mem;/*LCD的IO空间*/

void __iomem *lcd_base;/*LCD的IO空间映射到虚拟地址*/

struct device *dev;

struct s3c2410fb_hw regs;/*表示5个LCD配置寄存器,

s3c2410fb_hw定义在mach-s3c2410/include/mach/fb.h中*/

/*定义一个数组来充当调色板。

据数据手册描述,TFT屏色位模式为8BPP时,调色板(颜色表)的长度为256,调色板起始地址为0x4D000400*/

u32 palette_buffer[256];

u32 pseudo_pal[16];

unsigned int palette_ready;/*标识调色板是否准备好了*/

};

/*用做清空调色板(颜色表)*/

#define PALETTE_BUFF_CLEAR (0x80000000)

/*LCD平台驱动结构体,平台驱动结构体定义在platform_device.h中,该结构体成员接口函数在第②步中实现*/

static struct platform_driver lcd_fb_driver =

{

.probe = lcd_fb_probe,/*FrameBuffer设备探测*/

.remove= __devexit_p(lcd_fb_remove),/*FrameBuffer设备移除*/

.suspend = lcd_fb_suspend,/*FrameBuffer设备挂起*/

.resume = lcd_fb_resume,/*FrameBuffer设备恢复*/

.driver =

{

/*注意这里的名称一定要和系统中定义平台设备的地方一致,这样才能把平台设备与该平台设备的驱动关联起来*/

.name ="s3c2410-lcd",

.owner = THIS_MODULE,

},

};

static int __init lcd_init(void)

{

/*在Linux中,帧缓冲设备被看做是平台设备,所以这里注册平台设备*/

return platform_driver_register(&lcd_fb_driver);

}

static void __exit lcd_exit(void)

{

/*注销平台设备*/

platform_driver_unregister(&lcd_fb_driver);

}

TFT LCD液晶显示器的驱动原理

TFT LCD液晶显示器的驱动原理 我们针对feed through电压,以及二阶驱动的原理来做介绍.简单来说Feed through电压主要是由于面板上的寄生电容而产生的,而所谓三阶驱动的原理就是为了解决此一问题而发展出来的解决方式,不过我们这次只介绍二阶驱动,至于三阶驱动甚至是四阶驱动则留到下一次再介绍.在介绍feed through电压之前,我们先解释驱动系统中gate driver所送出波形的timing图. SVGA分辨率的二阶驱动波形 我们常见的1024*768分辨率的屏幕,就是我们通常称之为SVGA分辨率的屏幕.它的组成顾名思义就是以1024*768=786432个pixel来组成一个画面的数据.以液晶显示器来说,共需要1024*768*3个点(乘3是因为一个pixel需要蓝色,绿色,红色三个点来组成.)来显示一个画面.通常在面板的规划,把一个平面分成X-Y轴来说,在X轴上会有1024*3=3072列.这3072列就由8颗384输出channel的source driver 来负责推动.而在Y轴上,会有768行.这768行,就由3颗256输出channel的gate driver来负责驱动.图1就是SVGA分辨率的gate driver输出波形的timing图.图中gate 1 ~ 768分别代表着768个gate

driver的输出.以SVGA的分辨率,60Hz的画面更新频率来计算,一个frame的周期约为16.67 ms.对gate 1来说,它的启动时间周期一样为16.67ms.而在这16.67 ms之间,分别需要让gate 1 ~ 768共768条输出线,依序打开再关闭.所以分配到每条线打开的时间仅有16.67ms/768=21.7us而已.所以每一条gate d river打开的时间相对于整个frame是很短的,而在这短短的打开时间之内,source driver再将相对应的显示电极充电到所需的电压. 而所谓的二阶驱动就是指gate driver的输出电压仅有两种数值,一为打开电压,一为关闭电压.而对于common电压不变的驱动方式,不管何时何地,电压都是固定不动的.但是对于common电压变动的驱动方式,在每一个frame开始的第一条gate 1打开之前,就必须把电压改变一次.为什么要将这些输出电压的t iming介绍过一次呢?因为我们接下来要讨论的feed through电压,它的成因主要是因为面板上其它电压的变化,经由寄生电容或是储存电容,影响到显示电极电压的正确性.在LCD面板上主要的电压变化来源有3个,分别是gate driver电压变化,source driver电压变化,以及common电压变化.而这其中影响最大的就是gate driver电压变化(经由Cgd或是Cs),以及common电压变化(经由Clc或是Cs+Clc). Cs on common架构且common电压固定不动的feed through电压 我们刚才提到,造成有feed through电压的主因有两个.而在common电压固定不动的架构下,造成f eed through电压的主因就只有gate driver的电压变化了.在图2中,就是显示电极电压因为feed thro ugh电压影响,而造成电压变化的波形图.在图中,请注意到gate driver打开的时间,相对于每个frame 的时间比例是不正确的.在此我们是为了能仔细解释每个frame的动作,所以将gate driver打开的时间画的比较大.请记住,正确的gate driver打开时间是如同图1所示,需要在一个frame的时间内,依序将7

Linux的LCD驱动源码分析及移植

Linux的LCD驱动源码分析及移植(三部曲) 第一部分: 基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device) 1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。 2. LCD Controller的平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):

1./* LCD Controller */ 2. 3.static struct resource s3c_lcd_resource[] = { 4. [0] = { 5. .start = S3C24XX_PA_LCD, 6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1, 7. .flags = IORESOURCE_MEM, 8. }, 9. [1] = { 10. .start = IRQ_LCD, 11. .end = IRQ_LCD, 12. .flags = IORESOURCE_IRQ, 13. } 14. 15.}; 16. 17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL; 18. 19.struct platform_device s3c_device_lcd = { 20. .name = "s3c2410-lcd", 21. .id = -1, 22. .num_resources = ARRAY_SIZE(s3c_lcd_resource), 23. .resource = s3c_lcd_resource, 24. .dev = { 25. .dma_mask = &s3c_device_lcd_dmamask, 26. .coherent_dma_mask = 0xffffffffUL 27. } 28.}; 29. 30.EXPORT_SYMBOL(s3c_device_lcd); 平台设备的结构体定义为s3c_device_lcd,该设备在平台总线中的名字取为s3c2410-lcd,该平台设备申请的两个板级资源为以S3C24XX_PA_LCD为起始的IORESOURCE_MEM资源和一个定义为IRQ_LCD的IORESOURCE_IRQ资源。 其中, 1.#define S3C24XX_PA_LCD S3C2410_PA_LCD 1./* LCD controller */ 2.#define S3C2410_PA_LCD (0x4D000000) 3.#define S3C24XX_SZ_LCD SZ_1M 0x4D000000为LCDCON1寄存器的地址。

LED液晶显示器的驱动原理

LED液晶显示器的驱动原理 艾布纳科技有限公司 前两次跟大家介绍有关液晶显示器操作的基本原理, 那是针对液晶本身的特性,与TFT LCD 本身结构上的操作原理来做介绍. 这次我们针对TFT LCD 的整体系统面来做介绍, 也就是对其驱动原理来做介绍, 而其驱动原理仍然因为一些架构上差异的关系, 而有所不同. 首先我们来介绍由于Cs(storage capacitor)储存电容架构不同, 所形成不同驱动系统架构的原理. Cs(storage capacitor)储存电容的架构 一般最常见的储存电容架构有两种, 分别是Cs on gate与Cs on common这两种. 这两种顾名思义就可以知道, 它的主要差别就在于储存电容是利用gate走线或是common走线来完成的. 在上一篇文章中, 我曾提到, 储存电容主要是为了让充好电的电压,能保持到下一次更新画面的时候之用. 所以我们就必须像在CMOS的制程之 中, 利用不同层的走线, 来形成平行板电容. 而在TFT LCD的制程之中, 则是利用显示电极与gate走线或是common走线,所形成的平行板电容,来制作出储存电容Cs. For personal use only in study and research; not for commercial use

图1就是这两种储存电容架构, 从图中我们可以很明显的知道, Cs on gate由于不必像Cs on common一样, 需要增加一条额外的common走线, 所以它的开口率(Aperture ratio)会比较大. 而开口率的大小, 是影响面板的亮度与设计的重要因 素. 所以现今面板的设计大多使用Cs on gate的方式. 但是由于Cs on gate的方 式, 它的储存电容是由下一条的gate走线与显示电极之间形成的.(请见图2的Cs on gate与Cs on common的等效电路) 而gate走线, 顾名思义就是接到每一个TFT 的gate端的走线, 主要就是作为gate driver送出信号, 来打开TFT, 好让TFT对显 示电极作充放电的动作. 所以当下一条gate走线, 送出电压要打开下一个TFT时, 便会影响到储存电容上储存电压的大小. 不过由于下一条gate走线打开到关闭的时间很短,(以1024*768分辨率, 60Hz更新频率的面板来说. 一条gate走线打开的时间约为20us, 而显示画面更新的时间约为16ms, 所以相对而言, 影响有限.) 所以当下一条gate走线关闭, 回复到原先的电压, 则Cs储存电容的电压, 也会随之恢复到正常. 这也是为什么, 大多数的储存电容设计都是采用Cs on gate的方式的原因. For personal use only in study and research; not for commercial use

LCD驱动分析_LCD控制器设置及代码详解

LCD驱动分析_LCD控制器设置及代码详解 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD 控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的; c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上; d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。 3. 常见TFT屏工作时序分析: LCD提供的外部接口信号:

LCD1602驱动详解

一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD16 02的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示:

图1 再来一张它的背面的,如图2所示:

图2它的16条引脚定义如下:

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/RM063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电 平时,选择命令;当RS为高电平时,选择数据。 5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态 或数据。如果不需要进行读取操作,可以直接将其接VSS。 6. E,执行命令的使能引脚,接单片机的一个I/O。 7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意 的8个I/O口。如果接P0口,P0口应该接4.7K—10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。 8. A背光正极,可接一个10—47欧的限流电阻到VDD。 9. K背光负极,接VSS。见图4所示。

段式LCD驱动原理详解

LCD Driver(液晶驱动器) 在单片机的应用中,人机界面占据相当重要的地位。人机界面主要包括事件输入和结果指示,事件输入包括键盘输入,通讯接口,事件中断等,结果指示包括LED/LCD显示、通讯接口、外围设备操作等。而在这些人机界面当中,LCD 显示技术由于其具有界面友好,成本较低等特点而在很多应用场合得以广泛应用。 1.LCD的显示原理 在讲解LCD driver之前,我们先就LCD的显示原理作一简单的介绍。 LCD(Liquid Crystal Display)是利用液晶分子的物理结构和光学特性进行显示的一种技术。液晶分子的特性: 液晶分子是介于固体和液体之间的一种棒状结构的大分子物质; 在自然形态,具有光学各向异性的特点,在电(磁)场作用下,呈各向同性特点; 下面以直视型简单多路TN/STN LCD Panel(液晶显示面板)的基本结构介绍LCD的基本显示原理,示意图如图-1: 图-1 LCD的基本显示原理

整个LCD Panel 由上下玻璃基板和偏振片组成,在上下玻璃之间,按照螺旋结构将液晶分子有规律的进行涂层。液晶面板的电极是通过一种ITO 的金属化合物蚀刻在上下玻璃基板上。如图所示,液晶分子的排列为螺旋结构,对光线具有旋旋光性,上下偏振片的偏振角度相互垂直。在上下基板间的电压为0时,自然光通过偏振片后,只有与偏振片方向相同的光线得以进入液晶分子的螺旋结构的涂层中,由于螺旋结构的的旋旋光性,将入射光线的方向旋转90度后照射到另一端的偏振片上,由于上下偏振片的偏振角度相互垂直,这样入射光线通过另一端的偏振片完全的射出,光线完全进入观察者的眼中,看到的效果就为白色。而在上下基板间的电压为一交流电压时,液晶分子的螺旋结构在电(磁)场的作用下,变成了同向排列结构,对光线的方向没有作任何旋转,而上下偏振片的偏振角度相互垂直,这样入射光线就无法通过另一端的偏振片射出,光线无法进入观察者的眼中,看到的效果就为黑色。这样通过在上下玻璃基板电极间施加不同的交流电压,即可实现液晶显示的两种基本状态亮(On)和暗(Off)。 在实际的液晶模以驱动电压中,有几个参数非常关键: 交流电压,液晶分子是需要交流信号来驱动的,长时间的直流电压加在液晶分子两端,会影响液晶分子的电气化学特性,引起显示模糊,寿命的减少,其破坏性为不可恢复; 扫描频率,直接驱动液晶分子的交流电压的频率一般在60~100Hz 之间,具体是依据LCD Panel 的面积和设计而定,频率过高,会导致驱动功耗的增加,频率过低,会导致显示闪烁,同时如果扫描频率同光源的频率之间有倍数关系,则显示也会有闪烁现象出现。 图-2 帧频(Frame)示意图 液晶分子是一种电压积分型材料,它的扭曲程度(透光性)仅仅和极板间电压的有效值有关,和充电波形无关。电压的有效值用COM/SEG 之间的电压差值的均方根VRMS 表示: []dt t V T RMS V T 2 )(1 )(∫= LCD 显示黑白(透光和不透光)的电压有效值的分界电压称为开启电压Vth,当电压有效值超过Vth,螺旋结构的旋光角度加大,透光率急剧变化,透明度急剧上升。反之,则透明度急剧下降。光线的透射率与交流电压的有效值的关系如图-3:

TFT-LCD液晶显示器的驱动原理

TFT-LCD液晶显示器的驱动原理 LCD显示器在近年逐渐加快了替代CRT显示器的步伐,你打算购买一台LCD吗?你了解LCD吗?液晶显示器和传统的CRT显示器,在其发光的技术原理上有什么不同?传统的CRT 显示器主要是依靠显象管内的电子枪发射的电子束射击显示屏内侧的荧光粉来发光,在显示器内部人造磁场的有意干扰下,电子束会发生一定角度的偏转,扫描目标单元格的荧光粉而显示不同的色彩。而TFT-LCD却是采用“背光(backlight)”原理,使用灯管作为背光光源,通过辅助光学模组和液晶层对光线的控制来达到较为理想的显示效果。 液晶是一种规则性排列的有机化合物,它是一种介于固体和液体之间的物质,目前一般采用的是分子排列最适合用于制造液晶显示器的nematic细柱型液晶。液晶本身并不能构发光,它主要是通过因为电压的更改产生电场而使液晶分子排列产生变化来显示图像。 液晶面板主要是由两块无钠玻璃夹着一个由偏光板、液晶层和彩色滤光片构成的夹层所组成。偏光板、彩色滤光片决定了有多少光可以通过以及生成何种颜色的光线。液晶被灌在两个制作精良的平面之间构成液晶层,这两个平面上列有许多沟槽,单独平面上的沟槽都是平行的,但是这两个平行的平面上的沟槽却是互相垂直的。简单的说就是后面的平面上的沟槽是纵向

排列的话,那么前面的平面就是横向排列的。位于两个平面间液晶分子的排列会形成一个Z轴向90度的逐渐扭曲状态。背光光源即灯管发出的光线通过液晶显示屏背面的背光板和反光膜,产生均匀的背光光线,这些光线通过后层会被液晶进行Z 轴向的扭曲,从而能够通过前层平面。如果给液晶层加电压将会产生一个电场,液晶分子就会重新排列,光线无法扭转从而不能通过前层平面,以此来阻断光线。 LCD由两块玻璃板构成,厚约1mm,其间由包含有液晶(LC)材料的5μm均匀间隔隔开。因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。背光板发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层。液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。在液晶材料周边是控制电路部分和驱动电路部分。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。 液晶显示器的缺点在于亮度、画面均匀度、可视角度和反应

TFT_LCD液晶显示器的驱动原理详解

TFT LCD液晶显示器的驱动原理 TFT LCD液晶显示器的驱动原理(一) 我们针对TFT LCD的整体系统面来做介绍, 也就是对其驱动原理来做介绍, 而其驱动原理仍然因为一些架构上差异的关系, 而有所不同. 首先我们来介绍由于Cs(storage capacitor)储存电容架构不同, 所形成不同驱动系统架构的原理. Cs(storage capacitor)储存电容的架构 一般最常见的储存电容架构有两种, 分别是Cs on gate与Cs on common这两种. 这两种顾名思义就可以知道, 它的主要差别就在于储存电容是利用gate走线或是common走线来完成的. 在上一篇文章中, 我曾提到, 储存电容主要是为了让充好电的电压,能保持到下一次更新画面的时候之用. 所以我们就必须像在CMOS的制程之中, 利用不同层的走线, 来形成平行板电容. 而在TFT LCD的制程之中, 则是利用显示电极与gate走线或是common走线,所形成的平行板电容,来制作出储存电容Cs.

图1就是这两种储存电容架构, 从图中我们可以很明显的知道, Cs on gate由于不必像Cs on common一样, 需要增加一条额外的common走线, 所以它的开口率(Aperture ratio)会比较大. 而开口率的大小, 是影响面板的亮度与设计的重要因素. 所以现今面板的设计大多使用Cs on gate的方式. 但是由于Cs on gate的方式, 它的储存电容是由下一条的gate走线与显示电极之间形成的.(请见图2的Cs on gate与Cs on common的等效电路) 而gate走线, 顾名思义就是接到每一个TFT的gate端的走线, 主要就是作为gate driver送出信号, 来打开TFT, 好让TFT对显示电极作充放电的动作. 所以当下一条gate走线, 送出电压要打开下一个TFT时 ,便会影响到储存电容上储存电压的大小. 不过由于下一条gate走线打开到关闭的时间很短,(以1024*768分辨率, 60Hz更新频率的面板来说. 一条gate走线打开的时间约为20us, 而显示画面更新的时间约为16ms, 所以相对而言, 影响有限.) 所以当下一条gate走线关闭, 回复到原先的电压, 则Cs储存电容的电压, 也会随之恢复到正常. 这也是为什么, 大多数的储存电容设计都是采用Cs on gate 的方式的原因. 至于common走线, 我们在这边也需要顺便介绍一下. 从图2中我们可以发现, 不管您采用怎样的储存电容架构, Clc的两端都是分别接到显示电极与common. 既然液晶是充满在上下两片玻璃之间, 而显示电极与TFT都是位在同一片玻璃上, 则common电极很明显

LCD驱动程序分析

//****************************************************** * //* 2007.6.18 //****************************************************** * 在/kernel/include/asm-arm/arch-s3c2410/bitfield.h 文件中: #ifndef __ASSEMBLY__ #define UData(Data) ((unsigned long) (Data)) #else #define UData(Data) (Data) #endif 例:UData(5); = 5 /* * MACRO: Fld * * Purpose * The macro "Fld" encodes a bit field, given its size and its shift value

* with respect to bit 0. * * Note * A more intuitive way to encode bit fields would have been to use their * mask. However, extracting size and shift value information from a bit * field''''s mask is cumbersome and might break the assembler (255-character * line-size limit). * * Input * Size Size of the bit field, in number of bits. * Shft Shift value of the bit field with respect to bit 0. * * Output * Fld Encoded bit field. */

lcd16824驱动程序

#include #define fuc_PERIPH SYSCTL_PERIPH_GPIOE #define fuc_PORT GPIO_PORTE_BASE #define rs_PIN GPIO_PIN_0 #define rw_PIN GPIO_PIN_1 #define en_PIN GPIO_PIN_2 #define lcd_PERIPH SYSCTL_PERIPH_GPIOD #define lcd_PORT GPIO_PORTD_BASE #define lcd_PINS 0xff #define SysCtlPeriEnable SysCtlPeripheralEnable #define SysCtlPeriDisable SysCtlPeripheralDisable #define GPIOPinTypeIn GPIOPinTypeGPIOInput #define GPIOPinTypeOut GPIOPinTypeGPIOOutput #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD #define FIRST_ADDR 0 //定义字符/汉字显示起始位置 unsigned char CGRAM[]={ 0x08,0x20,0x1c,0x10,0x1c,0x1c,0xff,0x9e,0x7f,0x1e,0x1c,0x1f,0x3e,0x1f,0x3e, 0x1f, 0x77,0x1f,0x41,0x3f,0x00,0x7e,0x00,0xfe,0x83,0xfc,0x7f,0xf8,0x3f,0xf0,0x0f, 0xc0, }; unsigned char BMP1[]; unsigned char BMP2[]; unsigned char BMP3[]; unsigned char BMP4[]; unsigned char BMP5[]; unsigned char BMP6[]; unsigned char BMP7[]; unsigned char BMP8[]; unsigned char Num[]={'0','1','2','3','4','5','6','7','8','9','.'}; void delay (int m) { i nt n; f or(n=0;n<=m;n++); } void check(void) //判断是否忙碌 {

LCD驱动程序开发指南

LCD驱动开发指引 1、LCD驱动概述 LCD驱动程序调试,是整个手机研发过程中非常重要的一个环节,在每个新的机型开发的初期,最先都要调试LCD驱动程序,我们俗称“点屏”。“点屏”的调试包括两个部分,一是点亮LCD的背光,二是调试LCD显示。背光驱动调试的方法与技巧,会在背光文档中叙述,暂不在这篇文档里讨论,本文将重点讨论LCD的电路原理、驱动程序分析、LCD驱动调试经验总结和具体驱动调试案例的分析。 2、LCD原理及电路分析 相关概念: LCD:全称是Liquid Crystal Display 液晶显示屏 LCM:全称是Liquid Crystal Module指的是液晶显术模块,包括液晶屏及液晶的外围FPC电路和结构件。 LCD的FPC电路:指LCM模块中的液晶外围电路,这部分电路由LCD模组厂家按照我们对LCD的接口要求进行设计的。在LCD驱动调试中,看FPC电路图也是很重要的一个环节。 LCD外围电路:我们通常也简称为LCD电路,指的是baseband端的LCD接口电路部分,这部分电路由我们自行设计。 LCD模组厂家:指信利,天马,京东方这些厂家。他们将LCD制作成可以供我们生产使用的LCM模组。 2.1LCD芯片介绍 目前手机使用的大部分显示器件都是LCD(Liguid Crystal Display)器件,目前康佳使用的LCM模块由信利、京东方、天马、凌达这几家厂商供货。但是LCM生产厂家对我们调试驱动并没有任何关系,我们需要了解的是LCM所使用的IC型号。因为,我们实际上是对LCD的IC进行编程,间接控制LCD面板,常用的IC有HD66773、S6B33B2/ S6B33B6、HD66777等。 LCD驱动的编程,除了要关注IC的型号,还要关注LCD FPC的电路设计,LCD外围电路设计,基带芯片的LCD接口单元,背光IC的控制等几个方面,当然也包括软件的上层程序。下面我们就先了解一下LCD IC的内部结构,这是编程要关注的最主要方面。 LCD内部一般包含指令寄存器,和GRAM空间。指令寄存器用来设置LCD IC工作的电压、电流、时序、扫描方式等等的一系列内容,而GRAM空间被用来实现LCD刷屏。

LCD1602的单片机驱动详解

LCD1602的单片机驱动详解 一.接口 LCD1602是很多单片机爱好者较早接触的字符型液 晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不 了解,不能随心所欲地对它进行驱动。经过一段时间的 学习,我对它的驱动有了一点点心得,今天把它记录在 这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比 LCD1602要丰富得多,除了普通字符外,还可以显示点 阵图案,带有汉字库的还可以显示汉字,它的并行驱动 方式与LCD1602相差无几,所以,在这里花点时间是值 得的。 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线 K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示:

图1 再来一张它的背面的,如图2所示:

图2 它的16条引脚定义如下: 引脚号 符号 引脚说明 引脚号 符号 引脚说明 1 VSS

电源地 9 D2 数据端口 2 VDD 电源正极 10 D3 数据端口 3 VO 偏压信号 11 D4 数据端口 4 RS 命令/数据 12 D5 数据端口

RW 读/写 13 D6 数据端口 6 E 使能 14 D7 数据端口 7 D0 数据端口 15 A 背光正极 8 D1 数据端口 16

背光负极 对这个表的说明: 1. VSS接电源地。 2. VDD接+5V。 3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/RM063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。 5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。如果不需要进行读取操作,可以直接将其接VSS。 6. E,执行命令的使能引脚,接单片机的一个I/O。 7. D0—D7,并行数据输入/输出引脚,可接单

ht1621液晶显示驱动原理及程序

Ht1621液晶显示驱动使用说明 1.概述 HT1621是128点内存映象和多功能的LCD驱动器,HT1621的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示子系统。用于连接主控制器和 HT1621的管脚只有4或5条,HT1621还有一个节电命令用于降低系统功耗。 在虎风所做的这个系统中ht1621用于驱动一个静态的LCD液晶显示器。液晶显示的方式分为静态显示和动态显示。静态与动态的区别在于静态显示是持续供电的,而动态显示是利用人的视觉停留效果,快速扫描数码管各个段,让人在视觉上感觉到数码管是同时显示的。 2.HT1621接线原理图 3.静态LCD结构图

4.几个曾经纠结的概念 Time base:时基,即时间基准,可以用来输出,作为外部时钟的时间基准。 占空比:将所有公共电极(COM)各施加一次扫描电压的时间叫一帧,单位时间内扫描多少帧的频率叫帧频,将扫描公共电极(COM)选通的时间与帧周期之比叫占空比。通常占空比等于公共电极数N的倒数,即1/N。这就是说假如你要驱动4个液晶,就需要4个COM,那么你的占空比就要设定为1/4。 偏压比:指的是液晶的偏压系数,可以看看专业技术文章,偏压目的是克服交叉效应,通过把半选择点与非选择点的电压平均,适度提高非选择点的电压来抵消半选择点上的一部分电压,使半选择点上的电压下降,从而提高显示对比度;最终行半选择点和非选择点上的电压均为显示电压的1/a,1/a就称为偏压系数,也称为偏压。此方法称为1/a偏压的平均电压法,简称为1/a偏压法。 VLCD(LCD驱动电压): LCD的驱动电压为加在点亮部分的段电压与公共电压之差(峰-峰值)。 5.关于RAM地址映射的概念 为了这个问题困扰了很久,虎风太愚钝啦…… Ht1621有一个32*4的LCD驱动,映射到32*4的RAM地址。

linux的lcd驱动详细讲解

嵌入式驱动程序Day12 Top 1. LCD驱动设计开发 1 LCD驱动设计开发 1.1问题 通过led驱动开发掌握linux内核framebuffer 驱动开发通用方法。 1.2方案 一、帧缓冲(Framebuffer )。 帧缓冲(Framebuffer )是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功 能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户 可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer 设备驱动 来完成的。 Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池。CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处 理。应用程序也可以直接读写这个水池的内容。在应用程序中,一般通过将FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fbO 设备,并通过mmap系统调用进行地址映射。 FrameBuffer设备还提供了若干ioctl 命令,通过这些命令,可以获得显示设备的 一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。 二、FrameBuffer 在Linux中的实现和机制。 Framebuffer对应的源文件在linux/drivers/video/ 目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。 1. 分析Framebuffer设备驱动。 FrameBuffer设备驱动基于如下两个文件: (1) linux/include/linux/fb.h (2) linux/drivers/video/fbmem.c 2. 分析这两个文件。

lcd驱动原理

-------------------------------------------------------------------------------- TFT LCD液晶显示器的驱动原理(一) 谢崇凯 前两期针对液晶的特性与TFT LCD本身结构介绍了有关液晶显示器操作的基本原理。这次将针对TFT LCD的整体系统面,也就是对其驱动原理来做介绍,而其驱动原理仍然因为一些架构上差异的关系而有所不同。首先将介绍由于 Cs(storage capacitor)储存电容架构不同,所形成不同驱动系统架构的原理。 Cs(storage capacitor)储存电容的架构 一般最常见的储存电容架构有两种,分别是Cs on gate与Cs on common这两种。顾名思义,两者的主要差别在于储存电容是利用gate走线或是common 走线来完成。在上一期文章中曾提到,储存电容主要是为了让充好电的电压能保持到下一次更新画面的时候之用,所以必须像在CMOS的制程之中,利用不同层的走线来形成平行板电容。而在TFT LCD的制程中,则是利用显示电极与gate 走线或common走线所形成的平行板电容,来制作出储存电容Cs。 如果?不清楚,?看 https://www.360docs.net/doc/d5291602.html,/album/43/69/51466943/431163.jpg 图1就是这两种储存电容架构,图中可以很明显地知道,Cs on gate由于不必像Cs on common需要增加一条额外的common走线,所以其开口率(Aperture ratio)比较大。而开口率的大小是影响面板的亮度与设计的重要因素,所以现今面板的设计大多使用Cs on gate的方式。但是由于Cs on gate方式的储存电容是由下一条的gate走线与显示电极之间形成的(请见图2中Cs on gate与Cs on common的等效电路), 而gate走线就是接到每一个TFT的gate端的走线,主要是作为gate driver 送出信号来打开TFT,好让TFT对显示电极作充放电的动作。所以当下一条gate 走线送出电压要打开下一个TFT时,便会影响到储存电容上储存电压的大小。不过由于下一条gate走线打开到关闭的时间很短(以1024 x 768分辨率,60Hz更新频率的面板来说。一条gate走线打开的时间约为20μs,而显示画面更新的时间约为16ms,所以相较下影响有限),所以当下一条gate走线关闭,回复到原先的电压,则Cs储存电容的电压,也会随之恢复到正常。这也是为什么大多数的储存电容设计都是采用Cs on gate的方式的原因。

LCD显示与驱动原理

LCD 显示与驱动原理
冯光勇 2008.2.20 Roy_fpd@https://www.360docs.net/doc/d5291602.html,
目录
1 LCD的显示原理 2 LCD面板的结构与驱动 3 LCD驱动IC的结构与工作原理
1

1 LCD的显示原理
1.1液晶分子的电气和光学特性 1.2偏光片的工作原理 1.3LCD的光学结构与电路原理
1.1液晶分子的电气和光学特性
液晶就是液态晶体 液态和固态之间的中间态 液晶具有流动性和各向异性 Structure
C nH 2n+1
C
N
2

①光学各向异性 Δn=n ∥ -n⊥=ne-no ②介电各向异性 Δε=ε ∥ -ε⊥ Δε>0 分子沿电场方向排列 Δε<0 分子垂直电场方向排列 ③其他特性 相变温度(Tm、Tc)、液晶电阻率(ρ)、粘度 (η)等。


1.2偏光片的工作原理
1.2.1 偏极光
人类对光的了解依序可分成以下四个重要阶段: 1.十七世纪中,牛顿首先开始对光做有系统的研究,他发现到所谓的 白光(White Light)是由所有的色光(Colored Light)混合而成。为了要 解释这个现象,就有许多不同的理论衍生出来。 2.十九世纪初,杨氏(Thomas Young)利用波动理论成功的解释了大 部分的光学现象如反射、折射和绕射等。 3.1873年,马克斯威尔发现光波是电磁波,其中它的电波和磁波是 相依相存不能分开的,电场(E)、磁场(H)与电磁波进行的方向(k)这三 者是呈相互垂直的关系。 4.二十世纪初,爱因斯坦发现光的能量要用粒子学说才能解释,因而 衍生出量子学。换言之,光同时具有波动及粒子两种特性。 因为偏极光的理论是用波动学来解释的,所以往后的讨论都将光 视为电磁波,并且为了简化易懂,我们只考虑其电场向量E 。
图一
3

相关文档
最新文档