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