下面先看一下我從別人那轉(zhuǎn)過來的一篇文章,我覺得很有用,看完之后我再說一下自己對(duì)這一塊的了解,也可以先看看我的理解(下面紅字標(biāo)出)再看開始的這篇文章,因?yàn)槲艺f的更通俗,O(∩_∩)O哈哈~。
本文引用地址:
http://www.ex-cimer.com/article/201611/319293.htm1. LCD工作的硬件需求:
要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動(dòng)器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動(dòng)器會(huì)以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實(shí)現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S 3C2410/2440等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動(dòng)器所需要的控制信號(hào)來控制STN/TFT屏了。
2. S3C2440內(nèi)部LCD控制器結(jié)構(gòu)圖:
我們根據(jù)數(shù)據(jù)手冊(cè)來描述一下這個(gè)集成在S3C2440內(nèi)部的LCD控制器:
a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
b:REGBANK由17個(gè)可編程的寄存器組和一塊256*16的調(diào)色板內(nèi)存組成,它們用來配置LCD控制器的;
c:LCDCDMA是一個(gè)專用的DMA,它能自動(dòng)地把在偵內(nèi)存中的視頻數(shù)據(jù)傳送到LCD驅(qū)動(dòng)器,通過使用這個(gè)DMA通道,視頻數(shù)據(jù)在不需要CPU的干預(yù)的情況下顯示在LCD屏上;
d:VIDPRCS接收來自LCDCDMA的數(shù)據(jù),將數(shù)據(jù)轉(zhuǎn)換為合適的數(shù)據(jù)格式,比如說4/8位單掃,4位雙掃顯示模式,然后通過數(shù)據(jù)端口VD[23:0]傳送視頻數(shù)據(jù)到LCD驅(qū)動(dòng)器;
e:TIMEGEN由可編程的邏輯組成,他生成LCD驅(qū)動(dòng)器需要的控制信號(hào),比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號(hào)又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過不同的配置,TIMEGEN就能產(chǎn)生這些信號(hào)的不同形態(tài),從而支持不同的LCD驅(qū)動(dòng)器(即不同的STN/TFT屏)。
3. 常見TFT屏工作時(shí)序分析:
LCD提供的外部接口信號(hào):
VSYNC/VFRAME/STV:垂直同步信號(hào)(TFT)/幀同步信號(hào)(STN)/SEC TFT信號(hào); HSYNC/VLINE/CPV:水平同步信號(hào)(TFT)/行同步脈沖信號(hào)(STN)/SEC TFT信號(hào); VCLK/LCD_HCLK:象素時(shí)鐘信號(hào)(TFT/STN)/SEC TFT信號(hào); VD[23:0]:LCD像素?cái)?shù)據(jù)輸出端口(TFT/STN/SEC TFT); VDEN/VM/TP:數(shù)據(jù)使能信號(hào)(TFT)/LCD驅(qū)動(dòng)交流偏置信號(hào)(STN)/SEC TFT 信號(hào); LEND/STH:行結(jié)束信號(hào)(TFT)/SEC TFT信號(hào); LCD_LPCOE:SEC TFT OE信號(hào); LCD_LPCREV:SEC TFT REV信號(hào); LCD_LPCREVB:SEC TFT REVB信號(hào)。 |
所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說吧,一副圖像可以看做是一個(gè)矩形,由很多排列整齊的點(diǎn)一行一行組成,這些點(diǎn)稱之為像素。那么這幅圖在LCD上的顯示原理就是:
A:顯示指針從矩形左上角的第一行第一個(gè)點(diǎn)開始,一個(gè)點(diǎn)一個(gè)點(diǎn)的在LCD上顯示,在上面的時(shí)序圖上用時(shí)間線表示就為VCLK,我們稱之為像素時(shí)鐘信號(hào); B:當(dāng)顯示指針一直顯示到矩形的右邊就結(jié)束這一行,那么這一行的動(dòng)作在上面的時(shí)序圖中就稱之為1 Line; C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時(shí)間的,我們稱之為行切換; D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時(shí)間線上看,就是時(shí)序圖上的HSYNC; E:然而,LCD的顯示并不是對(duì)一副圖像快速的顯示一下,為了持續(xù)和穩(wěn)定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目的只是為了將圖像持續(xù)的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時(shí)序圖上就表示為1 Frame,因此從時(shí)序圖上可以看出1 Line只是1 Frame中的一行; F:同樣的,在幀與幀切換之間也是需要一定的時(shí)間的,我們稱之為幀切換,那么LCD整個(gè)顯示的過程在時(shí)間線上看,就可表示為時(shí)序圖上的VSYNC。 |
上面時(shí)序圖上各時(shí)鐘延時(shí)參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會(huì)提供相應(yīng)的數(shù)據(jù)手冊(cè))
VBPD(vertical back porch):表示在一幀圖像開始時(shí),垂直同步信號(hào)以后的無效的行數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的upper_margin; VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號(hào)以前的無效的行數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的lower_margin; VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計(jì)算,對(duì)應(yīng)驅(qū)動(dòng)中的vsync_len; HBPD(horizontal back porch):表示從水平同步信號(hào)開始到一行的有效數(shù)據(jù)開始之間的VCLK的個(gè)數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的left_margin; HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個(gè)水平同步信號(hào)開始之間的VCLK的個(gè)數(shù),對(duì)應(yīng)驅(qū)動(dòng)中的right_margin; HSPW(horizontal sync pulse width):表示水平同步信號(hào)的寬度,用VCLK計(jì)算,對(duì)應(yīng)驅(qū)動(dòng)中的hsync_len; |
對(duì)于以上這些參數(shù)的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對(duì)寄存器的操作請(qǐng)查看S3c2440數(shù)據(jù)手冊(cè)LCD部分)
LCDCON1:17- 8位CLKVAL 6- 5位掃描模式(對(duì)于STN屏:4位單/雙掃、8位單掃) 4- 1位色位模式(1BPP、8BPP、16BPP等) LCDCON2:31 - 24位VBPD 23 - 14位LINEVAL 13 - 6位VFPD 5 - 0位VSPW LCDCON3:25 - 19位HBPD 18 - 8位HOZVAL 7 - 0位HFPD LCDCON4: 7 - 0位HSPW LCDCON5: |
4. 幀緩沖(FrameBuffer):
幀緩沖是Linux為顯示設(shè)備提供的一個(gè)接口,它把一些顯示設(shè)備描述成一個(gè)緩沖區(qū),允許應(yīng)用程序通過 FrameBuffer定義好的接口訪問這些圖形設(shè)備,從而不用去關(guān)心具體的硬件細(xì)節(jié)。對(duì)于幀緩沖設(shè)備而言,只要在顯示緩沖區(qū)與顯示點(diǎn)對(duì)應(yīng)的區(qū)域?qū)懭腩伾?,?duì)應(yīng)的顏色就會(huì)自動(dòng)的在屏幕上顯示。下面來看一下在不同色位模式下緩沖區(qū)與顯示點(diǎn)的對(duì)應(yīng)關(guān)系:
我相信看完這些以后大家會(huì)對(duì)這一塊有稍一些了解了,下面是我自己的理解:
LCD是在我們學(xué)習(xí)ARM9時(shí)覺得比較麻煩的一塊,因?yàn)閯偨佑|的時(shí)候一眼望去覺得內(nèi)容可是不少,不知道從哪里下手,呵呵,其實(shí)我們慢慢來分析就會(huì)逐漸明朗起來。
首先說一下我們平時(shí)所說的多少位的LCD,有24位的,有16位的指的是LCD數(shù)據(jù)的位數(shù),LCD的數(shù)據(jù)實(shí)際上是LCD要顯示的顏色,24位的是紅綠藍(lán)各占8位,16位則是紅綠藍(lán)按照565分配的,其實(shí)24的也可以只接16位,每個(gè)顏色地位接地就可以,所以要給LCD的緩沖區(qū)一個(gè)數(shù)據(jù)才能在LCD上顯示出來。那究竟是怎么顯示的呢,那就得先說一下像素了,LCD的像素實(shí)際上就LCD屏幕有多少個(gè)點(diǎn),LCD顯示的東西都是一個(gè)一個(gè)點(diǎn)拼湊出來的,比如我用的是320*240的LCD,就是說LCD每一行有320個(gè)點(diǎn),而每一列有240個(gè)點(diǎn),所以總共有320*240個(gè)點(diǎn),我們讓適當(dāng)?shù)狞c(diǎn)顯示適當(dāng)?shù)念伾瓦_(dá)到了我們的目的。
其實(shí)剛開始困擾我們的是LCD的初始化的問題,要設(shè)置的東西比較多,其實(shí)我們是記不住這些東西的,呵呵,作為入門我們可以參考別人的初始化程序,把里面的參數(shù)改成我們自己的LCD的參數(shù)就OK了。
那么我們到底是怎么把我們要顯示的數(shù)據(jù)送給LCD控制起的呢?是這樣的,我們可以定義一個(gè)二維數(shù)組,把我們要顯示的數(shù)據(jù)存到里面,然后把這個(gè)數(shù)組的地址賦給LCD的相應(yīng)的寄存器,這個(gè)寄存器是LCDSADDRn,具體的設(shè)置大家可以參考數(shù)據(jù)手冊(cè),我們可以把二維數(shù)組的坐標(biāo)和LCD的坐標(biāo)對(duì)應(yīng)起來,那么我們就可以隨意的讓哪一個(gè)像素點(diǎn)顯示什么顏色就顯示什么顏色了。這就把數(shù)據(jù)送出的過程,也就是顯示一個(gè)像素點(diǎn)的過程。
到現(xiàn)在我們已經(jīng)知道如何顯示一個(gè)像素了,那接下來就是LCD顯示最基本的東西了----字符和圖片。漢字和圖片的顯示都是基于像素點(diǎn)的顯示的,我們把要顯示的字符和圖片轉(zhuǎn)化成相應(yīng)的數(shù)據(jù),然后傳遞給LCD即可。我們可以專門的寫一個(gè)顯示字符的函數(shù)和一個(gè)顯示圖片的函數(shù)。顯示字符的數(shù)據(jù)可以用取模軟件生成,因?yàn)樯傻淖址麛?shù)據(jù)是表示的每一個(gè)點(diǎn)要不要亮,亮的地方用1表示,不亮的地方用0表示,所以如果用LCD顯示,我們還要告訴LCD顯示什么顏色,這才是LCD需要的數(shù)據(jù),比如說16*16的數(shù)據(jù),有16行16列,我們將一行的數(shù)據(jù),也就是16位數(shù)據(jù)的每一位都取出來,為1的地方,我們就給LCD一個(gè)16位的數(shù)據(jù),為0的地方就不給數(shù)據(jù),這樣就能顯示了,取模生成的數(shù)據(jù)都是按行來的。圖片的顯示直接就將16位的數(shù)據(jù)傳遞給LCD,這個(gè)圖片數(shù)據(jù)的產(chǎn)生,我們可以用軟件LCD彩色圖片轉(zhuǎn)換工具(BMP_to_H)生成C語(yǔ)言文件,我們只需對(duì)文件進(jìn)行簡(jiǎn)單的修改就能加入到我們的程序中,修改方法在軟件的說明中都有。
以上這些都是我自己的理解,話雖然不多,但這些都是我剛開始學(xué)的時(shí)候困擾我的地方,我相信看了這些對(duì)你理解LCD到底是怎樣顯示的會(huì)有一定的幫助,說的不對(duì)的地方,請(qǐng)大家及時(shí)幫我改正,呵呵。
下一篇文章中我將結(jié)合具體的代碼分析一下LCD的操作過程。
評(píng)論