新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 六 ARM9(S3C2440)的LCD顯示-理論知識

        六 ARM9(S3C2440)的LCD顯示-理論知識

        作者: 時間:2016-11-27 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/322171.htm

        所有顯示器顯示圖像的原理都是從上到下,從左到右的。這是什么意思呢?這么說吧,一副圖像可以看做是一個矩形,由很多排列整齊的點一行一行組成,這些點稱之為像素。那么這幅圖在LCD上的顯示原理就是:

        A:顯示指針從矩形左上角的第一行第一個點開始,一個點一個點的在LCD上顯示,在上面的時序圖上用時間線表示就為VCLK,我們稱之為像素時鐘信號;
        B:當顯示指針一直顯示到矩形的右邊就結束這一行,那么這一行的動作在上面的時序圖中就稱之為1 Line;
        C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時間的,我們稱之為行切換;
        D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時間線上看,就是時序圖上的HSYNC;
        E:然 而,LCD的顯示并不是對一副圖像快速的顯示一下,為了持續和穩定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目 的只是為了將圖像持續的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時序圖上就表示為1 Frame,因此從時序圖上可以看出1 Line只是1 Frame中的一行;
        F:同樣的,在幀與幀切換之間也是需要一定的時間的,我們稱之為幀切換,那么LCD整個顯示的過程在時間線上看,就可表示為時序圖上的VSYNC。

        上面時序圖上各時鐘延時參數的含義如下:(這些參數的值,LCD產生廠商會提供相應的數據手冊)

        VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數,對應驅動中的upper_margin;
        VFBD(vertical front porch):表示在一幀圖像結束后,垂直同步信號以前的無效的行數,對應驅動中的lower_margin;
        VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數計算,對應驅動中的vsync_len;
        HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數據開始之間的VCLK的個數,對應驅動中的left_margin;
        HFPD(horizontal front porth):表示一行的有效數據結束到下一個水平同步信號開始之間的VCLK的個數,對應驅動中的right_margin;
        HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅動中的hsync_len;

        對于以上這些參數的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數據手冊LCD部分)

        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為顯示設備提供的一個接口,它把一些顯示設備描述成一個緩沖區,允許應用程序通過FrameBuffer定義好的接口訪問這些圖形設備,從而不用去關心具體的硬件細節。對于幀緩沖設備而言,只要在顯示緩沖區與顯示點對應的區域寫入顏色 值,對應的顏色就會自動的在屏幕上顯示。下面來看一下在不同色位模式下緩沖區與顯示點的對應關系:




        我相信看完這些以后大家會對這一塊有稍一些了解了,下面是我自己的理解:

        LCD是在我們學習ARM9時覺得比較麻煩的一塊,因為剛接觸的時候一眼望去覺得內容可是不少,不知道從哪里下手,呵呵,其實我們慢慢來分析就會逐漸明朗起來。

        首先說一下我們平時所說的多少位的LCD,有24位的,有16位的指的是LCD數據的位數,LCD的數據實際上是LCD要顯示的顏色,24位的是紅綠藍各占8位,16位則是紅綠藍按照565分配的,其實24的也可以只接16位,每個顏色地位接地就可以,所以要給LCD的緩沖區一個數據才能在LCD上顯示出來。那究竟是怎么顯示的呢,那就得先說一下像素了,LCD的像素實際上就LCD屏幕有多少個點,LCD顯示的東西都是一個一個點拼湊出來的,比如我用的是320*240的LCD,就是說LCD每一行有320個點,而每一列有240個點,所以總共有320*240個點,我們讓適當的點顯示適當的顏色就達到了我們的目的。

        其實剛開始困擾我們的是LCD的初始化的問題,要設置的東西比較多,其實我們是記不住這些東西的,呵呵,作為入門我們可以參考別人的初始化程序,把里面的參數改成我們自己的LCD的參數就OK了。

        那么我們到底是怎么把我們要顯示的數據送給LCD控制起的呢?是這樣的,我們可以定義一個二維數組,把我們要顯示的數據存到里面,然后把這個數組的地址賦給LCD的相應的寄存器,這個寄存器是LCDSADDRn,具體的設置大家可以參考數據手冊,我們可以把二維數組的坐標和LCD的坐標對應起來,那么我們就可以隨意的讓哪一個像素點顯示什么顏色就顯示什么顏色了。這就把數據送出的過程,也就是顯示一個像素點的過程。

        到現在我們已經知道如何顯示一個像素了,那接下來就是LCD顯示最基本的東西了----字符和圖片。漢字和圖片的顯示都是基于像素點的顯示的,我們把要顯示的字符和圖片轉化成相應的數據,然后傳遞給LCD即可。我們可以專門的寫一個顯示字符的函數和一個顯示圖片的函數。顯示字符的數據可以用取模軟件生成,因為生成的字符數據是表示的每一個點要不要亮,亮的地方用1表示,不亮的地方用0表示,所以如果用LCD顯示,我們還要告訴LCD顯示什么顏色,這才是LCD需要的數據,比如說16*16的數據,有16行16列,我們將一行的數據,也就是16位數據的每一位都取出來,為1的地方,我們就給LCD一個16位的數據,為0的地方就不給數據,這樣就能顯示了,取模生成的數據都是按行來的。圖片的顯示直接就將16位的數據傳遞給LCD,這個圖片數據的產生,我們可以用軟件LCD彩色圖片轉換工具(BMP_to_H)生成C語言文件,我們只需對文件進行簡單的修改就能加入到我們的程序中,修改方法在軟件的說明中都有。

        以上這些都是我自己的理解,話雖然不多,但這些都是我剛開始學的時候困擾我的地方,我相信看了這些對你理解LCD到底是怎樣顯示的會有一定的幫助,說的不對的地方,請大家及時幫我改正,呵呵。

        下一篇文章中我將結合具體的代碼分析一下LCD的操作過程。


        上一頁 1 2 下一頁

        關鍵詞: ARM9S3C2440LCD顯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄢陵县| 昂仁县| 翼城县| 武城县| 隆子县| 四会市| 阳信县| 合作市| 绥江县| 浦城县| 德格县| 伊金霍洛旗| 高碑店市| 大田县| 呈贡县| 麦盖提县| 绥棱县| 徐汇区| 顺义区| 清涧县| 渝中区| 米脂县| 灌阳县| 井冈山市| 凌源市| 四川省| 睢宁县| 彝良县| 浦江县| 三台县| 邓州市| 晋州市| 恩施市| 涞源县| 明光市| 宁陵县| 田林县| 应用必备| 吴江市| 张家港市| 庆云县|