0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LCD驅(qū)動分析_LCD控制器設(shè)置及代碼詳解

電子工程師 ? 作者:工程師a ? 2018-05-20 09:37 ? 次閱讀

1. LCD工作的硬件需求:

要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動器會以COF/COG的 形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S3C2410/2440等。通 過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號來控制STN/TFT屏了。

2. S3C2440內(nèi)部LCD控制器結(jié)構(gòu)圖:

LCD驅(qū)動分析_LCD控制器設(shè)置及代碼詳解

我們根據(jù)數(shù)據(jù)手冊來描述一下這個集成在S3C2440內(nèi)部的LCD控制器:

a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;

b:REGBANK由17個可編程的寄存器組和一塊256*16的調(diào)色板內(nèi)存組成,它們用來配置LCD控制器的;

c:LCDCDMA是一個專用的DMA,它能自動地把在偵內(nèi)存中的視頻數(shù)據(jù)傳送到LCD驅(qū)動器,通過使用這個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ū)動器;

e:TIMEGEN由可編程的邏輯組成,他生成LCD驅(qū)動器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關(guān),通過不同的配置,TIMEGEN就能產(chǎn)生這些信號的不同形態(tài),從而支 持不同的LCD驅(qū)動器(即不同的STN/TFT屏)。

3.常見TFT屏工作時序分析:

LCD驅(qū)動分析_LCD控制器設(shè)置及代碼詳解

LCD提供的外部接口信號:

VSYNC/VFRAME/STV:垂直同步信號(TFT)/幀同步信號(STN)/SEC TFT信號;

HSYNC/VLINE/CPV:水平同步信號(TFT)/行同步脈沖信號(STN)/SEC TFT信號;

VCLK/LCD_HCLK:象素時鐘信號(TFT/STN)/SEC TFT信號;

VD[23:0]:LCD像素數(shù)據(jù)輸出端口(TFT/STN/SEC TFT);

VDEN/VM/TP:數(shù)據(jù)使能信號(TFT)/LCD驅(qū)動交流偏置信號(STN)/SEC TFT 信號;

LEND/STH:行結(jié)束信號(TFT)/SEC TFT信號;

LCD_LPCOE:SEC TFT OE信號;

LCD_LPCREV:SEC TFT REV信號;

LCD_LPCREVB:SEC TFT REVB信號。

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

A:顯示指針從矩形左上角的第一行第一個點(diǎn)開始,一個點(diǎn)一個點(diǎn)的在LCD上顯示,在上面的時序圖上用時間線表示就為VCLK,我們稱之為像素時鐘信號;

B:當(dāng)顯示指針一直顯示到矩形的右邊就結(jié)束這一行,那么這一行的動作在上面的時序圖中就稱之為1 Line;

C:接下來顯示指針又回到矩形的左邊從第二行開始顯示,注意,顯示指針在從第一行的右邊回到第二行的左邊是需要一定的時間的,我們稱之為行切換;

D:如此類推,顯示指針就這樣一行一行的顯示至矩形的右下角才把一副圖顯示完成。因此,這一行一行的顯示在時間線上看,就是時序圖上的HSYNC;

E:然 而,LCD的顯示并不是對一副圖像快速的顯示一下,為了持續(xù)和穩(wěn)定的在LCD上顯示,就需要切換到另一幅圖上(另一幅圖可以和上一副圖一樣或者不一樣,目 的只是為了將圖像持續(xù)的顯示在LCD上)。那么這一副一副的圖像就稱之為幀,在時序圖上就表示為1 Frame,因此從時序圖上可以看出1 Line只是1 Frame中的一行;

F:同樣的,在幀與幀切換之間也是需要一定的時間的,我們稱之為幀切換,那么LCD整個顯示的過程在時間線上看,就可表示為時序圖上的VSYNC。

上面時序圖上各時鐘延時參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會提供相應(yīng)的數(shù)據(jù)手冊)

VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù),對應(yīng)驅(qū)動中的upper_margin;

VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號以前的無效的行數(shù),對應(yīng)驅(qū)動中的lower_margin;

VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算,對應(yīng)驅(qū)動中的vsync_len;

HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的left_margin;

HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個水平同步信號開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的right_margin;

HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應(yīng)驅(qū)動中的hsync_len;

