下面先看一下我從別人那轉過(guò)來(lái)的一篇文章,我覺(jué)得很有用,看完之后我再說(shuō)一下自己對這一塊的了解,也可以先看看我的理解(下面紅字標出)再看開(kāi)始的這篇文章,因為我說(shuō)的更通俗,O(∩_∩)O哈哈~。
本文引用地址:
http://dyxdggzs.com/article/201611/319293.htm1. LCD工作的硬件需求:
要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅動(dòng)器,而且還需要相應的LCD控制器。在通常情況下,生產(chǎn)廠(chǎng)商把LCD驅動(dòng)器會(huì )以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來(lái)實(shí)現,現在很多的MCU內部都集成了LCD控制器,如S 3C2410/2440等。通過(guò)LCD控制器就可以產(chǎn)生LCD驅動(dòng)器所需要的控制信號來(lái)控制STN/TFT屏了。
2. S3C2440內部LCD控制器結構圖:

我們根據數據手冊來(lái)描述一下這個(gè)集成在S3C2440內部的LCD控制器:
a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
b:REGBANK由17個(gè)可編程的寄存器組和一塊256*16的調色板內存組成,它們用來(lái)配置LCD控制器的;
c:LCDCDMA是一個(gè)專(zhuān)用的DMA,它能自動(dòng)地把在偵內存中的視頻數據傳送到LCD驅動(dòng)器,通過(guò)使用這個(gè)DMA通道,視頻數據在不需要CPU的干預的情況下顯示在LCD屏上;
d:VIDPRCS接收來(lái)自L(fǎng)CDCDMA的數據,將數據轉換為合適的數據格式,比如說(shuō)4/8位單掃,4位雙掃顯示模式,然后通過(guò)數據端口VD[23:0]傳送視頻數據到LCD驅動(dòng)器;
e:TIMEGEN由可編程的邏輯組成,他生成LCD驅動(dòng)器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過(guò)不同的配置,TIMEGEN就能產(chǎn)生這些信號的不同形態(tài),從而支持不同的LCD驅動(dòng)器(即不同的STN/TFT屏)。
3. 常見(jiàn)TFT屏工作時(shí)序分析:

