0 引 言
人們?cè)谌粘I钪校?a class="innerlink" href="http://forexkbc.com/tags/LCD" title="LCD" target="_blank">LCD占有很大的地位,。人們使用的電腦、手機(jī),、車(chē)載系統(tǒng),、各種測(cè)量設(shè)備、顯示設(shè)備等等,,都把LCD作為重要的人機(jī)接口,,它把使用者需要 的信息及時(shí)反應(yīng)出來(lái)。目前市場(chǎng)上存在著各種LCD和相對(duì)應(yīng)的驅(qū)動(dòng)模塊,,驅(qū)動(dòng)模塊所帶的驅(qū)動(dòng)程序都是針對(duì)本身模塊開(kāi)發(fā)的,,各種驅(qū)動(dòng)程序之間通用性差,,而且在 不同的平臺(tái)上很難移植。每換一種LCD產(chǎn)品,,都要根據(jù)它的驅(qū)動(dòng)模塊重寫(xiě)驅(qū)動(dòng)程序,。這樣產(chǎn)品開(kāi)發(fā)資源浪費(fèi),開(kāi)發(fā)周期長(zhǎng),,成本增加,。本文將介紹一種LCD圖形 液晶驅(qū)動(dòng)器的使用方法以及程序裁剪、移植和擴(kuò)展,,實(shí)現(xiàn)在任意坐標(biāo)上顯示圖形和漢字,。這款驅(qū)動(dòng)器不帶字庫(kù),對(duì)需要顯示的漢字和字母通過(guò)字模產(chǎn)生器產(chǎn)生數(shù)據(jù),, 通過(guò)程序設(shè)計(jì)把字體在LCD通過(guò)描點(diǎn)描述出來(lái)(本文所用的字模采用陽(yáng)碼),。
1 典型圖形LCD驅(qū)動(dòng)器NHC_313簡(jiǎn)介
1.1 驅(qū)動(dòng)器簡(jiǎn)介
NHC_313驅(qū)動(dòng)器驅(qū)動(dòng)最大點(diǎn)陣數(shù)為640(列)×480(行),顯示顏色為65536色(16位色),。本文所用的LCD為SHARP公司產(chǎn)品,產(chǎn)品型 號(hào)為L(zhǎng)Q104V1DG52,。NHC_313有8位復(fù)用并行接口一數(shù)據(jù)總線和控制總線,。MCU可以通過(guò)總線對(duì)LCD進(jìn)行操作,隨時(shí)寫(xiě)顯示存儲(chǔ)器,,而不影響 顯示效果,,即顯示不會(huì)出現(xiàn)“雪花”。NHC_313內(nèi)部有兩頁(yè)顯示緩存,,使用人員可以讓一頁(yè)緩存的數(shù)據(jù)在LCD上顯示出來(lái),,同時(shí)可以對(duì)第二頁(yè)的緩存進(jìn)行操 作。此驅(qū)動(dòng)器與微處理器接口連接簡(jiǎn)單,,接口的讀,、寫(xiě)操作兼容8031總線時(shí)序。這款驅(qū)動(dòng)器只是單純的圖形圖像顯示,,沒(méi)有內(nèi)置字庫(kù),、圖形庫(kù)。如果設(shè)計(jì)人員要 顯示漢字,,必須要把需要的漢字用字模生成器產(chǎn)生字模的16進(jìn)制文件,,然后通過(guò)程序控制把需要的字體逐一描到LCD上。驅(qū)動(dòng)器的控制引腳如下:
WR:數(shù)據(jù)寫(xiě)入,,低電平有效
CS:片選端,,低電平有效
A0:地址信號(hào)線0
A1:地址信號(hào)線1
DB0~DB7:數(shù)據(jù)總線
對(duì)NHC_313讀寫(xiě)的時(shí)候采用8031時(shí)序,如圖1為NHC_313接口電路8031時(shí)序圖,,在表1中列出了接口的時(shí)序特征參數(shù),。
當(dāng)驅(qū)動(dòng)器與8051等I/O口讀寫(xiě)速度不是很快的MCU連接時(shí),,I/O的特性其本上可以滿(mǎn)足表1的時(shí)序特征參數(shù),圖2給出的是MCU和驅(qū)動(dòng)器無(wú)縫連接的接 口電路,,這種方法是采用IO模擬時(shí)序的時(shí)候用到的引腳(不止局限于圖中列出的引腳),,本文建議采用I/O口模擬時(shí)序的方法控制驅(qū)動(dòng)器。要注意的是如果 I/O的讀寫(xiě)速度過(guò)快則不能滿(mǎn)足接口時(shí)序特性參數(shù),。例如采用Silab公司的C8051F340作為NHC_313的MCU,,由于C8051F340的內(nèi) 部晶振為48MHz,I/O讀寫(xiě)速度不能很好滿(mǎn)足時(shí)序特性(寫(xiě)周期不能滿(mǎn)足),,所以在程序設(shè)汁中會(huì)看到有延時(shí)程序,。而Atmel 8051系列單片機(jī)I/O可以滿(mǎn)足表1的時(shí)序參數(shù)特性,不需要加入延時(shí)程序,。
表2為驅(qū)動(dòng)器命令,,由于顯示的像素點(diǎn)數(shù)為640(列)×480(行),對(duì)于8位的I/O不能一次的把行和列的信息完全表示出來(lái),,由此設(shè)置了行列的高低地址(8位地址線只能表示0~255的地址信息),。
對(duì)驅(qū)動(dòng)器進(jìn)行寫(xiě)操作要遵循以下規(guī)律:
a)設(shè)定顯示頁(yè)和操作頁(yè)地址(A1=A0=1,CS=0,,WR=0)
D1-D0設(shè)定列地址高字節(jié),;D2設(shè)定行地址高字節(jié)。開(kāi)機(jī)時(shí)先執(zhí)行此操作再執(zhí)行其他操作,。
b)寫(xiě)行地址低字節(jié),。(A1=0,A0=1)
c)寫(xiě)列地址低字節(jié)字節(jié),。(A1=1,,A0=0)
d)連續(xù)寫(xiě)兩次8位字節(jié)對(duì)應(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ù)寫(xiě)數(shù)據(jù)不用每次重寫(xiě)行坐標(biāo)和列坐標(biāo),,每一次“寫(xiě)數(shù)據(jù)”操作后列地址自動(dòng)加1,即每寫(xiě)兩個(gè)字節(jié)顯示數(shù)據(jù)列地址自動(dòng)加1,。
1.2 關(guān)于液晶屏的簡(jiǎn)單說(shuō)明
本文中的液晶顯示器顯示的顏色數(shù)量為65536種一16位色,,對(duì)一個(gè)像素點(diǎn)所要顯示的顏色需要用兩個(gè)字節(jié)的數(shù)據(jù)來(lái)表示。需要注意的是,,LCD的坐標(biāo)系同數(shù)學(xué)上的坐標(biāo)系有所不同,,LCD的坐標(biāo)系如圖3所示。
坐標(biāo)系上的點(diǎn)和LCD的像素點(diǎn)是一一對(duì)應(yīng)的,,每一個(gè)像素點(diǎn)用坐標(biāo)系的橫縱坐標(biāo)唯一標(biāo)識(shí),。由于八位的數(shù)據(jù)線只能表示0~255的范圍,所以把LCD分割成了 圖3中的幾個(gè)區(qū)域,,這些區(qū)域保證了橫縱坐標(biāo)范圍在0~255之內(nèi),,通過(guò)設(shè)置行列高低地址選擇所要顯示的區(qū)域。每個(gè)區(qū)域獨(dú)立為一個(gè)小的坐標(biāo)系,,如圖3中的F 區(qū)域所示,,區(qū)域中的點(diǎn)用這個(gè)小坐標(biāo)系的坐標(biāo)唯一表示。例如在選擇LCD上點(diǎn)(630,,420),通過(guò)整體坐標(biāo)軸把這個(gè)點(diǎn)定位到F區(qū),,通過(guò)簡(jiǎn)單的計(jì)算得知此 點(diǎn)在F區(qū)域坐標(biāo)下的新坐標(biāo)值為(118,,108)。選擇區(qū)域的過(guò)程就是設(shè)置行列高低地址的過(guò)程,,也可以理解為地址的寫(xiě)入為先寫(xiě)如高地址,,后寫(xiě)入低地址,且 地址的長(zhǎng)度為11位,,最高位為行列地址選擇位,。為了方便理解和使用,本文把地址用區(qū)域來(lái)表示,。例如選擇F區(qū)域,,執(zhí)行操 作:A1=A0=1,CS=0,,WR=0,,然后向控制器寫(xiě)入D2D1D0=110。
2 程序設(shè)計(jì),、移植和剪裁方法
2.1 LCD驅(qū)動(dòng)器I/O操作基本程序
對(duì)驅(qū)動(dòng)器控制是完成液晶產(chǎn)品開(kāi)發(fā)的第一步也是關(guān)鍵部分,,下面的程序是采用I/O模擬8031時(shí)序方法完成對(duì)控制器進(jìn)行控制,,通過(guò)這個(gè)方法有助于理解對(duì)控制 器控制的操作步驟。圖1為C8051F340同驅(qū)動(dòng)器的連接方法,,本文所有例程編寫(xiě)都遵循這種連接方式,。操作基本程序清單如下:
上述的dlcd,clcd1,,clcd2,,clcd3函數(shù)中,如果把控制器的片選信號(hào)接到低電平,,cs這個(gè)管腳在程序可以略去,;假如P4端口和其他端口相 連接,cs管腳要通過(guò)I/O口控制驅(qū)動(dòng)器是否選通,。注意函數(shù)中的延遲函數(shù):數(shù)據(jù)出現(xiàn)在端口上要經(jīng)過(guò)T6的時(shí)間在wr的上升沿把數(shù)據(jù)寫(xiě)入控制器,。
2.2 LCD高級(jí)程序設(shè)計(jì)
函數(shù)draw_point功能:把有顏色的點(diǎn)在LCD指定位置顯示出來(lái)。函數(shù)參數(shù)意義(參考圖3):
word_which_display:設(shè)置顯示頁(yè),;
word_which_write:設(shè)置操作頁(yè),;
word_x,:新坐標(biāo)O'在原坐標(biāo)O下橫坐標(biāo),;
word_y:新坐標(biāo)O'在原坐標(biāo)O下縱坐標(biāo),;
line_x:點(diǎn)G在坐標(biāo)系O'下橫坐標(biāo)
line_y:點(diǎn)G在坐標(biāo)系O'下縱坐標(biāo)
yanse1,yanse2:連續(xù)寫(xiě)入的8位像素字節(jié)
說(shuō)明:顯示頁(yè)的設(shè)置是為了顯示兩頁(yè)緩存中的一頁(yè)數(shù)據(jù)到LCD上,,操作頁(yè)的設(shè)置是為了把數(shù)據(jù)寫(xiě)入到兩頁(yè)緩存當(dāng)中的一頁(yè),。如果顯示頁(yè)為第1頁(yè),操作頁(yè)為第0 頁(yè),,此時(shí)LCD顯示的是第一頁(yè)的緩存的數(shù)據(jù),,此時(shí)把數(shù)據(jù)寫(xiě)入到第0頁(yè)緩存中,寫(xiě)入的數(shù)據(jù)在LCD上不被顯示,;如果顯示頁(yè)為第0頁(yè),,操作頁(yè)為第0頁(yè),此時(shí) LCD顯示的是第0頁(yè)的緩存的數(shù)據(jù),,此時(shí)把數(shù)據(jù)寫(xiě)入到第0頁(yè)緩存中,,寫(xiě)入的數(shù)據(jù)可以在LCD上實(shí)時(shí)的顯示出來(lái)。程序依據(jù)圖3中對(duì)坐標(biāo)軸設(shè)計(jì)方法和LCD區(qū) 域劃分手段判斷點(diǎn)G在新坐標(biāo)系O'中坐標(biāo)值,。在程序中一定要注意每寫(xiě)兩個(gè)字節(jié)顯示數(shù)據(jù)列地址(列坐標(biāo))自動(dòng)加1,。為此設(shè)計(jì)如下函數(shù):
這個(gè)函數(shù)功能比較多樣化,是用新坐標(biāo)系O'來(lái)確認(rèn)點(diǎn)G的坐標(biāo),。執(zhí)行函數(shù)draw_point(0,,0,511,255,,8,,9,0xf8,,0x07)結(jié)果 為,,當(dāng)前顯示第0頁(yè),點(diǎn)為紅色且被置到第0頁(yè),。新坐標(biāo)O'在原坐標(biāo)O的(511,,255)處,點(diǎn)G在坐標(biāo)系O'的位置為(8,,9),,也就是被置到圖3中的 F區(qū);如果執(zhí)行函數(shù)draw_point(0,,0,,0,0,,,、520,364,,0xf8,,0x07),那么此點(diǎn)和上一個(gè)點(diǎn)將重合,,此時(shí)坐標(biāo)系O’和原坐標(biāo) O重合,。
函數(shù)display_word功能:把字體寫(xiě)入到控制器緩沖區(qū)指定位置中,并控制字體是否顯示,。函數(shù)參數(shù)意義:
word:顯示字體字庫(kù)的首地址,;
word_line,word_row:字庫(kù)行數(shù)和列數(shù)(列數(shù)等于字模的列數(shù)/8),;
word1,,word2:字體顯示的顏色的16進(jìn)制表示,;
backdrop1,,backdrop2:字體和背景的顏色其他參數(shù)含義同clear_region。函數(shù)原型和參數(shù)如下:
2.3 其他主要函數(shù)編寫(xiě)說(shuō)明
清屏程序:可以通過(guò)draw_point函數(shù)編寫(xiě)得到,,建議清屏函數(shù)具有清理任何緩存頁(yè)中的數(shù)據(jù)并控制數(shù)據(jù)顯示的功能,。如函數(shù)及參數(shù)列表如下:
void clear_region(char word_which_display,char
word_which_write,,int word_x,,int word_y,
unsigned int word_row,unsigned int
word_line,,unsigned char with_color)
在 這個(gè)函數(shù)中,,參數(shù)word_row:清理的矩形區(qū)域距離word_x的長(zhǎng)度;參數(shù)word_line:清理的矩形區(qū)域距離word_y的長(zhǎng)度,;參數(shù) with color:清理區(qū)域的顏色,。此函數(shù)所清理的是矩形區(qū)域。函數(shù)改寫(xiě)可以采用連續(xù)置點(diǎn)的方法,,通過(guò)draw_piont函數(shù)連續(xù)的向清屏區(qū)域內(nèi)置入一定顏色 的點(diǎn),。由于篇幅所限,本文不給出程序清單,。
畫(huà)線程序:把LCD上任意兩點(diǎn)連接成直線,。設(shè)LCD上兩點(diǎn)坐標(biāo)M(x1,y1)和N(x2,,y2),,得斜率由于x方向地增量△x=1,則△y=k,。通過(guò)循環(huán)置點(diǎn)就可以得到直線,。
本文所用的函數(shù)如下:
void draw_line(char word_which_display,char word_which_write,,unsigned int x1,,unsigned int y1,int x2,,int y2,,char colour)
參數(shù)功能:x1,y1:LCD上任意一點(diǎn)M的坐標(biāo)
x2,,y2:LCD上任意一點(diǎn)N的坐標(biāo)
colour:連線的顏色
同種LCD驅(qū)動(dòng)器可應(yīng)用在不同的MCU上,,如果采用I/O模擬時(shí)序的方法,需改動(dòng)管腳設(shè)置并注意讀寫(xiě)的時(shí)間要求,。如本文的程序在8051單片機(jī)上運(yùn)行時(shí)候 基本程序中的不需要加延時(shí),,在C8051F單片機(jī)(晶振48MHz)上需要加延時(shí)。另外MCU和LCD驅(qū)動(dòng)器必須共地處理,,否則可能會(huì)產(chǎn)生不必要的干擾,。
對(duì)驅(qū)動(dòng)器的控制還可以采用直接訪問(wèn)外部存儲(chǔ)器的方法,這個(gè)時(shí)候相當(dāng)于向固定的寄存器寫(xiě)數(shù)據(jù)和控制字,,接口程序如下:
如果向外部存儲(chǔ)器寫(xiě)數(shù)據(jù),,采用dlcd=0x04的形式,它的含義是把數(shù)0x04存儲(chǔ)到外部地址為0x0000中,。使用此方法要注意MCU的EMIF的接 口讀寫(xiě)時(shí)序,。有一些控制器的功能更豐富一些,,如clcd1=0x81,驅(qū)動(dòng)器會(huì)執(zhí)行0x81所代表的功能,。本文使用的是C8051F340單片機(jī),,這款單 片機(jī)有自帶的EMIF接口,在使用之前需要對(duì)其進(jìn)行配置:
P1SKIP=0x80,;//跳過(guò)WR和RD引腳
XBR1=0x41,;//Enable crossbar and enable
//EMIF工作在地址/數(shù)據(jù)復(fù)用方式
//只用外部存儲(chǔ)器
//ALE高和ALE低脈沖寬度=4個(gè)SYSCLK周期EMI0CF=0x0c;
//地址建立時(shí)間=0個(gè)SYSCLK周期,。
///WR和/RD脈沖寬度=2個(gè)SYSCLK周期,。
//地址保持時(shí)間=1個(gè)SYSCLK周期
EMI0TC=0X05;
3 使用舉例及顯示效果
如圖4是使用本文程序設(shè)計(jì)的飛機(jī)操縱性能檢測(cè)評(píng)估儀操作使用界面,,界面中左邊的箭頭可以通過(guò)按鍵控制下上下移動(dòng),,并進(jìn)入到相應(yīng)的操作界面。
首先要了解,,LCD顯示圖像的實(shí)質(zhì)是在屏幕上置入一定顏色的點(diǎn),,曲線y=f(x)也基于這個(gè)原理產(chǎn)生,當(dāng)x軸連續(xù)時(shí)且函數(shù)值y幅度很小的時(shí)候在LCD上顯 示的圖形是連續(xù)的,,當(dāng)幅度很大時(shí)會(huì)產(chǎn)生幅度離散的圖形,,如果可以把兩個(gè)離散的點(diǎn)用一條線連上,那么離散圖形可以變得連續(xù),,圖4中有正弦函數(shù)顯示的事例,。程 序?qū)嵗缦拢?br />
for(i=0;i<640,;i++)
{y1=200*sin(0.05*i),;y2=200*sin(0.05*(i+1));
draw_line(0,,0,,0,240,,y1,,y1-y2,i,,’g’),;}
4 結(jié)束語(yǔ)
上述控制程序是當(dāng)今通用的使用方法??刂乞?qū)動(dòng)器的函數(shù)如顯示字體,、清屏幕和置點(diǎn)等都要人為編寫(xiě),,但這更有助于對(duì)LCD顯示的過(guò)程的理解?,F(xiàn)如今市場(chǎng)上 LCD驅(qū)動(dòng)器的品種多,且有很大一部分控制起來(lái)要優(yōu)于本文所使用的驅(qū)動(dòng)器,本文的目的旨在給予大家一種通用有效的方法,,希望在以后遇到LCD驅(qū)動(dòng)器的時(shí)候 能快速入門(mén),,縮短開(kāi)發(fā)周期,節(jié)約成本,。本文中所有列舉出來(lái)的函數(shù)都經(jīng)過(guò)C8051F340單片機(jī)的測(cè)試和偉福的硬件仿真,。