微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于单片机的VRAM型彩色液晶显示模块设计

基于单片机的VRAM型彩色液晶显示模块设计

时间:10-14 来源:互联网 点击:

这两个单元的数据为

[ 404H] 11111110B + 00000001B

[ 405H] 00111111B + 11000000B

4. 2. 2  画点函数的具体实现

从例1 和例2 可以看出,要只显示一个色点,就必须知道该点对应的内存中的数据,而前面提到过内存中的数据是不能读出的,所以要将写入内存中的数据先保存起来,即在向YD2502 的显示缓冲区里写数据之前, 应先将此数据写入61LV5128 。若在坐标( X , Y) 处画颜色为color 的点,其具体函数如下:

void  LCD_ disppixel ( unsigned int X , unsigned int Y ,unsigned char color) {

unsigned int address ;

unsigned char data ;

address = LCD_pixeladdr ( X , Y) ;

/ / 计算该点对应的内存地址

switch ( X %8) {

case 0 : data = read _ exram ( ad2

dress) ; / / 读取相应SRAM 中的数据

data = 0x1F; / / [1110 ,

0000]保存其他点的数据

data | = (color 5) ;

/ / 填充相应的颜色

write _ exram ( data , ad2

dress) ; / / 把修改好的数据写回到SRAM

LCD_filldata (address ,da2

ta) ; / / 把数据写到液晶显示缓冲区

break ;

……

case 7 : …; break ;}}

以上只给出了余数是0 的情况,其他的情况可依此类推。计算内存地址的LCD_pixeladdr 函数可根据给出的内存地址计算方法编写,读写61LV5128 的read_exram 函数和write_exram 函数可根据具体的硬件设计编写,这里不再给出。

4. 3  显示汉字和其他功能的实现

在屏幕上显示16 ×16 点阵汉字的基本步骤是:首先取得该汉字的32 个字节的点阵数据,再确定屏幕上显示的位置,利用画点函数即可显示该汉字。因本模块使用了硬件汉字库技术,所以汉字的点阵数据是从汉字库中获取的。

在计算机汉字系统中,汉字是用机内码的形式存储的,将汉字机内码减去0A0A0H 就得到该汉字的区位码,通过区位码就可以找到该汉字点阵数据在汉字库中的位置。例如:汉字“中”的机内码是十六进制的“D6D0”,其中前两位“D6”表示机内码的区码,后两位“D0”表示机内码的位码。所以“中”的区位码为0D6D0H - 0A0A0H =3630H ,将区码和位码分别转换为十进制,得汉字“中”的区位码为“5448”。即“中”的点阵位于第54区的第48 个字的位置,在文件HZK16 中的位置为第32 ×[(54 - 1)×94 + (48 - 1)] = 160928D以后的32 个字节为“中”的点阵数据,用SUPER2PRO25 编程器读入文件HZK16 后利用其编辑功能中的缓冲区编辑查找到274A0H (160928D 的十六进制表示) 开始的32 个字节: 01H , 00H ,01H , 00H , 01H , 04H , 7FH , FEH , 41H , 04H ,41H , 04H , 41H , 04H , 41H , 04H , 7FH , FCH ,41H , 04H , 01H , 00H , 01H , 00H , 01H , 00H ,01H ,00H ,01H ,00H ,01H ,00H。这些数据与其点阵图形的对应关系如图4 所示,图中黑色方格表示二进制位“1”,即对应该显示的点,白色方格表示二进制位“0”,即不该显示的点。因此要在液晶屏幕上显示16 ×16 点阵的汉字,首先应找到该汉字在硬件汉字库中的位置,取出其后的32 个字节数据。取这32 个字节数据的函数如下:

图4  汉字“中”的点阵图形

unsigned  char  chinese[ ] [ 2 ] = {“中”“, 国”} ;

unsigned  char  buffer [32 ] ;

void  LCD_ readdata ( unsigned char num2

ber) {

unsigned  char  temp1 ,temp2 , k ;

unsigned  long  address , i ;

temp1 = chinese  [ number ] [ 0 ] - 0xA0 ;/ / 把机内码转换成区位码

temp2 = chinese  [ number ] [ 1 ] - 0xA0 ;

address = 32 3 ( ( (long) temp1 - 1) 3 94 +( (long) temp2 - 1) ) ;  / / 计算该汉字在汉字库中的首地址

k = 0 ;

for ( i = address ; i address + 32 ; i + + ) {

data = read_exrom( i) ;

buffer [ k ] = data ;

k + + ; }}

读A T29C040A 的read_exrom 函数可根据硬件设计编写,这里不再给出。

取得这32 个字节数据后,下面的程序设计就比较容易了,这里只给出程序流程(如图5 所示) ,具体函数可根据此流程编写。其中( X , Y) 是该汉字显示的起始点, color 是该汉字的显示颜色,number 是该汉字在chinese 数组中的位置。显示英文和数字的函数可根据显示汉字的函数稍加改造后即可得到,这里不再详细分析。

图5  显示一个汉字程序流程图

在本模块中也实现了在屏幕上画斜线、圆等功能,其具体实现过程就是在画点函数的基础上通过相应的算法来编

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top