当前位置:文档之家› 如何使用普通IO口驱动LCD 单片机直接驱动 LCD 段码液晶 低成本 宁波北仑恒晶电子科技有限公司

如何使用普通IO口驱动LCD 单片机直接驱动 LCD 段码液晶 低成本 宁波北仑恒晶电子科技有限公司

如何使用普通I/O口驱动LCD一些特定环境,为了节省成本,又保证其性能。

在控制I/O口需求较少,但芯片本身的I/O口又较多的情况下,客户往往希望用普通I/O口驱动LCD显示,所以下面简单介绍一下,以供参考。

1、LCD简介:目前,市面主流LCD(液晶显示器)分成以下几大类:TN(扭曲阵列型)、STN(超扭曲阵列型)、DSTN(双层超扭曲阵列)、HPA(高性能定址或快速DSTN)、TFT(薄膜场效应晶体管)等。

由于成本因素,目前大多数采用的是TN型单色液晶显示器,它的原理是把液晶灌入两个列有细槽的平面之间。

这两个平面上的槽互相垂直(相交成90°),也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90°扭转的状态。

由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90°。

当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。

LCD正是由这样两个相互垂直的极化滤光器构成的,所以在正常情况下应该阻断所有试图穿透的光线。

但是,由于两个滤光器之间充满了扭曲液晶,所以在光线穿出第一个滤光器后,会被液晶分子扭转90°,最后从第二个滤光器中穿出。

另一方面,若为液晶加一个电压,分子又会重新排列并完全平行,使光线不再扭转,所以正好被第二个滤光器挡住。

总之,加电将光线阻断,不加电则使光线射出。

LCD模型可以把其看成一个电容器,一个电极连接着公共极板,另一个连接着字符段。

LCD受电压的均方根值控制,当施加在LCD上的电压为零时,LCD呈透明状态。

当施加在字符段与公共极的电压大于LCD的阀值电压,则该字符段就显示出来。

如果用直流驱动LCD,将会引起显示单元永久性的损坏。

为了防止不可逆转的电化学反应使LCD损坏,加在所有字符段上的电压必须周期性翻转极性,以使加在字符段上的平均电压为0。

2、I/O口直接驱动LCD的实现方法下面介绍多路复用显示驱动方法。

电路图如图a所示。

在多路复用显示驱动方法中,像素被分成选通像素、非选通像素和半选通像素。

它们都被加上了一定的电压,所以引出了平均电压法。

选通像素上的电压与非选通像素上的电压比就是常说的LCD偏压比。

在动态显示时,要使LCD的某个像素实现显示,就必须循环地在该像素上用公共级扫描脉冲(COM)和段扫描脉冲(SEG)合成一个超过液晶阀值电压的工作电压(及平均电压)才能完成。

说到底,平均电压法是把半选通像素上的电压和非选通像素的电压平均化,用适度提高非选择像素的电压来抵消半选择像素的一部分电压,从而扩大选择像素与半选择像素之间电压的差距,提高显示对比度,使非选择像素和半选择像素的显示更均匀。

图a根据单片机的特性,采用1/2偏压,1/2占空比方法驱动LCD,现以COM=2,SEG=4的LCD为例:LCD屏共有8个像素,公共极有2极,字符段为4段。

公共极信号产生的波形如图b所示。

从图b可看出,公共极信号发生可分成4个阶段S0、S1、S2和S3。

S0: COM0=5V , COM1=2.5V。

S1: COM0=2.5V , COM1=5V。

S2: COM0=0V , COM1=2.5V。

S3: COM0=2.5V , COM1=0V。

图b在S0阶段,选通的像素只可能是与COM0连接的像素,并且SEG段必须为0 V,该像素才会亮。

与COM1连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM1连接的像素都不会亮。

在S1阶段,选通的像素只可能是与COM1连接的像素,并且SEG段必须为0 V,该像素才会亮。

与COM0连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM0连接的像素都不会亮。

在S2阶段,选通的像素只可能是与COM0连接的像素,并且SEG段必须为+5 V,该像素才会亮。

同时,驱动LCD 的电压极性相反,与COM1连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM1连接的像素都不会亮。

在S3阶段,选通的像素只可能是与COM1连接的像素,并且SEG段必须为+5 V,该像素才会亮。

同时,驱动LCD 的电压极性相反,与COM0连接的像素只可能是非选通像素或半选通像素,而半选通像素电压低于LCD要点亮的阀值电压,所以此时与COM0连接的像素都不会亮。

3、应用说明I/O口电平的设置方法:对COM口,输出高=>输入FLOATING=>输出低,这样就得到Vdd、1/2Vdd、0Vdd 三种电压。

在LCD点亮时,对应的液晶段COM和SEG加±Vdd,LCD段就亮;加0Vdd或1/2Vdd时LCD灭。

显示时对液晶段先加+Vdd,再加-Vdd的原理可以延长LCD的使用寿命。

如果LCD玻璃是3V,则Vdd=3V; 如果LCD玻璃是5V的,则Vdd=5V。

