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