LCD提供的外部接口信號:
VSYNC/VFRAME/STV:垂直同步信號(TFT)/幀同步信號(STN)/SEC TFT信號; HSYNC/VLINE/CPV:水平同步信號(TFT)/行同步脈沖信號(STN)/SEC TFT信號; VCLK/LCD_HCLK:象素時(shí)鐘信號(TFT/STN)/SEC TFT信號; VD[23:0]:LCD像素數據輸出端口(TFT/STN/SEC TFT); VDEN/VM/TP:數據使能信號(TFT)/LCD驅動(dòng)交流偏置信號(STN)/SEC TFT 信號; LEND/STH:行結束信號(TFT)/SEC TFT信號; LCD_LPCOE:SEC TFT OE信號; LCD_LPCREV:SEC TFT REV信號; LCD_LPCREVB:SEC TFT REVB信號。 |
所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說(shuō)吧,一副圖像可以看做是一個(gè)矩形,由很多排列整齊的點(diǎn)一行一行組成,這些點(diǎn)稱(chēng)之為像素。那么這幅圖在LCD上的顯示原理就是:
A:顯示指針從矩形左上角的第一行第一個(gè)點(diǎn)開(kāi)始,一個(gè)點(diǎn)一個(gè)點(diǎn)的在LCD上顯示,在上面的時(shí)序圖上用時(shí)間線(xiàn)表示就為VCLK,我們稱(chēng)之為像素時(shí)鐘信號; B:當顯示指針一直顯示到矩形的右邊就結束這一行,那么這一行的動(dòng)作在上面的時(shí)序圖中就稱(chēng)之為1 Line; C:接下來(lái)顯示指針又回到矩形的左邊從第二行開(kāi)始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時(shí)間的,我們稱(chēng)之為行切換; D:如此類(lèi)推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時(shí)間線(xiàn)上看,就是時(shí)序圖上的HSYNC; E:然而,LCD的顯示并不是對一副圖像快速的顯示一下,為了持續和穩定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目的只是為了將圖像持續的顯示在LCD上)。那么這一副一副的圖像就稱(chēng)之為幀,在時(shí)序圖上就表示為1 Frame,因此從時(shí)序圖上可以看出1 Line只是1 Frame中的一行; F:同樣的,在幀與幀切換之間也是需要一定的時(shí)間的,我們稱(chēng)之為幀切換,那么LCD整個(gè)顯示的過(guò)程在時(shí)間線(xiàn)上看,就可表示為時(shí)序圖上的VSYNC。 |
上面時(shí)序圖上各時(shí)鐘延時(shí)參數的含義如下:(這些參數的值,LCD產(chǎn)生廠(chǎng)商會(huì )提供相應的數據手冊)
VBPD(vertical back porch):表示在一幀圖像開(kāi)始時(shí),垂直同步信號以后的無(wú)效的行數,對應驅動(dòng)中的upper_margin; VFBD(vertical front porch):表示在一幀圖像結束后,垂直同步信號以前的無(wú)效的行數,對應驅動(dòng)中的lower_margin; VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數計算,對應驅動(dòng)中的vsync_len; HBPD(horizontal back porch):表示從水平同步信號開(kāi)始到一行的有效數據開(kāi)始之間的VCLK的個(gè)數,對應驅動(dòng)中的left_margin; HFPD(horizontal front porth):表示一行的有效數據結束到下一個(gè)水平同步信號開(kāi)始之間的VCLK的個(gè)數,對應驅動(dòng)中的right_margin; HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅動(dòng)中的hsync_len; |
對于以上這些參數的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數據手冊L(fǎng)CD部分)
LCDCON1:17- 8位CLKVAL 6- 5位掃描模式(對于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為顯示設備提供的一個(gè)接口,它把一些顯示設備描述成一個(gè)緩沖區,允許應用程序通過(guò) FrameBuffer定義好的接口訪(fǎng)問(wèn)這些圖形設備,從而不用去關(guān)心具體的硬件細節。對于幀緩沖設備而言,只要在顯示緩沖區與顯示點(diǎn)對應的區域寫(xiě)入顏色值,對應的顏色就會(huì )自動(dòng)的在屏幕上顯示。下面來(lái)看一下在不同色位模式下緩沖區與顯示點(diǎn)的對應關(guān)系:

我相信看完這些以后大家會(huì )對這一塊有稍一些了解了,下面是我自己的理解:
LCD是在我們學(xué)習ARM9時(shí)覺(jué)得比較麻煩的一塊,因為剛接觸的時(shí)候一眼望去覺(jué)得內容可是不少,不知道從哪里下手,呵呵,其實(shí)我們慢慢來(lái)分析就會(huì )逐漸明朗起來(lái)。
首先說(shuō)一下我們平時(shí)所說(shuō)的多少位的LCD,有24位的,有16位的指的是LCD數據的位數,LCD的數據實(shí)際上是LCD要顯示的顏色,24位的是紅綠藍各占8位,16位則是紅綠藍按照565分配的,其實(shí)24的也可以只接16位,每個(gè)顏色地位接地就可以,所以要給LCD的緩沖區一個(gè)數據才能在LCD上顯示出來(lái)。那究竟是怎么顯示的呢,那就得先說(shuō)一下像素了,LCD的像素實(shí)際上就LCD屏幕有多少個(gè)點(diǎn),LCD顯示的東西都是一個(gè)一個(gè)點(diǎn)拼湊出來(lái)的,比如我用的是320*240的LCD,就是說(shuō)LCD每一行有320個(gè)點(diǎn),而每一列有240個(gè)點(diǎn),所以總共有320*240個(gè)點(diǎn),我們讓適當的點(diǎn)顯示適當的顏色就達到了我們的目的。
其實(shí)剛開(kāi)始困擾我們的是LCD的初始化的問(wèn)題,要設置的東西比較多,其實(shí)我們是記不住這些東西的,呵呵,作為入門(mén)我們可以參考別人的初始化程序,把里面的參數改成我們自己的LCD的參數就OK了。
那么我們到底是怎么把我們要顯示的數據送給LCD控制起的呢?是這樣的,我們可以定義一個(gè)二維數組,把我們要顯示的數據存到里面,然后把這個(gè)數組的地址賦給LCD的相應的寄存器,這個(gè)寄存器是LCDSADDRn,具體的設置大家可以參考數據手冊,我們可以把二維數組的坐標和LCD的坐標對應起來(lái),那么我們就可以隨意的讓哪一個(gè)像素點(diǎn)顯示什么顏色就顯示什么顏色了。這就把數據送出的過(guò)程,也就是顯示一個(gè)像素點(diǎn)的過(guò)程。
到現在我們已經(jīng)知道如何顯示一個(gè)像素了,那接下來(lái)就是LCD顯示最基本的東西了----字符和圖片。漢字和圖片的顯示都是基于像素點(diǎn)的顯示的,我們把要顯示的字符和圖片轉化成相應的數據,然后傳遞給LCD即可。我們可以專(zhuān)門(mén)的寫(xiě)一個(gè)顯示字符的函數和一個(gè)顯示圖片的函數。顯示字符的數據可以用取模軟件生成,因為生成的字符數據是表示的每一個(gè)點(diǎn)要不要亮,亮的地方用1表示,不亮的地方用0表示,所以如果用LCD顯示,我們還要告訴LCD顯示什么顏色,這才是LCD需要的數據,比如說(shuō)16*16的數據,有16行16列,我們將一行的數據,也就是16位數據的每一位都取出來(lái),為1的地方,我們就給LCD一個(gè)16位的數據,為0的地方就不給數據,這樣就能顯示了,取模生成的數據都是按行來(lái)的。圖片的顯示直接就將16位的數據傳遞給LCD,這個(gè)圖片數據的產(chǎn)生,我們可以用軟件LCD彩色圖片轉換工具(BMP_to_H)生成C語(yǔ)言文件,我們只需對文件進(jìn)行簡(jiǎn)單的修改就能加入到我們的程序中,修改方法在軟件的說(shuō)明中都有。
以上這些都是我自己的理解,話(huà)雖然不多,但這些都是我剛開(kāi)始學(xué)的時(shí)候困擾我的地方,我相信看了這些對你理解LCD到底是怎樣顯示的會(huì )有一定的幫助,說(shuō)的不對的地方,請大家及時(shí)幫我改正,呵呵。
下一篇文章中我將結合具體的代碼分析一下LCD的操作過(guò)程。
評論