是面向嵌入式系统的高性价比微处理器,它采用ARM7TDMI核,工作在66MHz。为了节约项目开发周期和成本,S3C44B0X大量集成了ADC、LCD控制器等外围器件。其中,LCD控制器支持在LCD上的单色、4级、16级灰度、256色的显示,具有很强的通用性。夏普LM057QC1T01是像素格式为320×3×240的256色TSTN透光型液晶显示模块。本文讨论了S3C44B0X和夏普LCD接口的连接。在此基础之上着重讨论彩色图形显示和英文、汉字显示实现的具体原理和方法。
LCD控制器
S3C44B0X LCD控制器的作用是将缓存中的数据传送到外部的LCD驱动器,并产生必须的LCD控制信号。LCD 控制器可以编程支持不同水平和垂直点数(640×480, 320×240, 160×160等)、不同数据线宽度、不同接口时序和刷新速率的LCD,支持4位双扫描、4位单扫描、8位单扫描模式,并支持水平/垂直卷动,以用来支持更大的屏幕显示(如1280×1280)。
液晶显示模块LM057QC1T01
LM057QC1T01是夏普公司生产的图形点阵256色STN液晶模块,它的分辨率为320×240,由于它具有接口简单、工作稳定和便于操作等特点,在嵌入式系统有比较广泛的应用。
S3C44B0X和LM057QC1T01的连接
由于S3C44B0X和LM057QC1T01液晶显示模块都具有很强的通用性。所以它们的连接比较容易实现,但是由于LCD模块需要有液晶显示所必需的偏转电压,所以需要在控制器和LCD接口之间加装能实现电压偏转功能的电路,实现输出LCD显示所需的27V偏转电压。具体引脚连接如表1所示。
LCD控制器有20个引脚,其中针对夏普LM057QC1T01液晶显示模块,引脚13~17没有使用意义,在实际的连接中悬空不接。其他引脚和LCD的连接如表1所示。在LCD显示模块中,引脚6所接入的用于液晶显示所需的27V偏转电压由外部外接电路提拱。外接电路所需要的电源可以由LCD控制器提供,也可以由其它电路提供。但LCD模块显示所需的高压只能由外接电路实现。
图形和字符显示
显示图片
在S3C44B0X中,由于CUP不支持文件管理,必须把要显示的图片包含到程序中。例如,如果要在LCD显示320×240大小的图片,在实际操作中,首先应使用转换工具把图片转换成C格式的数组文件,即把每一个象素点的颜色转换成用一个字节表示,然后把整个文件保存成240×320的数组形式。例如:
char BMP[240][320]= {0x00,0x00,0x01, 蓕;
然后把文件包含在项目工程中,用如下循环语句实现显示:
for(i=0;i<240;i++)
for(j=0;j<320;j++)
{
LCD_Buffer_Color[j]= BMP[j];
}
显示英文字母和字符
在实际应用中,通常用一个数组保存字母和字符点阵。以16×8点阵为例,用16×8个点阵表示一个字符,例如显示字符 ‘1’ ,象素需要显示的地方用*表示,否则为空白,这样,一个字符 ‘1’ 就显示出来。把这个点阵用十六进制的形式表示出来,字符1所对应的点阵是:
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x1,
0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,
在把字符送LCD缓冲区显示的时候,由于在缓冲区中是用一个字节表示一个象素,而字库中的一个位表示一个象素,即字库中一个字节对应缓冲区的八个字节,所以在送入缓冲区之前必须对字库进行必要的调整。具体方法是在显示一个象素之前,先把这个位右移到字节的最低位,然后屏蔽除此象素点的其它七位,再乘这个象素要显示的颜色,最后把调整后的数据送入对应的缓冲区。例如:假设字符‘1’点阵存在一维数组字库Zfk[],起始地址为20,显示颜色值为42的字符‘1’到第8行第10列的程序是:
for (i=0;i<16;i++)
for(j=0;j<8;j++)
LCD_Buffer_Color [10*16+i][(*8+j)]|= (Zfk[20+i]>>(7-j))&0x01))*42;
显示汉字
在容量比较大的系统中实现汉字的显示通常有两种方法,1. 把汉字库烧录到存储器,用烧写的地址加字库的偏移地址确定具体汉字的位置。2. 把汉字库转化成数组的形式,在程序中以读取数组的形式读取字库。这两种方法各有优缺点,这里讨论用第二种方法实现汉字显示。
在汉字库中,为了方便查找所需汉字的点阵,每个汉字都与一个双字节的内码一一对应。通过汉字的内码可以计算出它的点阵起始字节。以16×16宋体横向点阵为例,计算点阵起始字节地址的公式为:
地址=((内码高字节-160)*94+
(内码低字节-160))*32
例如:汉字“嵌”所对应的内码是C7B6H,那么它在汉字库中的地址是:
long int adress=
((C7-0xa1)*94+(B6-0xa1))*32
=1C120
假设转换后的汉字库存放在一维数组Hzk中,那么Hzk[1C120]至Hzk[1C120+32]所对应值就是汉字“嵌”所对应的十六进制点阵。由于在LCD显示的过程中,点阵中的一行数据要用两个字节来表示,在确定所要显示的行数据在点阵中的位置时需要做必要的调整,例如:在LCD上显示底Y行象素数据的时候,对应于汉字点阵中的数据应该是汉字库数组中的偏移地址,即2*Y和2*Y+1所对应的数据。所以在确定偏移地址的时候应该在行前乘2。在显示一行的过程中,前八个象素点对应的偏移地址是2*Y,后八个象素是2*Y+1,所以在计算偏移地址的时候应该用表示象素点列的数据与8相除,即Y*2+X/8.在具体实现过程中,为了方便,首先把所要显示的汉字点阵从字库中读出,实现程序是:
char hzbuff[16];
for (i=0;i<16;i++)
{
hzbuff= Hzk[address+i] ;
}
读出字库后,同样需要处理字库中的一位表示一个象素和LCD缓冲区中的一个字节表示LCD上一个象素的问题。处理方法和显示英文字母大体相同。
举例:在LCD模块Y行X列显示颜色为C的汉字“嵌”的程序是:
for (i=0;i<16;i++)
for(j=0;j<16;j++)
{
LCD_Buffer_Color [y*16+i][x*16+j]|= (( hzbuff[i*2+j/8]>>(7-j%8))&0x01)*C;
}
关于换行:在显示点阵为16×16汉字、LCD模块为320×240大小的情况下,每行显示20个汉字,共有15行,每屏能显示300个汉字或者字符。在程序的实现中,用数字0~15×20代表每个汉字的位置,例如0代表开始的第一个位置,15代表第二行的第一个位置,以此类推。假设当前显示位置为Positon,当显示中需要换行,重新计算显示位置时可以用如下程序实现:
Position=(position/20+1)*20;
结语
本文主要讨论了ARM7处理器S3C44B0X内置LCD控制器的使用方法,简要介绍了夏普LM057QC1T01图形点阵式液晶显示模块,并详细给出了与S3C44B0X内置LCD控制器的硬件连接方法,搭建以两者为基础的嵌入式工作平台。在此平台的基础上,本文详细讨论了图形、英文和汉字的显示原理和方法,并给出了具体实现的程序。
这些显示方法和程序在实现S3C44B0X与其它类型LCD模块连接时,只需做少量的修改即可,具有使用简单、运行稳定、便于移植修改等特点
转自Tony嵌入式论坛,地址:
阅读(600) | 评论(0) | 转发(0) |