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