液晶显示 技术 wateryear
提纲 一.硬件基础部分 二. 应用编程基础 三.程序示例: 1.液晶显示屏(LCD) 1.1 主要用途: 1.2 分类: 1.3 灰度: 2.1 驱动与显示 2.2 数据格式 2.3 部分重要接口: 三.程序示例:
一.硬件基础部分
1.液晶显示屏(LCD) 1.1 主要用途: 液晶屏(LCD:Liquid Crystal Display)主要用于显示文本及图形信息。液晶显示屏具有轻薄、体积小、低耗电量、无辐射危险、平面直角显示以及影像稳定不闪烁等特点,因此在许多电子应用系统中,常使用液晶屏作为人机界面。
1.2 分类: 1.2.1 液晶显示屏按显示原理分为STN 和TFT 两种: STN(Super Twisted Nematic,超扭曲向列)液晶屏 STN 液晶显示器中,使用X、Y 轴交叉的单纯电极驱动方式,即X、Y 轴由垂直与水平方向的驱动电极构成,水平方向驱动电压控制显示部分为亮或暗,垂直方向的电极则负责驱动液晶分子的显示。STN 液晶显示屏加上彩色滤光片,并将单色显示矩阵中的每一像素分成三个子像素,分别通过彩色滤光片显示红、绿、蓝三原色,也可以显示出色彩。单色液晶屏及灰度液晶屏都是STN 液晶屏。
不加电 加电 不加电 加电 组织结构 不加电 加电
TFT(Thin Film Transistor,薄膜晶体管)彩色液晶屏 随着液晶显示技术的不断发展和进步, TFT 液晶显示屏被广泛用于制作成电脑中的液晶显示设备。 TFT 液晶显示屏既可在笔记本电脑上应用(现在大多数笔记本电脑都使用TFT 显示屏),也常用于主流台式显示器
1.2.2 液晶显示屏按显示色彩分为单色和彩色 单色
彩色
1.3 灰度: 大家知道,液晶的显示效果,是由加在液晶上的有效电压决定的。 灰度(彩色)的实现有两种方式,即PWM(脉宽调制)和FRC(帧率控制)。 PWM是在一次扫描时间内分成若干个时间片,如16级灰度,就分成16个时间片,如果显示5/16灰度,那么只有5/16的时间内是有驱动电压的(对同一个点而言),最后的等效电压就只有全黑的5/16了; FRC跟PWM类似,只是每个时间片变成了一帧,如显示16级灰度,那么就要用16帧,显示5/16的灰度,在16帧里只有5帧有驱动电压(对同一个点而言),最后的等效电压就只有全黑的5/16了。 至于彩色,跟灰度是一样的,只是三基色的调配而已,如3-3-2方式的256色,只是RGB三个颜色的灰度分别是8,8,4而已
大家知道,现代显示器件的显示方式,基本上都是采用动态扫描的方法实现整幅画面的显示。 比如电视机的显像管(CRT,阴极射线管),通过帧同步信号和行同步信号的控制,电子枪的电子束逐行逐点的扫描,将电子打在荧光点上,使之发光,通过视觉暂留的作用,我们看到的就是一副完整的画面。
LCD与CRT类似,也是动态的扫描。但CRT是模拟方式的,通过电路控制,电子束可以任意移动,而LCD是数字方式的,只有位置固定的电流通路,所以只能通过电路矩阵逐行扫描,而不能到逐点,即一行上所有的点同时工作。
二. 应用编程基础
2.1 驱动与显示 液晶屏的显示要求设计专门的驱动与显示控制电路。驱动电路包括提供液晶屏的驱动电源和液晶分子偏置电压,以及液晶显示屏的驱动逻辑;显示控制部分可由专门的硬件电路组成,也可以采用集成电路(IC)模块,比如EPSON 的视频驱动器等;还可以使用处理器外围LCD 控制模块。实验板的驱动与显示系统包括S3C2410X 片内外设LCD 控制器、液晶显示屏的驱动逻辑以及外围驱动电路。
驱动模块内部结构
Buffer组成结构
2.2 数据格式 需要与硬件工程师配合的是他采用了哪种接线方法,24位(RGB888)16(RGB565)位 8(单色)或其它。
2.3 部分重要接口: LDD[0~7]:7位数据线。 L_PCLK:点时钟(Pixel clock),用于把每一点的数据送入移位寄存器; L_LCLK:行时钟(Line clock),用于指示一行数据由移位寄存器到显示驱动芯片传输完毕,并使得行指针加1。在16位TFT方式下,就是水平同步信号; L_FCLK:帧时钟(Frame clock),用于指示一帧图像的开始,同时把行指针置于显示屏的第一行。在16位TFT方式下,就是垂直同步信号;
三.程序示例
本程序是一个简单的实现驱动320*240LCD的应用程序,希望能起到抛砖引玉的效果。
SED1335驱动320*240LCD /*========================================= SED1335驱动320x240图形液晶驱动演示程序 接口情况表述: No: LCM ----- 52 --------------------- 1...VSS..... GND 地线 2...VDD..... +5V(VCC) 电源 3...VO ..... -Vadj Input 对比度负压调整输入 4...A0 ..... P2.0 寄存器选择信号,命令数据方式选择 5.../WR..... WR 写有效 6.../RD..... RD 读有效
7...D0 ..... P0.0 数据总线 D0 8...D1 ..... P0.1 数据总线 D1 9...D2 ..... P0.2 数据总线 D2 10..D3 ..... P0.3 数据总线 D3 11..D4 ..... P0.4 数据总线 D4 12..D5 ..... P0.5 数据总线 D5 13..D6 ..... P0.6 数据总线 D6 14..D7 ..... P0.7 数据总线 D7 15../CS .... GND 片选通信号,低电平有效.实际使用应编入地址 16../RES.... /RESET 复位信号,低电平有效,阻容式复位电路 17..VEE..... -Vout 逆变-22.5V 负电压输出 18..VSS..... GND 地线 0V ============================================= 320x240液晶模块配用sed1335驱动接口板,sed1335驱动接口板上配用32K ram ============================================*/
#include <ABSACC. H> #include <AT89X55. H> //. SED1335参数设置 #include <ABSACC.H> #include <AT89X55.H> //*************SED1335参数设置*****************// #define system_set 0x40 //SED1335指令 #define sleep_in 0x53 #define disp_on 0x59 #define disp_off 0x58 #define scroll 0x44 #define scrform 0x5d #define cgram_adr 0x5c #define csrdir_right 0x4c #define csrdir_left 0x4d #define csrdir_up 0x4e #define csrdir_down 0x4f #define hdot_scr 0x5a #define ovlay 0x5b #define csrw 0x46 #define csrr 0x47 #define mwrite 0x42 #define mread 0x43
//#define DWR XBYTE [0x0400] //#define CWR XBYTE [0x0A00] / //#define DWR XBYTE [0x0400] //#define CWR XBYTE [0x0A00] /*-- 文字: 常 --* /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ unsigned int code chang[] = {0x04,0x18,0x10,0x90,0x77,0x55,0x15,0xF5, 0x15,0x15,0x37,0xD0,0x54,0x18,0x10,0x00, 0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xFF, 0x40,0x40,0x48,0x44,0x78,0x00,0x00,0x00}; unsigned char code system_set_code[8] // ={0x30,0x87,0x07,39,60,239,40,0}; ={0x30,0x87,0x07,39,66,240,48,0}; unsigned char code scroll_set_code[10] ={0x0,0x0,240,0x80,0x25,240,0x00,0x4B,0x80,0x70}; code scrform_ini[2]={0x07,0x86}; code hdot_scr_ini[1]={0x00}; code ovlay_ini[1]={0x00}; code disp_on_ini[1]={0x16}; code disp_off_ini[1]={0x00}; code cur_set_ini1[2]={0x00,0x00}; code null[1]={0x00}; code kill[]={0x63}; sbit SED1335_A0=P2^0; sbit SED1335_WR=P2^1; sbit SED1335_RD=P2^2; sbit CS=P2^4; sbit SEL1=P2^3;
void main(void) { init_sed1335(); display_sed1335(); }
//****************初始化SED1335******************// init_sed1335() { SEL1=0;CS=0; sed1335_write(disp_off,disp_off_ini,1); sed1335_write(system_set,system_set_code,8); sed1335_write(scroll,scroll_set_code,10); sed1335_write(scrform,scrform_ini,2); sed1335_write(hdot_scr,hdot_scr_ini,1); sed1335_write(ovlay,ovlay_ini,1); sed1335_write(csrw,cur_set_ini1,2); sed1335_write(csrdir_right,null,1); clr_scr(); sed1335_write(disp_on,disp_on_ini,1); }
void sed1335_write(unsigned int commandcode,unsigned int void sed1335_write(unsigned int commandcode,unsigned int *parameter,unsigned int n) { unsigned i=0; SED1335_A0=1;SED1335_WR=0;SED1335_RD=1; P0=commandcode; SED1335_A0=0;SED1335_WR=0;SED1335_RD=1; for(i=0;i<n;i++) { P0=parameter[i]; } }
void clr_scr() { int i=0; sed1335_write(csrdir_right,null,1); sed1335_write(csrw,cur_set_ini1,2); SED1335_A0=1;SED1335_WR=0;SED1335_RD=1; P0=mwrite; SED1335_A0=0;SED1335_WR=0;SED1335_RD=1; for(i=0;i<32000;i++) { P0=0x00; } sed1335_write(csrw,cur_set_ini1,2); }
display_sed1335() { int i=0; SED1335_A0=0; SED1335_WR=0; SED1335_RD=1; SEL1=0; CS=0; for(i=0;i<32;i++) { P0=chang[i]; } }
THANKS