對于以上這些參數(shù)的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數(shù)據(jù)手冊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為顯示設(shè)備提供的一個接口,它把一些顯示設(shè)備描述成一個緩沖區(qū),允許應(yīng)用程序通過FrameBuffer定義好的接口訪問這些圖形設(shè)備,從而不用去關(guān)心具體的硬件細(xì)節(jié)。對于幀緩沖設(shè)備而言,只要在顯示緩沖區(qū)與顯示點(diǎn)對應(yīng)的區(qū)域?qū)懭腩伾?,對?yīng)的顏色就會自動的在屏幕上顯示。

下面看看2440test里面的lcd.c文件

static void PutPixel(U32 x,U32 y,U16 c)

{

if(x《SCR_XSIZE && y《SCR_YSIZE)

LCD_BUFFER[(y)][(x)] = c;

}

很容易發(fā)現(xiàn)TFT LCD上顯示單個像素的函數(shù)實際上很簡潔

看來似乎只需要LCD_BUFFER[(y)][(x)] = c這一句話

下面就來分析下,是如何通過這一句話來實現(xiàn)在LCD上顯示單個像素的

先分析下LCD_Init()即LCD初始化函數(shù)

rLCDCON1 = (LCD_PIXCLOCK 《《 8) | (3 《《 5) | (12 《《 1);

LCDCON1 0x4d000000

#define LCD_WIDTH 240

#define LCD_HEIGHT 320

#define LCD_PIXCLOCK 4

#define LCD_RIGHT_MARGIN 36

#define LCD_LEFT_MARGIN 19

#define LCD_HSYNC_LEN 5

#define LCD_UPPER_MARGIN 1

#define LCD_LOWER_MARGIN 5

#define LCD_VSYNC_LEN 1

CLKVAL[17:8] = 4

TFT: VCLK = HCLK / [(CLKVAL+1) * 2] ( CLKVAL》=0 )

MMODE[7] = 0

PNRMODE[6:5] = 11 TFT LCD panel

BPPMODE[4:1] = 1100 16bpp for TFT

ENVID[0] = 0 Disable

rLCDCON2 = (LCD_UPPER_MARGIN 《《 24) | ((LCD_HEIGHT - 1) 《《 14) | (LCD_LOWER_MARGIN 《《 6) | (LCD_VSYNC_LEN 《《 0);

LCDCON2 0x4d000004

VBPD = 1

VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù),對應(yīng)驅(qū)動中的upper_margin

LINVAL = 240 – 1

LINVAL:LCD屏的垂直大小

VFPD = 5

VFPD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號以前的無效的行數(shù),對應(yīng)驅(qū)動中的lower_margin

VSPW = 1

VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算,對應(yīng)驅(qū)動中的vsync_len

rLCDCON3 = (LCD_RIGHT_MARGIN 《《 19) | ((LCD_WIDTH - 1) 《《 8) | (LCD_LEFT_MARGIN 《《 0);

LCDCON3 0x4d000008

HBPD = 36

HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的left_margin

HOZVAL = 320 – 1

HOZVAL:LCD屏的水平大小

HFPD = 19

HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個水平同步信號開始之間的VCLK的個數(shù),對應(yīng)驅(qū)動中的right_margin

rLCDCON4 = (13 《《 8) | (LCD_HSYNC_LEN 《《 0);

LCDCON4 0x4d00000c

MVAL = 13

HSPW = 5

HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應(yīng)驅(qū)動中的hsync_len

# define LCD_CON5 ((1《《11) | (1 《《 9) | (1 《《 8) | (1 《《 3) | (1 《《 0))

rLCDCON5 = LCD_CON5;

LCDCON5 0x4d000010

HWSWP = 1 Swap Enable

PWREN = 1 Enable PWREN signal

INVVFRAME = 1 VFRAME/VSYNC pulse polarity Inverted 選擇負(fù)極性脈沖

INVVLINE = 1 VLINE/HSYNC pulse polarity Inverted 選擇負(fù)極性脈沖

FRM565 = 1 5:6:5 Format

rLCDINTMSK |= 3;

INT_FrSyn = 1 LCD frame synchronized interrupt Masked

INT_FiCnt = 1 LCD FIFO interrupt Masked

rTCONSEL &= (~7);

rTCONSEL &= ~((1《《4) | 1);

MODE_SEL = 0 Sync mode

RES_SEL = 0 320 x 240

LPC_EN = 0 LPC3600 Disable

rTPAL = 0x0;

Temporary palette register enable bit Disable

volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

#define LCD_ADDR ((U32)LCD_BUFFER)

#define M5D(n) ((n)&0x1fffff)

rLCDSADDR1 = ((LCD_ADDR 》》 22) 《《 21) | ((M5D(LCD_ADDR 》》 1)) 《《 0);

rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) 》》 1);

rLCDSADDR3 = LCD_WIDTH;

LCDSADDR1 0x4d000014 幀緩沖起始寄存器1

LCDBANK[29:21] = (U32)LCD_BUFFER 》》 22

These bits indicate A[30:22] of the bank location for the video buffer in the system memory. LCDBANK value cannot be changed even when moving the view port. LCD frame buffer should be within aligned 4MB region, which ensures that LCDBANK value will not be changed when moving the view port. So, care should be taken to use the malloc() Function

系統(tǒng)內(nèi)存地址A[30:22]處的Bank位置為圖像緩沖。LCDBANK的值在視圖移動的值在視圖移動時不能改變,LCD幀緩沖應(yīng)該在4MB區(qū)域?qū)R,保證LCDBANK的值在移動視圖時不會改變。

LCDBASEU[20:0] = ((U32)LCD_BUFFER 》》 1)&0x1fffff

For dual-scan LCD : These bits indicate A[21:1] of the start address of the upper address counter, which is for the upper frame memory of dual scan LCD or the frame memory of single scan LCD.

For single-scan LCD : These bits indicate A[21:1] of the start address of the LCD frame buffer.

雙掃描:表明高地址計數(shù)器的起始地址A[21:1],用于LCD雙掃描的上部幀內(nèi)存或者單掃描的幀內(nèi)存

單掃描:表明LCD幀緩沖的起始地址A[21:1]

LCDSADDR2 0x4d000018幀緩沖起始寄存器2

LCDBASEL[20:0] = ((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) 》》 1)& 0x1fffff

= (LCD_ADDR 》》 1 + LCD_WIDTH * LCD_HEIGHT)& 0x1fffff

For dual-scan LCD: These bits indicate A[21:1] of the start address of the lower address counter, which is used for the lower frame memory of dual scan LCD.

For single scan LCD: These bits indicate A[21:1] of the end address of the LCD frame buffer.

LCDBASEL = ((the frame end address) 》》1) + 1

= LCDBASEU + (PAGEWIDTH+OFFSIZE) x (LINEVAL+1)

雙掃描:表明低地址計數(shù)器的起始地址A[21:1],用于LCD雙掃描的下部幀內(nèi)存或者單掃描的幀內(nèi)存

單掃描:表明LCD幀緩沖的結(jié)束地址A[21:1]

LCDSADDR3 0x4d00001c幀緩沖起始寄存器3

OFFSIZE = 0

PAGEWIDTH = 320 虛擬屏頁寬(半字?jǐn)?shù)量) 定義了幀中的視圖域?qū)挾?/p>

程序分析至此,大概已經(jīng)清楚是如何通過LCD_BUFFER[(y)][(x)] = c來實現(xiàn)在LCD上顯示單個像素了。

就是在設(shè)置好各個LCD寄存器之后,通過將LCD_BUFFER地址與LCDBANK以及LCDBASEU、LCDBASEL對應(yīng)之后,通過改變LCD_BUFFER里不同單元存儲的值(即像素的顏色),即可在LCD相應(yīng)位置上做出顯示。

那么在應(yīng)用不同LCD的時候,只需對LCDCONx以及LCDSADDRx做出相應(yīng)的配置,在創(chuàng)建一個數(shù)組,做出上述的地址映射即可。

關(guān)于VCLK計算,由于配置的是TFT,可用到公式VCLK = HCLK / [(CLKVAL+1) * 2] ( CLKVAL》=0 )

