LCD彩色圖形顯示和英文、漢字顯示實(shí)現(xiàn)的具體原理和方法
摘 要:本文著重介紹了ARM7處理器S3C44B0X內(nèi)置LCD控制器的使用方法,簡(jiǎn)要介紹夏普LM057QC1T01液晶顯示模塊以及它和S3C44B0X的接口方法。并在此基礎(chǔ)之上,討論了彩色英文、漢字和圖形在LCD模塊上的顯示原理和實(shí)現(xiàn)方法。
關(guān)鍵詞:S3C44B0X;LCD Controller;LM057QC1T01
引言
S3C44B0X是面向嵌入式系統(tǒng)的高性價(jià)比微處理器,它采用ARM7TDMI核,工作在66MHz。為了節(jié)約項(xiàng)目開(kāi)發(fā)周期和成本,S3C44B0X大量集成了ADC、LCD控制器等外圍器件。其中,LCD控制器支持在LCD上的單色、4級(jí)、16級(jí)灰度、256色的顯示,具有很強(qiáng)的通用性。夏普LM057QC1T01是像素格式為320×3×240的256色TSTN透光型液晶顯示模塊。本文討論了S3C44B0X和夏普LCD接口的連接。在此基礎(chǔ)之上著重討論彩色圖形顯示和英文、漢字顯示實(shí)現(xiàn)的具體原理和方法。
LCD控制器
S3C44B0X LCD控制器的作用是將緩存中的數(shù)據(jù)傳送到外部的LCD驅(qū)動(dòng)器,并產(chǎn)生必須的LCD控制信號(hào)。LCD 控制器可以編程支持不同水平和垂直點(diǎn)數(shù)(640×480, 320×240, 160×160等)、不同數(shù)據(jù)線寬度、不同接口時(shí)序和刷新速率的LCD,支持4位雙掃描、4位單掃描、8位單掃描模式,并支持水平/垂直卷動(dòng),以用來(lái)支持更大的屏幕顯示(如1280×1280)。
液晶顯示模塊LM057QC1T01
LM057QC1T01是夏普公司生產(chǎn)的圖形點(diǎn)陣256色STN液晶模塊,它的分辨率為320×240,由于它具有接口簡(jiǎn)單、工作穩(wěn)定和便于操作等特點(diǎn),在嵌入式系統(tǒng)有比較廣泛的應(yīng)用。
S3C44B0X和LM057QC1T01的連接
由于S3C44B0X和LM057QC1T01液晶顯示模塊都具有很強(qiáng)的通用性。所以它們的連接比較容易實(shí)現(xiàn),但是由于LCD模塊需要有液晶顯示所必需的偏轉(zhuǎn)電壓,所以需要在控制器和LCD接口之間加裝能實(shí)現(xiàn)電壓偏轉(zhuǎn)功能的電路,實(shí)現(xiàn)輸出LCD顯示所需的27V偏轉(zhuǎn)電壓。具體引腳連接如表1所示。
LCD控制器有20個(gè)引腳,其中針對(duì)夏普LM057QC1T01液晶顯示模塊,引腳13~17沒(méi)有使用意義,在實(shí)際的連接中懸空不接。其他引腳和LCD的連接如表1所示。在LCD顯示模塊中,引腳6所接入的用于液晶顯示所需的27V偏轉(zhuǎn)電壓由外部外接電路提拱。外接電路所需要的電源可以由LCD控制器提供,也可以由其它電路提供。但LCD模塊顯示所需的高壓只能由外接電路實(shí)現(xiàn)。
圖形和字符顯示
顯示圖片
在S3C44B0X中,由于CUP不支持文件管理,必須把要顯示的圖片包含到程序中。例如,如果要在LCD顯示320×240大小的圖片,在實(shí)際操作中,首先應(yīng)使用轉(zhuǎn)換工具把圖片轉(zhuǎn)換成C格式的數(shù)組文件,即把每一個(gè)象素點(diǎn)的顏色轉(zhuǎn)換成用一個(gè)字節(jié)表示,然后把整個(gè)文件保存成240×320的數(shù)組形式。例如:
char BMP[240][320]= {0x00,0x00,0x01, 蓕;
然后把文件包含在項(xiàng)目工程中,用如下循環(huán)語(yǔ)句實(shí)現(xiàn)顯示:
for(i=0;i<240;i++)
for(j=0;j<320;j++)
{
LCD_Buffer_Color[i][j]= BMP[i][j];
}
顯示英文字母和字符
在實(shí)際應(yīng)用中,通常用一個(gè)數(shù)組保存字母和字符點(diǎn)陣。以16×8點(diǎn)陣為例,用16×8個(gè)點(diǎn)陣表示一個(gè)字符,例如顯示字符 ‘1’ ,象素需要顯示的地方用*表示,否則為空白,這樣,一個(gè)字符 ‘1’ 就顯示出來(lái)。把這個(gè)點(diǎn)陣用十六進(jìn)制的形式表示出來(lái),字符1所對(duì)應(yīng)的點(diǎn)陣是:
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x1,
0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00,
在把字符送LCD緩沖區(qū)顯示的時(shí)候,由于在緩沖區(qū)中是用一個(gè)字節(jié)表示一個(gè)象素,而字庫(kù)中的一個(gè)位表示一個(gè)象素,即字庫(kù)中一個(gè)字節(jié)對(duì)應(yīng)緩沖區(qū)的八個(gè)字節(jié),所以在送入緩沖區(qū)之前必須對(duì)字庫(kù)進(jìn)行必要的調(diào)整。具體方法是在顯示一個(gè)象素之前,先把這個(gè)位右移到字節(jié)的最低位,然后屏蔽除此象素點(diǎn)的其它七位,再乘這個(gè)象素要顯示的顏色,最后把調(diào)整后的數(shù)據(jù)送入對(duì)應(yīng)的緩沖區(qū)。例如:假設(shè)字符‘1’點(diǎn)陣存在一維數(shù)組字庫(kù)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;
顯示漢字
在容量比較大的系統(tǒng)中實(shí)現(xiàn)漢字的顯示通常有兩種方法,1. 把漢字庫(kù)燒錄到存儲(chǔ)器,用燒寫(xiě)的地址加字庫(kù)的偏移地址確定具體漢字的位置。2. 把漢字庫(kù)轉(zhuǎn)化成數(shù)組的形式,在程序中以讀取數(shù)組的形式讀取字庫(kù)。這兩種方法各有優(yōu)缺點(diǎn),這里討論用第二種方法實(shí)現(xiàn)漢字顯示。
在漢字庫(kù)中,為了方便查找所需漢字的點(diǎn)陣,每個(gè)漢字都與一個(gè)雙字節(jié)的內(nèi)碼一一對(duì)應(yīng)。通過(guò)漢字的內(nèi)碼可以計(jì)算出它的點(diǎn)陣起始字節(jié)。以16×16宋體橫向點(diǎn)陣為例,計(jì)算點(diǎn)陣起始字節(jié)地址的公式為:
地址=((內(nèi)碼高字節(jié)-160)*94+
(內(nèi)碼低字節(jié)-160))*32
例如:漢字“嵌”所對(duì)應(yīng)的內(nèi)碼是C7B6H,那么它在漢字庫(kù)中的地址是:
long int adress=
((C7-0xa1)*94+(B6-0xa1))*32
=1C120
假設(shè)轉(zhuǎn)換后的漢字庫(kù)存放在一維數(shù)組Hzk中,那么Hzk[1C120]至Hzk[1C120+32]所對(duì)應(yīng)值就是漢字“嵌”所對(duì)應(yīng)的十六進(jìn)制點(diǎn)陣。由于在LCD顯示的過(guò)程中,點(diǎn)陣中的一行數(shù)據(jù)要用兩個(gè)字節(jié)來(lái)表示,在確定所要顯示的行數(shù)據(jù)在點(diǎn)陣中的位置時(shí)需要做必要的調(diào)整,例如:在LCD上顯示底Y行象素?cái)?shù)據(jù)的時(shí)候,對(duì)應(yīng)于漢字點(diǎn)陣中的數(shù)據(jù)應(yīng)該是漢字庫(kù)數(shù)組中的偏移地址,即2*Y和2*Y+1所對(duì)應(yīng)的數(shù)據(jù)。所以在確定偏移地址的時(shí)候應(yīng)該在行前乘2。在顯示一行的過(guò)程中,前八個(gè)象素點(diǎn)對(duì)應(yīng)的偏移地址是2*Y,后八個(gè)象素是2*Y+1,所以在計(jì)算偏移地址的時(shí)候應(yīng)該用表示象素點(diǎn)列的數(shù)據(jù)與8相除,即Y*2+X/8.在具體實(shí)現(xiàn)過(guò)程中,為了方便,首先把所要顯示的漢字點(diǎn)陣從字庫(kù)中讀出,實(shí)現(xiàn)程序是:
char hzbuff[16];
for (i=0;i<16;i++)
{
hzbuff[i]= Hzk[address+i] ;
}
讀出字庫(kù)后,同樣需要處理字庫(kù)中的一位表示一個(gè)象素和LCD緩沖區(qū)中的一個(gè)字節(jié)表示LCD上一個(gè)象素的問(wèn)題。處理方法和顯示英文字母大體相同。
舉例:在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;
}
關(guān)于換行:在顯示點(diǎn)陣為16×16漢字、LCD模塊為320×240大小的情況下,每行顯示20個(gè)漢字,共有15行,每屏能顯示300個(gè)漢字或者字符。在程序的實(shí)現(xiàn)中,用數(shù)字0~15×20代表每個(gè)漢字的位置,例如0代表開(kāi)始的第一個(gè)位置,15代表第二行的第一個(gè)位置,以此類推。假設(shè)當(dāng)前顯示位置為Positon,當(dāng)顯示中需要換行,重新計(jì)算顯示位置時(shí)可以用如下程序?qū)崿F(xiàn):
Position=(position/20+1)*20;
結(jié)語(yǔ)
本文主要討論了ARM7處理器S3C44B0X內(nèi)置LCD控制器的使用方法,簡(jiǎn)要介紹了夏普LM057QC1T01圖形點(diǎn)陣式液晶顯示模塊,并詳細(xì)給出了與S3C44B0X內(nèi)置LCD控制器的硬件連接方法,搭建以兩者為基礎(chǔ)的嵌入式工作平臺(tái)。在此平臺(tái)的基礎(chǔ)上,本文詳細(xì)討論了圖形、英文和漢字的顯示原理和方法,并給出了具體實(shí)現(xiàn)的程序。
這些顯示方法和程序在實(shí)現(xiàn)S3C44B0X與其它類型LCD模塊連接時(shí),只需做少量的修改即可,具有使用簡(jiǎn)單、運(yùn)行穩(wěn)定、便于移植修改等特點(diǎn)。
評(píng)論