0 引 言
人們在日常生活中,LCD占有很大的地位。人們使用的電腦、手機(jī)、車載系統(tǒng)、各種測量設(shè)備、顯示設(shè)備等等,都把LCD作為重要的人機(jī)接口,它把使用者需要的信息及時(shí)反應(yīng)出來。目前市場上存在著各種LCD和相對應(yīng)的驅(qū)動模塊,驅(qū)動模塊所帶的驅(qū)動程序都是針對本身模塊開發(fā)的,各種驅(qū)動程序之間通用性差,而且在不同的平臺上很難移植。每換一種LCD產(chǎn)品,都要根據(jù)它的驅(qū)動模塊重寫驅(qū)動程序。這樣產(chǎn)品開發(fā)資源浪費(fèi),開發(fā)周期長,成本增加。本文將介紹一種LCD圖形液晶驅(qū)動器的使用方法以及程序裁剪、移植和擴(kuò)展,實(shí)現(xiàn)在任意坐標(biāo)上顯示圖形和漢字。這款驅(qū)動器不帶字庫,對需要顯示的漢字和字母通過字模產(chǎn)生器產(chǎn)生數(shù)據(jù),通過程序設(shè)計(jì)把字體在LCD通過描點(diǎn)描述出來(本文所用的字模采用陽碼)。
1 典型圖形LCD驅(qū)動器NHC_313簡介
1.1 驅(qū)動器簡介
NHC_313驅(qū)動器驅(qū)動最大點(diǎn)陣數(shù)為640(列)×480(行),顯示顏色為65536色(16位色)。本文所用的LCD為SHARP公司產(chǎn)品,產(chǎn)品型號為LQ104V1DG52。NHC_313有8位復(fù)用并行接口一數(shù)據(jù)總線和控制總線。MCU可以通過總線對LCD進(jìn)行操作,隨時(shí)寫顯示存儲器,而不影響顯示效果,即顯示不會出現(xiàn)“雪花”。NHC_313內(nèi)部有兩頁顯示緩存,使用人員可以讓一頁緩存的數(shù)據(jù)在LCD上顯示出來,同時(shí)可以對第二頁的緩存進(jìn)行操作。此驅(qū)動器與微處理器接口連接簡單,接口的讀、寫操作兼容8031總線時(shí)序。這款驅(qū)動器只是單純的圖形圖像顯示,沒有內(nèi)置字庫、圖形庫。如果設(shè)計(jì)人員要顯示漢字,必須要把需要的漢字用字模生成器產(chǎn)生字模的16進(jìn)制文件,然后通過程序控制把需要的字體逐一描到LCD上。驅(qū)動器的控制引腳如下:
WR:數(shù)據(jù)寫入,低電平有效
CS:片選端,低電平有效
A0:地址信號線0
A1:地址信號線1
DB0~DB7:數(shù)據(jù)總線
對NHC_313讀寫的時(shí)候采用8031時(shí)序,如圖1為NHC_313接口電路8031時(shí)序圖,在表1中列出了接口的時(shí)序特征參數(shù)。
當(dāng)驅(qū)動器與8051等I/O口讀寫速度不是很快的MCU連接時(shí),I/O的特性其本上可以滿足表1的時(shí)序特征參數(shù),圖2給出的是MCU和驅(qū)動器無縫連接的接口電路,這種方法是采用IO模擬時(shí)序的時(shí)候用到的引腳(不止局限于圖中列出的引腳),本文建議采用I/O口模擬時(shí)序的方法控制驅(qū)動器。要注意的是如果I/O的讀寫速度過快則不能滿足接口時(shí)序特性參數(shù)。例如采用Silab公司的C8051F340作為NHC_313的MCU,由于C8051F340的內(nèi)部晶振為48MHz,I/O讀寫速度不能很好滿足時(shí)序特性(寫周期不能滿足),所以在程序設(shè)汁中會看到有延時(shí)程序。而Atmel 8051系列單片機(jī)I/O可以滿足表1的時(shí)序參數(shù)特性,不需要加入延時(shí)程序。
表2為驅(qū)動器命令,由于顯示的像素點(diǎn)數(shù)為640(列)×480(行),對于8位的I/O不能一次的把行和列的信息完全表示出來,由此設(shè)置了行列的高低地址(8位地址線只能表示0~255的地址信息)。
對驅(qū)動器進(jìn)行寫操作要遵循以下規(guī)律:
a)設(shè)定顯示頁和操作頁地址(A1=A0=1,CS=0,WR=0)
D1-D0設(shè)定列地址高字節(jié);D2設(shè)定行地址高字節(jié)。開機(jī)時(shí)先執(zhí)行此操作再執(zhí)行其他操作。
b)寫行地址低字節(jié)。(A1=0,A0=1)
c)寫列地址低字節(jié)字節(jié)。(A1=1,A0=0)
d)連續(xù)寫兩次8位字節(jié)對應(yīng)一個(gè)像素點(diǎn)顏色(A1=0,A0=0)。第一個(gè)字節(jié):
R4、R3、R2、R1、R0表示紅色灰度;G5、G4、G3、G2、G1、G0表示綠色灰度;B4、B3、B2、B1、B0表示藍(lán)色灰度。如在同一行內(nèi)連續(xù)寫數(shù)據(jù)不用每次重寫行坐標(biāo)和列坐標(biāo),每一次“寫數(shù)據(jù)”操作后列地址自動加1,即每寫兩個(gè)字節(jié)顯示數(shù)據(jù)列地址自動加1。
1.2 關(guān)于液晶屏的簡單說明
本文中的液晶顯示器顯示的顏色數(shù)量為65536種一16位色,對一個(gè)像素點(diǎn)所要顯示的顏色需要用兩個(gè)字節(jié)的數(shù)據(jù)來表示。需要注意的是,LCD的坐標(biāo)系同數(shù)學(xué)上的坐標(biāo)系有所不同,LCD的坐標(biāo)系如圖3所示。
坐標(biāo)系上的點(diǎn)和LCD的像素點(diǎn)是一一對應(yīng)的,每一個(gè)像素點(diǎn)用坐標(biāo)系的橫縱坐標(biāo)唯一標(biāo)識。由于八位的數(shù)據(jù)線只能表示0~255的范圍,所以把LCD分割成了圖3中的幾個(gè)區(qū)域,這些區(qū)域保證了橫縱坐標(biāo)范圍在0~255之內(nèi),通過設(shè)置行列高低地址選擇所要顯示的區(qū)域。每個(gè)區(qū)域獨(dú)立為一個(gè)小的坐標(biāo)系,如圖3中的F區(qū)域所示,區(qū)域中的點(diǎn)用這個(gè)小坐標(biāo)系的坐標(biāo)唯一表示。例如在選擇LCD上點(diǎn)(630,420),通過整體坐標(biāo)軸把這個(gè)點(diǎn)定位到F區(qū),通過簡單的計(jì)算得知此點(diǎn)在F區(qū)域坐標(biāo)下的新坐標(biāo)值為(118,108)。選擇區(qū)域的過程就是設(shè)置行列高低地址的過程,也可以理解為地址的寫入為先寫如高地址,后寫入低地址,且地址的長度為11位,最高位為行列地址選擇位。為了方便理解和使用,本文把地址用區(qū)域來表示。例如選擇F區(qū)域,執(zhí)行操作:A1=A0=1,CS=0,WR=0,然后向控制器寫入D2D1D0=110。