ARM的LCD 的驅(qū)動控制實驗
一、 實驗目的
1.了解LCD 基本概念與原理。
2.理解LCD 的驅(qū)動控制。
3.熟悉用總線方式驅(qū)動LCD 模塊。
4.熟悉用ARM 內(nèi)置的LCD 控制器驅(qū)動LCD。
二、 實驗內(nèi)容
學習LCD 顯示器的基本原理,理解其驅(qū)動控制方法。掌握兩種LCD 驅(qū)動方式的基本
原理和方法。并用編程實現(xiàn)。
1.用總線方式直接驅(qū)動帶有驅(qū)動模塊的LCD。
2.用ARM 內(nèi)置的LCD 控制器來驅(qū)動LCD。
三、 預備知識
1.用ARM SDT 2.5 集成開發(fā)環(huán)境,編寫和調(diào)試程序的基本過程。
2.ARM 應用程序的框架結(jié)構(gòu)。
3.會使用Source Insight 3 編輯C 語言源程序。
四、 實驗設備及工具
硬件:ARM 嵌入式開發(fā)板、用于ARM7TDMI 的JTAG 仿真器、PC 機Pentumn100 以
上
軟件:PC 機操作系統(tǒng)win98、ARM SDT 2.51 集成開發(fā)環(huán)境、仿真器驅(qū)動程序、Source
Insight 3.0
五、 實驗原理及說明
1.LCD(Liquid Crystal Display)原理
液晶得名于其物理特性:它的分子晶體,不過以液態(tài)存在而非固態(tài)。這些晶體分子的液
體特性使得它具有兩種非常有用的特點:1、如果讓電流通過液晶層,這些分子將會以電流
的流向方向進行排列,如果沒有電流,它們將會彼此平行排列。2、如果提供了帶有細小溝
槽的外層,將液晶倒入后,液晶分子會順著槽排列,并且內(nèi)層與外層以同樣的方式進行排列。
液晶的第三個特性是很神奇的:液晶層能夠使光線發(fā)生扭轉(zhuǎn)。液晶層表現(xiàn)的有些類似偏光器,
這就意味著它能夠過濾掉除了那些從特殊方向射入之外的所有光線。此外,如果液晶層發(fā)生
了扭轉(zhuǎn),光線將會隨之扭轉(zhuǎn),以不同的方向從另外一個面中射出。
液晶的這些特點使得它可以被用來當作一種開關——即可以阻礙光線,也可以允許光線
通過。液晶單元的底層是由細小的脊構(gòu)成的,這些脊的作用是讓分子呈平行排列。上表面也
是如此,在這兩側(cè)之間的分子平行排列,不過當上下兩個表面之間呈一定的角度時,液晶成
了隨著兩個不同方向的表面進行排列,就會發(fā)生扭曲。結(jié)果便是這個扭曲了的螺旋層使通過
的光線也發(fā)生扭曲。如果電流通過液晶,所有的分子將會按照電流的方向進行排列,這樣就
會消除光線的扭轉(zhuǎn)。如果將一個偏振濾光器放置在液晶層的上表面,扭轉(zhuǎn)的光線通過了(如
圖A),而沒有發(fā)生扭轉(zhuǎn)的光線(如圖B)將被阻礙。因此可以通過電流的通斷改變LCD 中的
液晶排列,使光線在加電時射出,而不加電時被阻斷。也有某些設計了省電的需要,有電流
時,光線不能通過,沒有電流時,光線通過。
圖7-1 光線穿過與陰斷示意圖
LCD 顯示器的基本原理就是通過給不同的液晶單元供電,控制其光線的通過與否,從而達
到顯示的目的。因此,LCD 的驅(qū)動控制歸于對每個液晶單元的通斷電的控制,每個液晶單
元都對應著一個電極,對其通電,便可使用光線通過(也有剛好相反的,即不通電時光線通
過,通電時光線不通過)。
2.電致發(fā)光
LCD 的發(fā)光原理是通過控制加電與否來使光線通過或擋住,從而顯示圖形。光源的提
供方式有兩種:透射式和反射式。筆記本電腦的LCD 顯示屏即為透射式,屏后面有一個光
源,因此外界環(huán)境可以不需要光源。而一般微控制器上使用的LCD 為反射式,需要外界提
供光源,靠反射光來工作。電致發(fā)光(EL)是液晶屏提供光源的一種方式。電致發(fā)光的特
點是低功耗,與二極管發(fā)光比較而言體積小。
電致發(fā)光(EL)是將電能直接轉(zhuǎn)換為光能的一種發(fā)光現(xiàn)象。電致發(fā)光片是利用此原理
經(jīng)過加工制作而成的一種發(fā)光薄片,如圖7-2 所示。其特點是:超薄、高亮度、高效率、低
功耗、低熱量、可彎曲、抗沖擊、長壽命、多種顏色選擇等。因此,電致發(fā)光片被廣泛應用
于各種領域。
圖7-2 電致發(fā)光片的基本結(jié)構(gòu)
3.LCD 的驅(qū)動控制
市面上出售的LCD 有兩種類型:
一種是帶有驅(qū)動電路的LCD 顯示模塊,這種LCD 可以方便地與各種低檔單片機進行接
口,如8051 系列單片機,但是由于硬件驅(qū)動電路的存在,體積比較大。這種模塊常常使用
總線方式來驅(qū)動。
另一種則僅是LCD 顯示屏,沒有驅(qū)動電路,需要與驅(qū)動電路配合使用。特點是體積小,
但是卻需要另外的驅(qū)動芯片。也可以使用帶有LCD 驅(qū)動能力的高檔MCU 驅(qū)動,如ARM 系
列的S3C44B0X。
圖7-3 不帶驅(qū)動電路的LCD 結(jié)構(gòu)
⑴ 總線驅(qū)動方式
一般帶有驅(qū)動模塊的LCD顯示屏使用這種驅(qū)動方式,由于LCD已經(jīng)帶有驅(qū)動硬件電路,
因此模塊給出的是總線接口,便于與單片機的總線進行接口。驅(qū)動模塊具有八位數(shù)據(jù)總線,
外加一些電源接口和控制信號。而且還自帶顯示緩存,只需要將要顯示的內(nèi)容送到顯示緩存
中就可以實現(xiàn)內(nèi)容的顯示。由于只有八條數(shù)據(jù)線,因此常常通過引腳信號來實現(xiàn)地址與數(shù)據(jù)
線復用,以達到把相應數(shù)據(jù)送到相應顯示緩存的目的。下圖為一個典型的顯示模塊(HY-
12864B)提供的總線接口。
圖7-4 曲型帶驅(qū)動液晶模塊的總線接口
⑵ 控制器掃描方式
S3C44B0X 中具有內(nèi)置的LCD 控制器,它具有將顯示緩存(在系統(tǒng)存儲器中)中的LCD
圖象數(shù)據(jù)傳輸?shù)酵獠縇CD 驅(qū)動電路的邏輯功能。
S3C44B0X 中內(nèi)置的LCD 控制器可支持灰度LCD 和彩色LCD。在灰度LCD 上,使用
基于時間的抖動算法(time-based dithering algorithm)和FRC (Frame Rate Control)方法,可
以支持單色、4 級灰度和16 級灰度模式的灰度LCD, 在彩色LCD 上,可以支持256 級彩
色。對于不同尺寸的LCD,其具有不同數(shù)量的垂直和水平象素、數(shù)據(jù)接口的數(shù)據(jù)寬度、接
口時間及刷新率,而LCD 控制器可以進行編程控制相應的寄存器值,以適應不同的LCD 顯
示板。
內(nèi)置的LCD 控制器提供了下列外部接口信號:
VFRAME: LCD 控制器和LCD 驅(qū)動器之間的幀同步信號。它通知LCD 屏新的一幀的顯
示,LCD 控制器在一個完整幀的顯示后發(fā)出VFRAME 信號。
VLINE: LCD 控制器和LCD 驅(qū)動器間的同步脈沖信號,LCD 驅(qū)動器通過它來將水平移
位寄存器中的內(nèi)容顯示到LCD 屏上。LCD 控制器在一整行數(shù)據(jù)全部傳輸?shù)絃CD 驅(qū)動器后
發(fā)出VLINE 信號。
VCLK: 此信號為LCD 控制器和LCD 驅(qū)動器之間的象素時鐘信號,LCD 控制器在VCLK
的上升沿發(fā)送數(shù)據(jù),LCD 驅(qū)動器在VCLK 的下降沿采樣數(shù)據(jù)。
VM: LCD 驅(qū)動器所使用的交流信號。LCD 驅(qū)動器使用VM 信號改變用于打開或關閉象
素的行和列電壓的極性。VM 信號在每一幀觸發(fā),也在編程決定數(shù)量的VLINE 信號觸發(fā)。
VD[3:0]:LCD 象素數(shù)據(jù)輸出端口。
VD[7:4]:LCD 象素數(shù)據(jù)輸出端口。
圖7-5 LCD 控制器邏輯框圖
圖7-5 為S3C44B0X 中內(nèi)置的LCD 控制器的邏輯框圖,它用于傳輸顯示數(shù)據(jù)并產(chǎn)生必
要的控制信號,如VFRAME, VLINE, VCLK, 和VM。除了控制信號,還有顯示數(shù)據(jù)的數(shù)據(jù)
端口VD[7:0]。LCD 控制器包含REGBANK, LCDCDMA, VIDPRCS, 和TIMEGEN。
REGBANK 具有18 個可編程寄存器,用于配置LCD 控制器。LCDCDMA 為專用DMA,它
可以自動地將顯示數(shù)據(jù)從幀內(nèi)存中傳送到LCD 驅(qū)動器中。通過專用DMA,可以實驗在不
需要CPU 介入的情況下顯示數(shù)據(jù)。VIDPRCS 從LCDCDMA 接收數(shù)據(jù),將相應格式(比如
4/8 位單一掃描和4 位雙掃描顯示模式)的數(shù)據(jù)通TIMEGEN 包含可編程的邏輯,以支持
常見的LCD 驅(qū)動器所需要的不同接口時間和速率的要求。TIMEGEN 部分產(chǎn)生VFRAME,
VLINE, VCLK, VM 等信號。
⑶ 與LCD 有關的函數(shù):
void LCD_Cls(); //文本模式下清除屏幕
void LCD_ChangeMode(U8 mode); //在圖形模式和字符模式下切換
void LCD_Refresh(); //圖形刷新顯示
void LCD_Init(); //初始化LCD 控制寄存器
void LCD_printf(const char *format,...); //輸入格式化字符到LCD
void LCD_txtRefresh(); //字符顯示刷新
void LCDBkLight(U8 isOpen); //打開/關閉LCD 背光
void LCDDisplayOpen(U8 isOpen); //打開/關閉LCD 顯示
六、 實驗步驟
1.不帶操作系統(tǒng)的LCD 驅(qū)動控制實驗
在對LCD 進行控制的時候,將顯示一級緩存的地址設為0xc000000,一級緩存每4 位(16 級灰度的屏)對應LCD 的一個象素。
U32* pLCDBuffer16=(U32*)0xc000000;
再設置一個行列與LCD 高寬相對應的的數(shù)組,每一個元素對應LCD 顯示屏上的一個象
素點,數(shù)組元素為32 位,分成四個八位,前三個八位分別代表三種顏色的,第四個八位暫
不用,這樣可以兼容32 位彩色顯示屏。
U32 LCDBuffer[LCDHEIGHT][LCDWIDTH];
ASCII 碼的碼元信息,共有128 行,每行12 列,ASCII 碼為6X12(寬X 高),每行代
表一個ASCII 碼字符的字模信息。12 列分別對應高度分辨率的12 行中的一行。
U8 LCDTxtData[128][12];
在不帶操作系統(tǒng)環(huán)境下進行LCD 驅(qū)動控制時,工作分兩步進行,第一次是對ARM 中與
LCD 有關的諸寄存器進行設置,相應的設置內(nèi)容在LCD_Init()函數(shù)中,下面對其代碼作如下
說明。
U32 LCDBASEU,LCDBASEL,LCDBANK;
首先關閉LCD,等完成對顯示寄存器的設置后,再打開LCD 顯示。
LCDDisplayOpen(FALSE);
接下來對一級顯存的每個單元置零,清除屏幕顯示。由于pLCDBuffer16 被定義為U32,
即為32 位(8 個4 位)指針,所以應當循環(huán)40*240 次,實際上對應的單元數(shù)為整個320X240
的屏幕范圍。
for(i=0;i<40*240;i++)
*(pLCDBuffer16+i)=0x0;
/////////////初始化LCD 端口/////////////
LCD 驅(qū)動控制端口與ARM 的端口四是共用的,因此,要設置相應的寄存器,將其定義
為功能端口,即LCD 驅(qū)動控制端口。
rPDATD= 0xff;
rPCOND= 0xaaaa; //configure the portD as
VD0,VD1,VD2,VD3,VCLK,VLINK,VM,VFRAME...ect. LCD function
rPUPD = 0x0;//enable pull up resistor
/////////////////////////////////////
LCD 共有三個控制寄存器,分別控制與LCD 掃描寬度等硬件時序有關的量。rLCDCON1
和rLCDCON2 為LCD 控制寄存器。
rLCDCON1=(0);//|(1<<5)|(0x3<<8)|(0x3<<10)|(CLKVAL<<12);//先將此控制字設為零。
設置LCD 的垂直尺寸為240,水平尺寸為3200,水平線掃描空閑時間為10MCLK。
rLCDCON2=(240-1)|(79<<10)|(10<<21);
LCDBANK=0xc000000>>22;//((U32)LCDBuffer16)>>22;
LCDBASEU=0x0;//((U32)LCDBuffer16)&0x3fffff;
LCDBASEL=LCDBASEU+(80)*240;
rLCDSADDR1~3 為幀緩沖起始地址。
rLCDSADDR1= (0x2<<27) |(LCDBANK<<21)|LCDBASEU;//|
((((U32)LCDBuffer16)>>1)&0x7ffffff); // 16-gray, LCDBANK, LCDBASEU
rLCDSADDR2= (0<<29)|(0<<21)|LCDBASEL;
rLCDSADDR3= (320/4) | ( 0<<9 );
以下重新設置控制寄存器1 的值。
rLCDCON1=LCDCON1_ENVID|(1<<5)|(0x0<<8)|(0x3<<10)|(CLKVAL<<12);//|LCDCON1
Delay(5000);//延時5 秒
最后打開LCD 的背光,并打開LCD 顯示。
LCDBkLight(TRUE);
LCDDisplayOpen(TRUE);
進入完上述初始化操作以后,便可以通過往二級顯存中寫數(shù)據(jù),并調(diào)用LCD_REFRESH
函數(shù)將其刷新到一級顯存,顯示在LCD 屏上,以此為基礎可以構(gòu)造出復雜的圖形有關函數(shù)。
1)使用ARM 驅(qū)動控制方式,編程顯示液晶的16 級灰度。
在ARM SDT 2.5 中,打開一個新的工程,在主函數(shù)中加入下列代碼。
void Main(void)
{
Port_Init(); //端口初始化
LCD_Init(); //LCD 初始化
LCD_ChangeMode(DspGraMode);//LCD 切換到圖形模式
LCD_Show16Level(0xf); //顯示16 級灰度
Delay(15000); //暫停數(shù)秒
LCD_ShowMove(); //灰階圖形開始向右移動
LCD_Show16Level(0x8); //再次顯示16 級灰度
while(1) ; //死循環(huán)等待
}
LCD_ShowMove()和LCD_Show16Level(0x8)的源代碼及注釋詳見源程序文件。
編譯并將此工程對應的SYSTEM.BIN 文件下載到嵌入式開發(fā)板中,重新啟動后運行即
可顯示LCD 的16 級灰度及移動的灰度圖形。
2)ASCII 字符的顯示
使用LCD_printf()可以輸出格式化字符。這里主要介紹如何將字符顯示到LCD 上。
LCD_printf 函數(shù)中使用到的LCD_TxtRefresh 體現(xiàn)了顯示LCD 是如何刷新的。
字符使用單獨的緩沖區(qū)U8 LCDTxtBuffer[LCDRow][LCDColumn];
void LCD_TxtRefresh(int LCDCurrentDspTxt)
{
int i,j,k,showrow;
unsigned int data;
U8 txtdata;
for(j=0;j<LCDHEIGHT;j++){//在整個LCD 高度范圍內(nèi)
for(i=0;i<LCDColumn;i++){//在LCD 列范圍內(nèi)
data=0;
showrow=LCDCurrentDspTxt+j/LCDTxtMode_TxtHeight;//如果單獨調(diào)用此函
數(shù),一般LCDCurrentDspTxt=0,則j/LCDTxtMode_TxtHeight 為當前所在行。
if(showrow>LCDRow-1)//如果超出行范圍,則重新指向最頂行
showrow-=LCDRow;
txtdata=LCDTxtBuffer[showrow][i];//提取字符緩存中的當前行的第i 列
if(txtdata>128)//如果超出ASCII 碼的范圍,則置為空格
txtdata=' ';
txtdata=LCDTxtData[txtdata][j%LCDTxtMode_TxtHeight];//從字模表中提取相
應ASCII 字符的第j 行字模
for(k=7;k>=0;k--){//對字符進行移位處理
data<<=4;
data|=((txtdata>>k)&0x1)*0xf;
}
*(pLCDBuffer16+i+j*40)=data;//將最后結(jié)果送一級顯存顯示
}
}
}
理解了上述程序過程后,可以對顯示緩存的某個單元設置值,然后調(diào)用此函數(shù)進行刷新
顯示。
比如,在主函數(shù)中加入下列語句:
LCDTxtData[5][5]=’a’;
LCD_TxtRefresh(0);
即可實現(xiàn)在第五行第五列的地方顯示字母a。
2.帶操作系統(tǒng)的LCD 驅(qū)動控制實驗
帶有操作系統(tǒng)時,可以將LCD 顯示部分放到一個單獨的任務中,同時操作系統(tǒng)可以響
應鍵盤輸入,可以以鍵盤輸入的內(nèi)容來作為控制LCD 顯示的依據(jù)。
void LCD_Show_Task(void *Id)
{
LCD_Init(); //LCD 初始化
LCD_ChangeMode(DspGraMode);
while(1)
{
OSTimeDly(1000); //操作系統(tǒng)延時,使低優(yōu)先級任務有機會執(zhí)行
if(ShowNext)
{
LCD_Show16Level(0xf); //顯示16 級灰度
}
else LCD_ShowMove(); //灰階圖形開始向右移動
}
}
鍵盤任務可以響應ARM 開發(fā)板鍵盤輸入,每按一次鍵盤上的任意鍵,鍵盤響應任務即
改變一次ShowNext 變量的值,因此可以實現(xiàn)交替顯示16 級灰度和顯示移動的灰階圖形(按
任意鍵切換)。
七、 思考題
1.液晶顯示的基本原理是什么?
2.總線方式驅(qū)動液晶模塊和使用控制器進行驅(qū)動控制有什么異同?
3.LCD 顯示圖形、ASCII 字符與漢字的基本思想是什么?
評論
查看更多