Hello,大家好,今天我們來討論當下非常流行的TFT液晶顯示模組,它最大的特點是可以顯示出效果非常好的彩色信息,絕大多數手機、液晶顯示器,液晶電視、MID、MP4等產品都在使用它,你想抗拒它的魅力還真的很難。
我們主要討論基於ILI9341的TFT液晶顯示模組,但在正式討論之前,還是得先了解一下TFT液晶顯示器的彩色產生原理,它是基於大家都熟悉的紅(Red)、綠(Green)、藍(Blue)三原色光混合原理,例如,綠色+紅色=黃色,綠色+藍色=青色,紅色+藍色+綠色=白色,如下圖所示:
雖然上圖僅顯示了7種顏色,但是只要我們能夠得到紅、綠、藍三種顏色(原色),然后調節它們的亮度比例,就可以得到你想要的五顏六色,而得到的顏色數量則稱為色深(Color Depth)。
根據各原色的調節級數也可以分為很多顏色模式,比較常用的是三原色各占8位,即每種原色有2的8次方(256)種亮度變化,相應的色深為256*256*256=16777216(俗稱16兆彩色),我們稱其為RGB888模式。RGB配色通常使用RGB(rr,gg,bb)來表示,例如RGB(0xFF, 0x00, 0x00)表示紅色,RGB(0xFF, 0xFF, 0xFF)表示白色。在進行C源代碼編程時,經常會使用宏來定義一些常用的顏色,部分RGB888顏色如下:
當然,並不是所有場合都需要這么多顏色,RGB565與RGB666模式也很常用(其它還有RGB332、RGB555等等),相應的色深分別為32*64*32=65536(65千色)及64*64*64=262144(262千色)。RGB666模式部分常用顏色的宏定義如下圖所示:
現在的問題是:怎么產生三原色呢?看下圖吧
教堂彩色玻璃上繪有各種人物圖案,每一幅都是一個宗教故事,一些教會本地的傳說也會作為主題出現,以這種方式向民眾宣傳教義,也成就了它的藝術……這位同學你干嘛呢?在座的其它同學可都是有志於獻身電子技術領域,並以“為社會謀求福祉”的目標而奮斗着,你要是喜歡講故事瞎扯淡就趕緊學廚師當個裁縫比較好一些….等等,我還沒說完(摔門的聲音響起來了)。
呵呵!宗教那啥的我不太懂,只知道上圖已經告訴我們如何產生三原色,那就是:使用一個紅、綠、藍色的薄膜對光源進行過濾就可以了。TFT液晶顯示模組中總會有一個白光源(CCFL或LED,此處不贅述,具體原理及相應的驅動電路請參考《顯示器件應用精粹》(以下簡稱“顯示器件”)與一片彩色濾光膜。假設TFT屏當前正顯示純白的畫面,你用放大鏡去觀察,會發現有屏上有很多紅、綠、藍的方塊,如下圖那樣:
我們把每一個點稱為子像素(SubPixel),三個子像素組成一個顯示像素。對於分辨率為240列320行的TFT屏,它需要240*3=720個列驅動(320個行驅動)引腳。每個顯示像素都會對應驅動芯片中顯存(Graphics RAM, GRAM)里的一個地址,分辨率為240*320的TFT屏對應的GRAM地址應該有240*320=76800個,具體容量為多少則取決於芯片支持的RGB模式。例如,ILI9341有720列320行驅動輸出,支持RGB565與RGB666模式,按最大位數(18位)來計算,相應的GRAM容量大小應該為240*320*18=138240bits(位)=172800bytes(字節),數據手冊標記的特點如下圖所示:
我們使用VisualCom軟件平台中 “基於ILI9341的320X240的TFT液晶顯示模組”來仿真一下,相應的效果如下圖所示。
ILI9341的指令比較多,英文數據手冊超過200頁,涉及的寄存器數量也非常龐大,VisualCom軟件平台按功能相近的原則將其划分為多個類別。由於這是我們第一次接觸TFT液晶顯示模組,所以先給大家演示如何以最少的指令點亮TFT屏,后續文章會按類別詳細討論其它指令功能。
首先我們先注意“屬性”窗口的“高級”組合框中有三個選項,其一為起始頁。“頁”就是行,它與“列”是對GRAM地址的定位方式。ILI9341的GRAM共划分為320頁,每頁240列。在“單步運行”仿真模式下,“內存窗口”可以實時觀察GRAM空間的顯示數據,但是由於320頁的數據量太過龐大,為避免加載時間過慢(不影響單步運行時數據的刷新時間,只是當重新打開另一個文件或更換器件時,VisualCom軟件平台需要對當前工程的內存與寄存器數據進行清理的時間比較長),我們限制一次性只能加載8頁內存(通常也不需要全部載入),你所需要做的就是指定起頁始。上圖指定的起始頁為32,所以加載的內存頁為32~39頁。當然,在單步運行時,你可以隨時更改起始頁,內存窗口會在下一步運行時進行相應的刷新。
假設現在要求顯示一張圖片,怎么辦?由於ILI9341的GRAM空間太大,如果仍然按以往的方式(預置數據)來寫滿GRAM,需要預置的數據至少為76800條,恐怕根本不會有人會這么做,即便像ST7920、KS0108B那樣相對小一點的“黑白”點陣LCD驅動芯片,通過預置數據來連續寫入顯存的方式也並不討好。VisualCom軟件平台當然不會只提供半套解決方案,它允許你指定一個.BMP圖像文件對GRAM進行初始化,當你運行仿真之后,首先會使用指定的圖片初始化ILI9341的GRAM,爽歪歪!
前面已經提過,ILI9341支持RGB565與RGB666兩種像素格式。從“高級”屬性中選擇一種后,你剛才指定的圖片會以相應像素格式寫入到GRAM中。需要注意的是:屬性窗口里的“像素格式”只是用來控制圖片初始化到GRAM的顯示數據,而不是用來設置ILI9341狀態的(需要指令,后述)。
好的,現在咱們來看看需要哪些指令才能讓屏幕有所顯示呢?相應的預置數據如下圖所示:
乖乖,我們只預置了兩條指令,它首先退出了睡眠模式,然后打開了顯示。我們來看看數據手冊中復位后的狀態,如下圖所示:
整個表格中,只有“睡眠(Sleep)”與“顯示(Display)”兩項影響屏幕的顯示,ILI9341上電復位后默認處於睡眠模式(Sleep In),並且顯示也是關閉的(Off)。“空閑(Idle)”模式下是可以顯示的,只不過顯示的顏色比較少(后述),更何況還並不在空閑模式下(Idle Off)。(其它是一些地址設置或讀寄存器等等,咱們暫時忽略)
睡眠模式是個蝦米東東呢?不知道,還是翻翻數據手冊吧!其中有一條“進入睡眠模式”指令,如下圖所示:
哦!原來睡眠模式主要是為了省電,此時內部電荷泵升壓(Pump DC/DC Converter)電路(有關硬件電路原理請參考《顯示器件》)、系統振盪器都會關閉(但是已經寫入到GRAM的數據仍然保持不變),那這個屏幕還顯示個毛線,所以執行“退出睡眠模式”指令是讓屏幕能夠顯示GRAM數據前必須要做的一步。我們再來看看相應的指令,如下圖所示:
可以看到,“退出睡眠”指令為0x11,這也是我們預置的第一條指令,接下來使用“打開顯示”指令0x29,咱們指定的初始化圖片就顯示出來了。在VisualCom軟件的“寄存器窗口”中,SLEEP與DISPLAY位分別代表相應的模式(0為關閉,1為開啟)。
值得一提的是:ILI9341仿真模型還添加了預置數據處理狀態,在“輸出”窗口的信息欄中可以顯示當前預置數據的解析狀態。例如,我在前述預置數據后再添加一條指令(0x14)與兩條任意數據,如下圖所示:
由於ILI9341不存在0x14對應的指令,所以信息欄中會顯示相應指令為無效。同樣,后面跟隨的多個數據也是無效的,這樣的實時信息反饋能夠進一步幫助使用者應證自己對芯片指令作用的理解(如果指令解析結果不是你需要的,肯定哪里出錯了,而不像以往那樣只能看屏幕、內存、寄存器窗口),相應的效果如下圖所示。
那如何往指定的GRAM地址寫入指定的顯示數據呢?這與以往ST7920、KS0108B之類的驅動芯片還有點不太一樣,我們下一期再會吧!