液晶是单片机系统最常用的显示设备之一,这个程序库是在MSP430F169、MSP1430F149单片机上测试通过的,可以放心使用;液晶选用的是金鹏的:OCMJ4X8C型号的12864液晶;控制液晶用的是并行方式,三个控制口是P3.0、P3.1、P3.2三个IO口,数据用的是P5数据IO口。
硬件介绍:
430的数字IO口:
MSP430F149、MSP430F169均有P1-P6 每个8位 共48个IO口;有大量的IO口可供使用,所以对液晶控制可以选用8位平行数据方式;430的每个IO口都是双向IO口,通过寄存器控制其数据传输方向,很方便实用;有关msp430单片机的IO口介绍可以参考德州仪器提供的用户指南和数据手册等资料。
液晶OCMJ4X8C:
此模块可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。提供三种控制接口,分别是8位微处理器接口,4位微处理器接口及串行接口(OCMJ4X16A/B无串行接口)。所有的功能,包含显示RAM,字型产生器,都包含在一个芯片里面,只要一个最小的微处理系统,就可以方便操作模块。
这款液晶内置2M-位中文字型ROM (CGROM) 总共提供8192个中文字型(16x16点阵),16K位半宽字型ROM(HCGROM) 总共提供126 个符号字型(16x8点阵),64x16位字型产生RAM(CGRAM),另外绘图显示画面提供一个64x256点的绘图区域(GDRAM),可以和文字画面混和显示。
OCMJ4X8C的引脚说明:
引脚连接方式:PSB、RST接高电平(3.3v);RS接P3.0;R/W接P3.1;E接P3.2;DB0-DB7接P5口,电源接3.3v(包括背光) GND接地(包括背光)。
汉字图形显示步骤:
1、显示资料RAM(DDRAM)
显示数据RAM 提供64x2 个字节的空间,最多可以控制4 行16 字(64 个字)的中文字型显示,当输入显示资料RAM时,可以分别显示CGROM,HCGROM 与CGRAM 的字型;本系列模块可以显示三种字型,分别是半宽的HCGROM 字型、CGRAM 字型及中文CGROM 字型,三种字型的选择,由在DDRAM 中写入的编码选择,在0000H~0006H 的定字型,02H~7FH 的编码中将选择半编码中将选择CGRAM 的自宽英数字的字型,至于A1 以上的编码将自动的结合下一个字节,组成两个字节的编码达成中文字型的编码。
BIG5(A140~D75F) GB(A1A0~F7FF),详细各种字型编码如下:
1). 显示半宽字型:将8 位资料写入DDRAM 中,范围为02H~7FH 的编码。
2). 显示CGRAM 字型:将16 位资料写入DDRAM 中,总共有0000H,0002H,0004H,0006H 四种编码。
3). 显示中文字形:将16 位资料写入DDRAM 中,范围为A140H~D75FH 的编码(BIG5) , A1A0H~F7FFH 的编码(GB)。将16 位资料写入DDRAM 方式为透过连写入两个字节的资料来完成,先写入高字节(D15~D8)再写入低字节(D7~D0)。
2、绘图RAM(GDRAM)
绘图显示RAM 提供64x32 个字节的记忆空间(由扩充指令设定绘图RAM 地址),最多可以控制256x64点的二维绘图缓冲空间,在更改绘图RAM 时,由扩充指令设定GDRAM 地址先设垂直地址再设水平地址(连续写入两个字节的数据来完成垂直与水平的坐标地址),再写入两个8 位的资料到绘图RAM,而地址计数器(AC)会自动加一,整个写入绘图RAM 的步骤如下:
1). 先将垂直的字节坐标(Y)写入绘图RAM 地址。
2). 再将水平的字节坐标(X)写入绘图RAM 地址。
3). 将D15~D8 写入到RAM 中(写入第一个Bytes)。
4). 将D7~D0 写入到RAM 中(写入第二个Bytes)。
液晶屏显示地址:
有关液晶其他的或详细的介绍,请参考12864液晶的资料。
程序实现:
判忙: 等待液晶模块空闲。
液晶模块要求:当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取 BF 标志时 BF需为 0,方可接受新的指令;如果在送出一个令前并不检查 BF标志,那幺在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成;在这里,我选用等待忙标志结束。程序如下:
void WaitForEnable()
{
char busy;
CLR_RS;
SET_RW;
DATA_DIR_IN;
do //判忙
{
SET_EN;
_NOP();
busy = DATA_IN;
CLR_EN;
}
while(busy & 0x80);
DATA_DIR_OUT;
}
这样,每次向液晶写命令或数据时,只需先调用此函数即可,该函数将会阻塞,直到忙标志变回0(内部空闲,可以接受命令)。
写入数据: 向模块内部RAM写入数据。
写入数据到DDRAM即可显示到液晶,写入函数:
void LcdWriteData(char data)
{
WaitForEnable();
SET_RS;
CLR_RW;
DATA_OUT = data; //写数据
SET_EN;
_NOP();
CLR_EN;
}
同样,调用这个函数也可以向其他RAM写入数据,完成相应操作。
写入命令: 向模块写入命令。
写入命令可以通过液晶的指令集,控制液晶完成相应的功能。程序如下:
void LcdWriteComm(char cmd)
{
WaitForEnable(); //检测忙信号?
CLR_RS;
CLR_RW;
DATA_OUT = cmd; //写命令
SET_EN;
_NOP();
CLR_EN;
}
如果cmd是0x80-0x9F,则是向液晶写入地址;地址表参见前面硬件介绍部分。
写入字符串: 写入字符串,以显示。
写入字符串即是多次调用写入数据,把字符串写入液晶以供显示。程序如下:
void LcdWriteString(char addr,char *str)
{
LcdWriteComm(addr);
while(*str!='