||
摘 要:本文详述了MSP430F149和图形液晶显示模块LM12864FBC接口性能特点及方法, 设计了硬件电路以及接口软件。
关键词:低功耗;MSP430F149;LM12864FBC;硬件电路
概述
MSP430F149是德州仪器公司最近推出的MSP430系列超低功耗控制器中的一种,电源电压范围为1.8V至3.6V,可以用电池工作,而且使用时间长,适用于电池供电的手持设备使用。另外,液晶显示器具有功耗低、体积小、重量轻等特点,图形LCD除了显示字符、数字外,还可以显示汉字、图形、曲线等LED无法显示的功能,用途广泛。因此以MSP430为核心的LCD在智能仪器仪表和低功耗电子产品行业有广泛的发展前途。
本文在简单介绍液晶显示器LM12864FBC的驱动器KS0108B和KS0107B的结构和功能基础上,介绍了MSP430F149的LCD硬件接口和软件编程特点。
图1 MSP430F149与LM12864FBC接口原理图(略)
硬件设计
KS0108B的接口信号
KS0108B和KS0107B是LM12864FBC的共同驱动芯片,其中KS0107B是公共行驱动芯片,KS0108B是通过它产生的时序控制的。二片KS0108B是列驱动及控制芯片,KS0108B与微处理器的接口信号如下:
DB0-DB7:数据总线;
CSA、CSB:芯片选择信号A、B,CSA(B)=1,选通列驱动左、右半部分,CSA(B)=0,不选通列驱动左、右半部分;
D/I:D/I=1操作数据,D/I=0操作指令代码;
R/W:R/W=1读操作,R/W=0写操作;
E:输入使能。
LM12864FBC模块的引脚说明
MSP430F149与LM12864FBC接口电路
本液晶显示模块是128 64的LCD,利用P3.0-P3.4作为LCD的CSA、CSB、D/I、R/W和E的控制线,P4为LCD的数据线。由于MSP430的I/O口都是复用端口,因此必须将用到的引脚设为输入/出口。此外,MSP430是3.3V供电,而LCD是5V驱动的。
图2 KS0108B操作流程图(略)
软件设计
KS0108B指令集
KS0108B一共有七条指令,从作用上可分为两类。第一条和第二条指令为显示状态设置类;其余指令为数据读/写操作指令。
LM12864FBC的软件编程
(1)读液晶显示器状态子程序
void lcdstate(int cs) //cs代表液晶的边csa,csb
{
int csflag;
P4DIR=0x00;//P4口为输入口
while(1)
{ if(cs==1)
{P3OUT =BIT0;
P3OUT&=~BIT1;
P3OUT&=~BIT2;
P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便读液晶状态
}
else
{ P3OUT&=~BIT0;
P3OUT =BIT1;
P3OUT&=~BIT2;
P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便读液晶状态
}
P30UT&=~BIT4;
delay(3);
P30UT =BIT4;
delay(3);
P30UT&=~BIT4; //E信号低-高-低满足时序要求
csflage=P4DIR&0x80;
if(csflag=0) break;//若液晶空闲,停止等待
}
}
(2)对液晶显示器发指令子程序
void transport(trans,cs) //该函数采用形参和实参传送数据,trans为一个形参
int trans,cs;
{
lcdstate(cs);//判断液晶是否忙?
P4DIR= 0xFF;//P4口为输出口
delay(3);
if(cs==1)
{P3OUT =BIT0;
P3OUT&=~BIT1;
P3OUT&=~BIT2;
P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=0,R/W=0,以便写入指令
}
else
{ P3OUT&=~BIT0;
P3OUT =BIT1;
P3OUT&=~BIT2;
P3OUT&=~BIT3;//CSA=0,CSB=1,D/I=0,R/W=0,以便写入指令
}
P4DIR=0xFF trans; //需要写入的命令字送数据线
P30UT&=~BIT4;
delay(3);
P30UT =BIT4;
delay(3);
P30UT&=~BIT4; //E信号低-高-低满足时序要求
}
(3) 写数据子程序
void wdata(write,clmadd,cs) //write为需写入的数据,clmadd为列地址
int write,clmadd,cs;
{ transport(clmadd,cs);//设置列地址
lcdstate(cs) ;//判断液晶是否忙?
P4DIR= 0xFF;//P4口为输出口
delay(3);
if(cs==1)
{P3OUT =BIT0;
P3OUT&=~BIT1;
P3OUT =BIT2;
P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=1,R/W=0,以便写入要显示的数据
}
else
{ P3OUT&=~BIT0;
P3OUT =BIT1;
P3OUT =BIT2;
P3OUT&=~BIT3; //CSA=1,CSB=0,D/I=1,R/W=0,以便写入要显示的数据
}
P4DIR=0xFF write; //需要写入的命令字送数据线
P30UT&=~BIT4;
delay(3);
P30UT =BIT4;
delay(3);
P30UT&=~BIT4; //E信号低-高-低满足时序要求
}
(4)开,关,清屏子程序
void dison(cs) //显示开(关)
int cs;
{ int csflage;
while(1)
{transport(0x03e,cs);//发送控制命令,若关显示则为transport(0x03f,cs)
lcdstate(cs);
P4DIR=0x00;//P4口为输入口
while(1)
if(cs==1)
{P3OUT =BIT0;
P3OUT&=~BIT1;
P3OUT&=~BIT2;
P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便读液晶状态
}
else
{ P3OUT&=~BIT0;
P3OUT =BIT1;
P3OUT&=~BIT2;
P3OUT =BIT3; //CSA=1,CSB=0,D/I=0,R/W=1,以便读液晶状态
}
P30UT&=~BIT4;
delay(3);
P30UT =BIT4;
delay(3);
P30UT&=~BIT4; //E信号低-高-低满足时序要求
csflage=P4DIR&0x80;
if(csflag=0) break;//若液晶空闲,停止等待
}
}
void clear(int cs) //清屏子程序
{ int pagenum,pageadd,clmadd,clmsum;//定义局部变量
for(pagenum=0x08,pageadd=0x0b8;pagenum>0;pagenum--,pageadd++)
{ transport(pageadd,cs);
for(clmsum=0x40;clmsum<0x7f;clmsum++)
{lcdstate(cs) ;//判断液晶是否忙?
wdata(0x00,clmsum,cs);
}
}
}
有了上述各子程序后,就可以在显示屏上任意位置显示汉字、字符、数字和其他图形。
结束语
上述部分只是我们在开发输电线测量变频电源系统时使用的显示模块部分,已经在MSP430仿真器fet_r304上调试通过,在整个系统中效果不错。本系统体积小、功耗少、接口简单,值得在智能仪器仪表和低功耗电子产品行业推广。