設(shè)置的FLK為400MHz,HCLK為100MHz,CLKVAL = 4,因此VLCK = 10MHz

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • lcd
    lcd
    +關(guān)注

    關(guān)注

    34

    文章

    4384

    瀏覽量

    166670
  • LCD控制器
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    15473
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用示波器解決LCD控制器調(diào)試難題

    的應(yīng)用。  一、LCD控制器驅(qū)動器工作原理  要使LCD的顯示文字或圖像,需要通過LCD控制器
    發(fā)表于 12-09 17:04

    LCD控制器設(shè)置

    目錄LCD 控制器LCDCON1的設(shè)置LCDCON2的設(shè)置LCDCON3的設(shè)置LCDCON4的設(shè)置
    發(fā)表于 01-21 12:56

    S3C2410驅(qū)動TFT LCD的設(shè)計應(yīng)用

    摘要:介紹了$3C2410的LCD控制器的數(shù)據(jù)和控制管腳,并給出了LCD控制流程和TFr.LCD
    發(fā)表于 09-10 23:22 ?28次下載

    ARM芯片S3C2410驅(qū)動TFT LCD的研究

    介紹了$3C2410的LCD控制器的數(shù)據(jù)和控制管腳,并給出了LCD控制流程和TFr.LCD
    發(fā)表于 11-12 11:31 ?49次下載

    ARM的LCD驅(qū)動控制實驗

    ARM的LCD驅(qū)動控制實驗 一、 實驗?zāi)康?.了解LCD 基本概念與原理。2.理解LCD驅(qū)動
    發(fā)表于 12-25 23:48 ?4796次閱讀
    ARM的<b class='flag-5'>LCD</b> 的<b class='flag-5'>驅(qū)動</b><b class='flag-5'>控制</b>實驗

    通用的TFT-LCD顯示控制器的設(shè)計與實現(xiàn)

    隨著各種分辨率LCD的廣泛應(yīng)用,一種通用的LCD顯示控制器的研制與應(yīng)用亟待發(fā)展。為了能夠更加方便快捷地控制LCD的顯示,文中以AT070TN
    發(fā)表于 08-29 17:21 ?279次下載
    通用的TFT-<b class='flag-5'>LCD</b>顯示<b class='flag-5'>控制器</b>的設(shè)計與實現(xiàn)

    基于FPGA的LCD控制器設(shè)計

    基于 FPGA的LCD控制器設(shè)計的論文。
    發(fā)表于 10-29 14:05 ?17次下載

    LCD基礎(chǔ)及S3C2410_LCD控制器

    LCD基礎(chǔ)及S3C2410 LCD控制器.
    發(fā)表于 01-13 11:40 ?34次下載

    基于FPGA設(shè)計LCD顯示控制器相關(guān)知識詳解

    ,只需通過端口的使能參數(shù)配置便可以驅(qū)動LCD1602/LCD12864模塊實現(xiàn)字符或圖形的實時顯示,并且該多功能LCD控制器的可行性也在Cv
    發(fā)表于 12-01 17:17 ?35次下載
    基于FPGA設(shè)計<b class='flag-5'>LCD</b>顯示<b class='flag-5'>控制器</b>相關(guān)知識<b class='flag-5'>詳解</b>

    基于ARM處理LCD控制與觸摸屏接口設(shè)計(詳解

    S3C44B0X中內(nèi)置LCD控制器介紹 S3C44B0X中內(nèi)置的LCD控制器可以支持4級灰度、16級灰度的黑白LCD和256級顏色的彩色
    發(fā)表于 12-02 10:20 ?56次下載
    基于ARM處理<b class='flag-5'>器</b>的<b class='flag-5'>LCD</b><b class='flag-5'>控制</b>與觸摸屏接口設(shè)計(<b class='flag-5'>詳解</b>)

    MAX32650上的LCD控制器介紹如何配置LCD定時參數(shù)

    在系列視頻的第一部分,我們討論MAX32650微控制器LCD控制器,以及如何將其連接到TFT LCD面板內(nèi)的驅(qū)動電路。在下節(jié)視頻“為什么定
    的頭像 發(fā)表于 10-09 03:12 ?3704次閱讀

    了解LCD驅(qū)動(FrameBuffer)的實例開發(fā)

    要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把
    發(fā)表于 04-02 14:23 ?1007次閱讀
    了解<b class='flag-5'>LCD</b><b class='flag-5'>驅(qū)動</b>(FrameBuffer)的實例開發(fā)

    LCD控制器/驅(qū)動器ST7565S芯片手冊

    LCD控制器/驅(qū)動器ST7565S芯片手冊免費(fèi)下載。
    發(fā)表于 06-09 09:19 ?50次下載

    瑞薩MCU內(nèi)置LCD控制器/驅(qū)動器漫談

    瑞薩MCU內(nèi)置LCD控制器/驅(qū)動器漫談
    的頭像 發(fā)表于 09-28 16:12 ?754次閱讀
    瑞薩MCU內(nèi)置<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>/<b class='flag-5'>驅(qū)動器</b>漫談

    什么是LCD控制器?愛普生LCD控制器的作用和功能、概述和產(chǎn)品列表

    什么是LCD控制器LCD控制器的作用和功能LCD控制器(液晶顯示
    的頭像 發(fā)表于 10-09 11:10 ?149次閱讀
    什么是<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>?愛普生<b class='flag-5'>LCD</b><b class='flag-5'>控制器</b>的作用和功能、概述和產(chǎn)品列表