本文在分析传统Windows BMP图片格式和LCM图像显示原理的基础上, 详细地设计了BMP图片到LCM图片数据格式转换程序、LCM模拟显示程序和LCM显示控制程序,实现了对任意图片在液晶上的显示,
为广大电子设计人员设计液晶界面找到了一条简单、实用、高效的途径。
引言
液晶显示器(Liquid Crystal Display,LCD )具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示无法比拟的优点,不仅可以显示数字、字符,还可以显示汉字及各种图形、图片,可实现屏幕上下左右滚动、动画、反转显示、显示闪烁多种功能,日益成为智能仪器仪表和测试设备的首选显示器件。目前常用的LCM12864系列的液晶模块,一般都没有图形驱动模块,而图形作为一种更为生动的表现方式,是用户需求的重点和设计的亮点。如何在这种点阵式液晶显示器中显示任意静态图片以及动画,
成为困扰设计者大量应用LCD的问题。我们现在可以通过互联网、图形处理软件及扫描仪等很方便地获得各种各样的图像、图片,这样可以通过比较简单的方法把任意图片移植到液晶显示器LCD上。文章通过分析BMP图像的存储格式和128
64点阵LCD上图像显示的原理,设计了一个LCD图片数据转换及模拟显示的软件,并介绍了实现LCD意图片的显示方法。
BMP图片格式及LCD显示原理
BMP位图是微软公司(Microsoft)和国际商用机器公司(IBM)共同倡导的一种图片格式。它按点阵排列顺序,将每个像素的色彩值以规定的方式把整个图片记录下来。根据色彩位深度不同,Windows
BMP文件像素描述部分差别较大,如256色每个像素需要8位(即1个字节)来描述,而16色的图片每个像素描述者只需4 位(即半个字节)。对于绝大部分电子设计者来说,最常用的是黑白二色的点阵式液晶显示器。因此,这里仅分析对Microsoft
Windows类型1位(Bit)描述的黑白二色BMP图片文件的处理。
一幅128 64点阵的黑白BMP图片文件的总长度为1086字节,前62个字节是文件头,用于表示文件类别、长度、图像的行数以及列数等信息,地址为00H~3DH;后1024字节则对应画面的点阵数据,地址为3EH~43DH。BMP文件的中字节排列与点阵数据对应关系如图1
所示,BMP点阵数据块第0个字节对应图片中左下角第63行的第0到7列,第15个字节对应图片中第63行的第112到127列,也就是按照从左至右,从下到上的顺序,BMP数据块最后一个字节对应第0行的112到127列。因此,要想实现将BMP图片文件转化为供模块直接显示的数据,不但涉及到各个数据排列的先后顺序,还涉及到字节中各个位的重组。
对于RT12864HZ汉字图形点阵液晶显示模块,它可显示汉字及图形,内置8192个中文汉字(16 16点阵)、128个字(8 16点阵)及绘图显示RAM(GDRAM)。绘图显示RAM提供128
8个字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会自动加一;在写入绘图RAM的期间,绘图显示必须关闭,整个写入绘图RAM的步骤如下:
(1) 关闭绘图显示功能。
(2) 先将水平的位元组坐标(X)写入绘图RAM地址;再将垂直的坐标(Y)写入绘图RAM地址;将D15~D8写入到RAM中;将D7~D0写入到RAM中。
(3) 打开绘图显示功能。
绘图显示的缓冲区与图形点阵对应分布参考图2所示(水平方向X以字节单位,垂直方向Y以位为单位)。
图1 位图BMP文件中点阵数据顺序与图形点阵关系图(略)
图2 图形显示坐标与GDRAM映射关系图(略)
点阵式液晶任意图片显示的实现
用DELPHI语言转换BMP图片数据
Windows中的画图软件为图片编辑提供了放大、网格、旋转、定位、定幅等强大、实用而灵活的功能,同时有输入各种字体及大小的汉字的功能,是编辑画面的理想工具。打开菜单[图像]下的[属性]项,设置任意图片宽度为128,高度为64,单位为像素,颜色为黑白。保存的BMP文件经过下面DELPHI编写的函数s_copyfile()便可转换为LCD模块显示的点阵数据,数据以单片机数据表定义的格式放在Memo1中,可以直接拷贝至LCM控制汇编程序中当数据表用,如图3所示。另外使用了heckBox1控件来使图片反白。
图3 BMP图片转换为LCM点阵显示的数据表(略)
函数s_copyfile()的源程序如下[4]:
function s_copyfile(filesou:string;filedes:string):boolean;
var
FromF, ToF: file;
s,t:string;
i,j,NumRead, NumWritten: Integer;
tem: array[1..62] of Char;
Buf: array[1..16] of Char;
begin
{$I-}
s_copyfile:=false;
if not fileexists(filesou) then
begin
showmessage('没有发现源文件'+#13+filesou);
exit;
end;
assignfile(fromf,filesou);
assignfile(tof,filedes);
Reset(FromF,1);{ Record size = 1 }
main.Memo1.Clear;
main.Memo3.Clear;
BlockRead(FromF, tem, SizeOf(tem), j);
j:=1;
repeat
s:=' DB ';
t:='';
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
for i:=1 to NumRead do
begin
if main.CheckBox1.Checked then buf[i]:=chr
(255-ord(buf[i]));
appendstr(t,IntToHex(ord(buf[i]),2));
if ord(buf[i])>159 then
AppendStr(s,'0'+IntToHex(ord(buf[i]),2)
+'H,')
else
AppendStr(s,IntToHex(ord(buf[i]),2)
+'H,');
end;
delete(s,length(s),1);
main.memo1.Lines.Append(s);
main.memo3.Lines.Append(t);
inc(j);
until (NumRead = 0);
main.Memo1.Lines.Delete(main.Memo1.Lines.
Capacity-1);
CloseFile(FromF);
CloseFile(ToF);
s_copyfile:=true;
end;
LCD模拟显示
图4 原始的BMP图片(略)
图5 BMP图片正常的模拟显示图(略)
图6 BMP图片反白的模拟显示图(略)
对于如图4所示的一张128 64的BMP图片,其模拟显示如图5所示,反白后显示如图6所示。
有的LCM数据是奇偶行交错的,也可以通过使用隔行来改变。模拟显示的源程序主要是采用在画布上画矩形框的方法,语句如下:
Image1.Canvas.FillRect(rect(16*S_col+4*i,
4*S_row,16*S_col+4*i+3,4*S_row+3));
其中S_col为行坐标(1~64),S_row为列坐标(0~31),每个字节分高4位与低4位分别来画矩形框。当高4位或低4位值为1~F时,对应的i分别如表1所示。
表1:数据高4位/低4位的值与绘图语句中i的取值对应表(略)
LCD显示控制程序设计
LCM内部带有8K字节的RAM缓存区,往RAM缓存区写入数据,则在LCD 显示屏上产生显示。通过改变显示缓存区首地址可实现屏幕滚动、屏幕换页等功能。
GRAPHIC_DISP:
LCALL CLEAR_GRAPHIC ;清除图形显示RAM单元(GDRAM)
MOV G_ROW, #80H ;设定图形显示起始行单元
MOV G_COLUMN, #80H ;设定图形显示起始列单元
GRA_DISP:
MOV A, #34H ;选择扩充指令集,关闭图形显示
LCALL INPUT
MOV A, G_ROW ;输入图形显示起始行地址
LCALL INPUT
MOV A, G_COLUMN ;输入图形显示起始列地址
LCALL INPUT
MOV A, #30H ;重新选择基本指令集
LCALL INPUT
CLR A
MOVC A, @A+DPTR ;输入显示数据(横向高8位数据)
LCALL DISPL
INC DPTR
CLR A
MOVC A, @A+DPTR ;输入显示数据(横向低8位数据)
LCALL DISPL
INC DPTR
INC G_COLUMN ;列地址加一
MOV A, G_COLUMN
CJNE A, #90H, GRA_DISP ;最后一列地址为90H(共计16列)
MOV G_COLUMN, #80H
INC G_ROW ;行地址加一
MOV A, G_ROW
CJNE A, #0A0H, GRA_DISP ;最后行地址为0A0H
MOV G_COLUMN, #80H
MOV G_ROW, #80H
MOV A, #36H ;打开图形显示
LCALL INPUT
RET
在上面程序中,是与图2所示的GRAM映射的点阵坐标一样,分成0~15列,每列写2个字节数据,共有32行。CLEAR_GRAPHIC为清除图形显示CGRAM的子程序,INPUT为写指令子程序,DISPL为写数据子程序,这里不再详细列出。另外硬件设计时,注意空脚(NC)应悬空,不能接地。调试时,适当调整液晶显示偏压信号V0,使之在一合适电压,这一电压若设置不当,LCM
无法正常工作。
结束语
按照上面分析的方法,可以方便的在液晶上显示任意图片。点阵的LCD模块还可实现屏幕合成、滚动、动画、闪烁等功能,正越来越受到广泛的应用和关注。需要指出的是,由点阵液晶显示器件与相应的控制器、驱动器装配成的显示模块的种类较多,其功能、指令、接口定义及引脚并无统一标准,具体使用时应加以选择。
|