段式液晶驱动.docx
- 文档编号:3974062
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:18
- 大小:279.15KB
段式液晶驱动.docx
《段式液晶驱动.docx》由会员分享,可在线阅读,更多相关《段式液晶驱动.docx(18页珍藏版)》请在冰豆网上搜索。
段式液晶驱动
【1021-2】用SH79F32驱动静态段式液晶显示器
1.引言
如今,液晶显示器在各种产品中得到了极其广泛的应用,其身影已遍及各行各业以及社会生活的各个角落。
其中,段式液晶更是工控产品和部分小家电或消费类产品开发中经常用到的器件。
随着技术的进步,各种驱动芯片的出现和发展也使液晶的使用变得轻松、快捷,而且越来越多的IC厂商顺应市场的需求和趋势,将驱动集成到各种单片机中,更加简化了开发人员的设计工作。
本文将试着探讨如何应用SH79F32集成的LCD驱动器,驱动各种段式液晶显示器,使其适应尽可能多的应用场合,并以静态驱动型的段式液晶EDS815为例,演示如何使用其液晶驱动功能。
作此拙文,不当之处,还望各位批评指正。
2.SH79F32的液晶驱动特性
SH79F32的LCD驱动器包含一个控制器,一个电压发生器,一个占空比发生器,及4/5/6个COM驱动管脚和32/31/30个SEG驱动管脚。
驱动器可编程为三种驱动模式:
1/4占空比和1/3偏置电压(4×32),1/5占空比和1/3偏置电压(5×31),1/6占空比和1/3偏置电压(6×30)。
另外,它还提供两种工作模式:
电容型和SLP型(即低功耗模式)。
SH79F32内建一个稳压源可以给LCD供电,如果单片机的电源超过3.2V,内部稳压源会产生稳定电压2.9V给驱动器提供电源;如果电源电压低于3.2V,内部稳压源输出低于2.9V,一般的3V液晶将不能显示在最佳状态(一些低压型的液晶除外)。
根据技术规格书的描述,当电源VDD=3.6V~5.5V时,应该在代码选项中打开LCD稳压源,同时VP3引脚要接一个电容(47μF)到电源地;当3.0V (注: 芯片手册第8.14部分的表格第4行第2列指出,代码选项的OP_LVREN/OP_LVRLE为1/0时,当VDD>3.6V时为开,此时LCD驱动电压是2.9V,VDD<3.6V时为关,此时LCD驱动电压是VDD,似乎是说当如此设置时,LCD电源会根据实际电压自动进行切换,如果是这样,那么这个选项配置还分出那四种情况就没有意义了,因为能自动切换了还需要烧写配置吗,但如果不是这样,那么明明最后一列注着应用场合“VDD<3.6V”了,这里第二列这么写是什么意思呢? 这其中的含义,我始终没想通。 另外,8.1.3的上面那副示意图的右侧注释似乎有误,个人以为应该是“VDD=3.6V-5.0Vapplication”。 ) 在应用中,一般地,电源系统要么是5V左右,要么就是3.3V左右,而且上下变动范围均在1V以内,变化范围跨越3.0V~5.5V的不多见,即使有(比如串联电池),也往往会对单片机的电源进行固定值稳压以降低功耗及提高准确度、稳定性。 5V的情况可以选择打开稳压源,3.3V(即3.2V~3.6V之间)似乎有些难以选择,如果打开,当电压小于3.2V时,显示效果可能不理想,如果不打开,当电压大于3.2V时又可能对液晶物理本身不利。 具体问题还得具体分析,假设最高电压可能达到甚至超过3.6V(比如充满电的锂电池)且不对单片机电源进行稳压,另外,液晶厂家认为这个电压对液晶性能及寿命有影响(有时候虽不会损坏,但可能会出现鬼影),那么为了保护LCD就必须降压,也就需要打开稳压源;如果液晶完全可以承受3.6V且不出现鬼影(根据个人以往使用经验,普通3V字段液晶基本会出现重影),那么可以关闭稳压源,这样基本就能保证液晶在整个工作范围内正常显示;如果单片机电源电压被稳在3.3V左右,也就是说最高3.3V左右,那么要是打开稳压后LCD在整个工作电压范围内显示效果不佳,可以考虑关闭稳压源而直接用VDD作为LCD的电压源(目标板其实就是这么使用的),或者不关闭并尝试向液晶制造厂商定制工作点低一些的液晶片。 顺便提一下,Keil的下载程序选项中选择JET51的电压与LCD稳压器的打开选择没有必然的关系,它只是LCD稳压器配置的一个应用实例,莫将3.3V/5V作为用户自己的应用系统打开LCD稳压源与否的判定条件。 LCDDriver提供了两种工作模式,除了普通电容型工作模式,还有一种低功耗工作模式SLP。 实际上,所谓SLP模式,也是电容型的,只是它比电容型普通工作模式省电,但这样的描述多少让人乍一看以为是有别于电容型的另一种模式。 (只支持电容型,也是一个美中不足。 )由于是电容型,使用LCD功能时VP1引脚和VP2引脚必须连接0.1μF的电容,CUP1引脚和CUP2引脚也必须用0.1μF相连。 此外,不论是否打开LCD的电压泵,这两只电容是否都必须接,或者这两只电容的具体作用,技术规格书中未作阐述,稳妥起见,对于低压工作的系统,还是打开为宜。 其他参数及用法可参阅技术规格书以及其他应用文档的描述,详见参考资料。 3.EDS815数码液晶显示器 EDS815是四位8数码段式液晶显示器,静态驱动,驱动电压3.0V~5.0V,视角6: 00。 其外形图及真值表如下: 下载(41.28KB) EDS815 2009-12-1714: 14 该液晶只有一个COM端,引脚1和40实际是短接在一起的,其他所有的字段都单独连出引脚。 在仪表中,这是一款比较常用的液晶屏。 它的驱动可以用单片机的I/O口辅以若干门电路形成的脉冲信号来实现,比如CD4055,具体方法非本文重点,此处略。 4.SH79F32驱动EDS815的可行性 一般地,段型液晶的驱动有两种方式: 动态驱动和静态驱动。 所谓动态驱动显示,就是像素电极排布呈矩阵或变形矩阵方式,需用时间分割扫描方式驱动;所谓静态驱动显示,就是每个像素均有单独的引出电极,驱动期间要持续施加电压。 我们都知道,不论哪种驱动方式,都必须遵守的原则是: 施加给液晶的应该是交流电场,并要求在这个交流电场中的直流分量越小越好,因为直流电场将导致液晶材料的化学反应和电极老化,从而迅速降低液晶材料的寿命。 SH79F32支持4×32、5×31、6×30三种形式液晶驱动,且为1/3偏压,这三种其实就是动态驱动方式。 如果我们定制的液晶是4、5或6个COM端,而且SEG数目在32、31、30以内,可以方便地直接用SH79F32进行驱动。 (如果能支持1/2偏压,产品适用范围会更广。 )但如果COM端只有3个,或者2个,抑或像上面提到的EDS815那样只有一个呢? 不烦从EDS815入手看看能否解决。 前面已经说明,原则上,只要施加在像素上的电场是交流的且直流分量尽可能小,就能正常点亮液晶。 从每个单独的背电极(即某个COM端)来说,动态扫描时,与各个段脚形成的驱动信号也必须严格服从这个原则。 那么,如果不考虑与其他背电极的分时扫描,该背电极也可以看作是间歇的脉冲静态驱动,因此,该COM端的平均电压也应该接近零,所以也应当能用于驱动静态液晶,可能需要适当调整扫描的频率。 [本帖最后由banian于2009-12-1714: 27编辑] 收藏分享 banian ∙发短消息 ∙加为好友 banian当前离线 UID 579 帖子 12 精华 0 积分 77 阅读权限 20 在线时间 3小时 注册时间 2009-9-10 最后登录 2010-3-29 注册会员 UID 579 帖子 12 技术 27 金钱 42 阅读权限 20 2# 发表于2009-12-1714: 20|只看该作者 【续】 我们可以用驱动波形图来论证此设想,由于中颖的资料中没有正常模式下的LCD驱动输出波形示意图,只好从合泰的资料中截取一副插图来说明。 (从示波器获取图形比较麻烦,实际波形与图示基本吻合,而且图示比实际波形好看。 ) 下载(36.56KB) 液晶波形 2009-12-1714: 20 如上图示,以红线所示的一个周期区间为例,假设VSS为电压0,VC为电压1,VB为电压2,VA为电压3,计算段脚与公共端之间的平均电压,显然,最终平均电压为0。 所以,符合交流驱动的要求。 那么,只要根据实际显示情况,调整驱动脉冲频率(LCD时钟参数),就能得到满意的效果。 对于SLP模式,照此推理,也应当可行,同时还能调整PLCON参数来实现对比度调节。 5.在SH79F32目标板上实验EDS815的软、硬件设计 为了验证上面的设想,利用JET51、SH79F32目标板、EDS815液晶片来搭建试验平台。 液晶引脚与单片机之间的具体接线如下图,其他部分直接利用目标板,电路图中略去。 系统时钟使用32.768kHz晶振,JET51电源选项为5V。 为调试方便,随便取了P2.4驱动一只绿光LED作为状态指示。 看门狗及OVL暂不考虑。 下载(137.92KB) 接线图 2009-12-1714: 20 程序很简单,目的就是将LCD全屏点亮,流程图略去。 首先初始化I/O口,将相应引脚配置成SEG、COM功能,接着初始化LCD相关寄存器,最后打开点亮LCD,延时一定时间后再熄灭LCD(显示空白,而非关闭LCD),再延时一定时间后再让LCD全屏显示,依此循环往复。 因为JTAG口占用了SEG3~SEG6,所以用JET51调试时,有3个笔段和1个小数点没有显示出来。 低功耗模式、对比度调节、LCD时钟频率调节等对显示的影响非本文重点,此处就不做实验比较了。 另外,用下载程序的方式运行程序(可以参考我的第一篇体会的说明: 【1021-1】JET51及SH79F32目标板用后感)的效果跟用调试模式运行程序的效果有差异,前者显示有些模糊,不知道是否跟电源有关系,因手边没有合适的外接电源,此现象还有待查证,但个人认为应该没问题。 实物照片(调试模式运行程序)如下: 下载(851.08KB) 实物照片1 2009-12-1714: 20 下载(716.84KB) 实物照片2 2009-12-1714: 20 程序分两个版本,我首先用汇编的,因为汇编不容易错,之后又写了个C语言的,均编译、调试及下载运行通过。 因为程序量小,未考虑程序的优化,只为实现目的而已,仅供需要的朋友参考。 C版本程序如下: #include #include voiddelay(unsignedint); voidInit_LCD(void); voidInit_IO(void); voidInitialCpu(void); voidLCD_Offon(unsignedchari); unsignedcharxdataSEG[32]_at_0x1E0; voidmain(void) { delay(817); RSTSTAT=0x00; //Bin(00000000); CLKCON=0x80; delay(100); InitialCpu(); delay(1640); while (1) { RSTSTAT=0x00; //Bin(00000000) P2_4=1; LCD_Offon(0); delay(1640); P2_4=0; LCD_Offon (1); delay(2640); } } /*----------------------------------------------------- voiddelay(unsignedintn) 功能说明: 延时子程序 其他说明: delay20*(n)*Tsys 输入: n-0~65535 输出: 无 -----------------------------------------------------*/ voiddelay(unsignedintn) { unsignedinttemp; for(temp=n;temp>0;temp--) {RSTSTAT=0x00; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } /*----------------------------------------------------- voidInit_IO(void) 功能说明: 初始化IO子程序 其他说明: 输入: 无 输出: 无 -----------------------------------------------------*/ voidInit_IO(void) { // P0 P1 P2 P3 P4 //bit7 (SEG32) (SEG24) UN UN (COM4) //bit6 (SEG31) (SEG23) UN UN (COM3) //bit5 (SEG30) (SEG22) UN UN (COM2) //bit4 (SEG29) (SEG21) LED UN (COM1) //bit3 (SEG28) (SEG20) UN UN (CUP1) //bit2 (SEG27) (SEG19) UN UN (CUP2) //bit1 (SEG26) (SEG18) UN UN (VP1) //bit0 (SEG25) (SEG17) UN UN (VP2) P0SS=0xff; //Bin(11111111),P0sharedasseg25~29 P1SS=0xff; //Bin(11111111),P1sharedasseg17~24 P0CR=0xff; //Bin(11111111),输出,用于LCDSEG P0PCR=0x00; //Bin(00000000),上拉电阻关闭 P0=0x00; //Bin(00000000) P1CR=0xff; //Bin(11111111),输出,用于LCDSEG P1PCR=0x00; //Bin(00000000),上拉电阻关闭 P1=0x00; //Bin(00000000) P2CR=0xff; //Bin(11111111),P2.4输出,辅助状态灯 P2PCR=0x00; //Bin(00000000) P2=0x00; //Bin(00000000) P3CR=0xff; //Bin(11111111),无用 P3PCR=0x00; //Bin(00000000) P3=0x00; //Bin(00000000) P4CR=0xff; //Bin(11111111),输出 P4PCR=0x00; //Bin(00000000) P4=0x00; //Bin(00000000) } /*----------------------------------------------------- voidInit_LCD(void) 功能说明: 初始化LCD子程序 其他说明: 输入: 无 输出: 无 -----------------------------------------------------*/ voidInit_LCD(void) { unsignedchari; /*-----------------使能LCD模块-----------------*/ LCDCON=0x20; //Bin(00100000),P4共享为VP2~1、CUP2~1和COM1~4,占空比为1/4,PUMP=LCDCLK/4 PLCON=0x00; //Bin(00000000); LCDCLK=0x00; //Bin(00000000); PLCON=0x0f; //Bin(00001111),设置PLD LCDCON|=0x10; //Bin(00010000),开启LCDPUMP delay(1000); //延时 LCDCON|=0x80; //Bin(10000000),使能LCD模块 /*---------------显示内容初始化----------------*/ for(i=0;i<32;i++) //LCD全部显示 { SEG=0x0f; //Bin(00001111); } } /*-----------------------------------------------------voidLCD_Offon(unsignedchari) 功能说明: 点亮或熄灭LCD子程序 其他说明: 输入: 1-点亮,0-熄灭 输出: 无 -----------------------------------------------------*/ voidLCD_Offon(unsignedchari) { unsignedchart; t=i; if(t==0) for(i=0;i<32;i++) //LCD全部不显示 { SEG=0x00; //Bin(00000000) } if(t==1) for(i=0;i<32;i++) //LCD全部显示 { SEG=0x01; //Bin(00001111) } } /**************************************************************************** voidInitialCpu(void) 功能说明: 系统初始化程序 其他说明: 输入: 无 输出: 无 *****************************************************************************/ voidInitialCpu(void) { EA=0; //关闭全中断 PSW=0; //clearPSW Init_IO(); Init_LCD(); // EA=1; //开启全中断 } 汇编程序如下,小程序还是建议初学的朋友用汇编,有益无害: ORG 000H AJMP MAIN ORG 0003H RETI ORG 0090H MAIN: MOV0B2H,#80H MOV0E3H,#10H MOV0F8H,#00H;spsta MOV95H,#00H;adch mov0adh,#0ffh;p1ss mov0aeh,#0ffh;p0ss mov0e1h,#0ffh;p0cr mov0e2h,#0ffh;p1cr mov0e3h,#0ffh;p2cr mov0e9h,#00h;p0pcr mov0eah,#00h;p1pcr mov0ebh,#00h;p2pcr mov0f7h,#01h;xpage movr0,#0dfh;0x1e0 movr6,#20h;D32 inlop: incr0 mova,#0fh movx@r0,a djnzr6,inlop mov0f7h,#0h mov0abh,#20h;lcdcon mov0ach,#00h;lcdclk mov0afh,#0fh;plcon orl0abh,#10h;pumpon MOVR2,#03H;130D LP1: MOVR4,#64H;255D LP2: DJNZR4,LP2 DJNZR2,LP1 orl0abh,#80h MAINLOP: MOVR2,#43H;130D LEDLP1: MOVR4,#64H;255D LEDLP2: DJNZR4,LEDLP2 DJNZR2,LEDLP1 CLRP2^4 acalllcdon MOVR2,#43H LEDLP3: MOVR4,#64H LEDLP4: DJNZR4,LEDLP4 DJNZR2,LEDLP3 SETBP2^4 acalllcdoff AJMPMAINLOP lcdon: mov0f7h,#01h;xpage movr0,#0dfh;0x1e0 movr6,#20h;D32 inlop1: incr0 mova,#0fh movx@r0,a djnzr6,inlop1 mov0f7h,#0h ret lcdoff: mov0f7h,#01h;xpage movr0,#0dfh;0x1e0 movr6,#20h;D32 inlop2: incr0 mova,#01h movx@r0,a djnzr6,inlop2 mov0f7h,#0h ret END [本帖最后由banian于2009-12-1715: 13编辑] TOP banian ∙发短消息 ∙加为好友 banian当前离线 UID 579 帖子 12 精华 0 积分 77 阅读权限 20 在线时间 3小时 注册时间 2009-9-10 最后登录 2010-3-29 注册会员 UID 579 帖子 12 技术 27 金钱 42
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 段式 液晶 驱动