LCD七段码对应表如表1:表14、范例程式;;========================================================= ;文件名:普通IO口驱动LCD显示.asm;母体:AM8EB056;工作频率:4MHz 2Clock;作者:Sunny;版本:1.0.0;日期:2007.02.13;备注:原理图及LCD七段码对应表分别为图a及表1;修改记录:;;=========================================================;;========================================================= ;头文件引用区;;=========================================================;;========================================================= ;特殊寄存器定义区;;========================================================= TCC EQU 0X01PCL EQU 0X02 ; 低位程序指针STATUS EQU 0X03PA EQU 0X05 ; PA口寄存器PB EQU 0x06 ; PB口寄存器FE EQU 0X0EFF EQU 0X0FRF EQU 0X0F;;========================================================= ;用户RAM定区;;========================================================= A_BUFFER EQU 0X10ST_BUFFER EQU 0X11PA_RAM EQU 0X12PB_RAM0 EQU 0X13PB_RAM1 EQU 0X14R_DIS EQU 0X15 ;字型表地址指针R_1S EQU 0X16 ;1S计时SCANTIME EQU 0X17TEMP EQU 0X18;;========================================================= ;常量定义区;;========================================================= D_1S EQU 244BITS; STATUSC EQU 0Z EQU 2;;=========================================================;用户程序区;;========================================================= ORG 0X00LGOTO STARTORG 0X08LGOTO INTERRUPT ;中断入口地址;;=========================================================;;中断服务程序: Timer0,4.1ms中断一次;;========================================================= INTERRUPT:MOVAR A_BUFFERSWAPR A_BUFFER,1SWAPR STATUS,0MOVAR ST_BUFFERT0_INTERRUPT:BTRSS RF,0LGOTO INTERRUPT_EXITINCR R_1S,1MOVIA D_1S ;1S定时SUBAR R_1S,0BTRSS STATUS,CLGOTO TX_DISCLRR R_1SLCALL REFRESH_DATA ;将'0~9'循环送显示TX_DIS:LCALL DISPLAY ;加在字符段上的电压周期性翻转极性的显示INTERRUPT_EXIT:CLRR RFSWAPR ST_BUFFER,0MOVAR STATUSSWAPR A_BUFFER,0RETIESEG7_TBL: ;字型表,依次存放字型码ADDAR PCL,1RETIA 0X3F ;字型 0RETIA 0X06 ;字型 1RETIA 0X5B ;字型 2RETIA 0X4F ;字型 3RETIA 0X66 ;字型 4RETIA 0X6D ;字型 5RETIA 0X7D ;字型 6RETIA 0X07 ;字型 7RETIA 0X7F ;字型 8RETIA 0X6F ;字型 9START:DISIMOVIA 0X73 ;PA.0,PA.1输入口IOST PAMOVIA 0X00 ;PB输出口IOST PBMOVIA 0X20IOST FECLRR RFMOVIA 0X04 ;TCC RATE 1:32T0MODECLRR TCCCLRR A_BUFFERCLRR ST_BUFFERCLRR R_DISCLRR R_1SCLRR TEMPCLRR SCANTIMECLRR PA_RAMMOVIA 0X0F ;初始化送字符'00'MOVAR PB_RAM0MOVIA 0X03MOVAR PB_RAM1MOVIA 0X01 ;使能TCC和INT中断IOST FFENI ;使能总中断MAIN:NOPNOPLGOTO MAIN;;=========================================================;函数名称:DISPLAY;函数功能:加在字符段上的电压周期性翻转极性的显示;输入参数:;输出参数:;备注:;;========================================================= DISPLAY:MOVR SCANTIME,0XORIA 0X01BTRSS STATUS,ZLGOTO DISPLAY1MOVIA 0XFE ;PA0作输出口,PA1输入FLOATINGIOST PANOPMOVR PA_RAM,0XORIA 0X01ANDIA 0X01BCR PA_RAM,0 ;PA0口状态同上一次相反BTRSS STATUS,ZBSR PA_RAM,0MOVR PA_RAM,0MOVAR PABTRSS PA_RAM,0LGOTO $+5MOVR PB_RAM0,0 ;如果PA.0为高,字段(高)取反送显示输出XORIA 0X0FMOVAR PBRETMOVR PB_RAM0,0 ;如果PA.0为低,字段(高)直接送显示输出MOVAR PBRETDISPLAY1:MOVIA 0XFD ;PA1作输出口,PA0输入FLOATINGIOST PANOPMOVR PA_RAM,0XORIA 0X02ANDIA 0X02BCR PA_RAM,1 ;PA1口状态同上一次相反BTRSS STATUS,ZBSR PA_RAM,1MOVR PA_RAM,0MOVAR PABTRSS PA_RAM,1LGOTO $+5MOVR PB_RAM1,0 ;如果PA.1为高,字段(高)取反送显示输出XORIA 0X0FMOVAR PBRETMOVR PB_RAM1,0 ;如果PA.1为低,字段(高)直接送显示输出MOVAR PBRET;;=========================================================;函数名称:REFRESH_DATA;函数功能:每隔1S 调用该函数将'0~9'循环显示;输入参数:R_DIS =字型表地址指针;输出参数:PB_RAM0,PB_RAM1字型表返回值;备注:;;========================================================= REFRESH_DATA: ;每隔1S '0~9'循环显示INCR R_DIS,1MOVR R_DIS,0SUBIA 9BTRSC STATUS,CLGOTO INDEX_DISCLRR R_DISINDEX_DIS:MOVR R_DIS,0LCALL SEG7_TBLMOVAR TEMPANDIA 0X0FMOVAR PB_RAM0SWAPR TEMP,0ANDIA 0X0F MOVAR PB_RAM1 RETEND。

相关主题