段式液晶驱动Word文件下载.docx
《段式液晶驱动Word文件下载.docx》由会员分享,可在线阅读,更多相关《段式液晶驱动Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
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
注册会员
技术
27
金钱
42
2#
发表于2009-12-1714:
20|只看该作者
【续】
我们可以用驱动波形图来论证此设想,由于中颖的资料中没有正常模式下的LCD驱动输出波形示意图,只好从合泰的资料中截取一副插图来说明。
(从示波器获取图形比较麻烦,实际波形与图示基本吻合,而且图示比实际波形好看。
下载(36.56KB)
液晶波形
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)
接线图
程序很简单,目的就是将LCD全屏点亮,流程图略去。
首先初始化I/O口,将相应引脚配置成SEG、COM功能,接着初始化LCD相关寄存器,最后打开点亮LCD,延时一定时间后再熄灭LCD(显示空白,而非关闭LCD),再延时一定时间后再让LCD全屏显示,依此循环往复。
因为JTAG口占用了SEG3~SEG6,所以用JET51调试时,有3个笔段和1个小数点没有显示出来。
低功耗模式、对比度调节、LCD时钟频率调节等对显示的影响非本文重点,此处就不做实验比较了。
另外,用下载程序的方式运行程序(可以参考我的第一篇体会的说明:
【1021-1】JET51及SH79F32目标板用后感)的效果跟用调试模式运行程序的效果有差异,前者显示有些模糊,不知道是否跟电源有关系,因手边没有合适的外接电源,此现象还有待查证,但个人认为应该没问题。
实物照片(调试模式运行程序)如下:
下载(851.08KB)
实物照片1
下载(716.84KB)
实物照片2
程序分两个版本,我首先用汇编的,因为汇编不容易错,之后又写了个C语言的,均编译、调试及下载运行通过。
因为程序量小,未考虑程序的优化,只为实现目的而已,仅供需要的朋友参考。
C版本程序如下:
#include<
CPU32.h>
intrins.h>
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
输出:
无
-----------------------------------------------------*/
unsignedinttemp;
for(temp=n;
temp>
0;
temp--)
{RSTSTAT=0x00;
_nop_();
_nop_();
voidInit_IO(void)
初始化IO子程序
//
P0
P1
P2
P3
P4
//bit7
(SEG32)
(SEG24)
UN
(COM4)
//bit6
(SEG31)
(SEG23)
(COM3)
//bit5
(SEG30)
(SEG22)
(COM2)
//bit4
(SEG29)
(SEG21)
LED
UN
(COM1)
//bit3
(SEG28)
(SEG20)
(CUP1)
//bit2
(SEG27)
(SEG19)
(CUP2)
//bit1
(SEG26)
(SEG18)
(VP1)
//bit0
(SEG25)
(SEG17)
(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;
P1PCR=0x00;
P1=0x00;
P2CR=0xff;
//Bin(11111111),P2.4输出,辅助状态灯
P2PCR=0x00;
P2=0x00;
P3CR=0xff;
//Bin(11111111),无用
P3PCR=0x00;
P3=0x00;
P4CR=0xff;
//Bin(11111111),输出
P4PCR=0x00;
P4=0x00;
voidInit_LCD(void)
初始化LCD子程序
unsignedchari;
/*-----------------使能LCD模块-----------------*/
LCDCON=0x20;
//Bin(00100000),P4共享为VP2~1、CUP2~1和COM1~4,占空比为1/4,PUMP=LCDCLK/4
PLCON=0x00;
//Bin(00000000);
LCDCLK=0x00;
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;
//LCD全部不显示
SEG=0x00;
if(t==1)
SEG=0x01;
//Bin(00001111)
/****************************************************************************
voidInitialCpu(void)
系统初始化程序
*****************************************************************************/
EA=0;
//关闭全中断
PSW=0;
//clearPSW
Init_IO();
Init_LCD();
EA=1;
//开启全中断
汇编程序如下,小程序还是建议初学的朋友用汇编,有益无害:
ORG
000H
AJMP
MAIN
0003H
RETI
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;
LEDLP1:
LEDLP2:
DJNZR4,LEDLP2
DJNZR2,LEDLP1
CLRP2^4
acalllcdon
MOVR2,#43H
LEDLP3:
MOVR4,#64H
LEDLP4:
DJNZR4,LEDLP4
DJNZR2,LEDLP3
SETBP2^4
acalllcdoff
AJMPMAINLOP
lcdon:
inlop1:
djnzr6,inlop1
ret
lcdoff:
inlop2:
mova,#01h
djnzr6,inlop2
END
[本帖最后由banian于2009-12-1715:
13编辑]
TOP