源程序請到以下地址下載查看:
STM32_240320_TFTLCD_ILI9325_HX8352_Final.rar
(66.27 KB, 下載次數: 34)
2016-6-29 14:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
約定:豎屏時,Horizontal(Column):X=0~239;Vertical(Row):Y=0~319,原點位置(0,0)為左上角,如下圖:

一、掃描方式

以上文字大意是9325由720個源極通道和320個柵極通道組成,為什么是720呢,因為每個像素點由三個部分組成:R G B ,分別對應紅綠藍三原色,液晶顯示的原理就是控制三種光色的搭配形成各種顏色 ,720個Source(240*3=720 ,分布在X軸),320個Gate驅動分布在Y軸。G和S構成像素矩陣,通過掃面輸出G和S信號就可以在屏幕上顯示信息。

G驅動的掃描方式看寄存器R01和R60H,需要GS與SM配合設置,SS控制S通道正序或倒序掃描,GS同理,SM控制G通道逐行或隔行掃面。


SS:0為正序,1為倒序
GS:0為正序,1為倒序
實際測試,豎屏時,先設置SM=0,設置SS=0,GS=0和SS=1,GS=1效果剛好中心對稱顯示(旋轉180);
Sm=0、SS=0不變時,GS由0改為1,則顯示結果和原圖一Y軸方向軸對稱,因此看起來圖像上下顛倒了,因為地址內存數據雖然沒有改變,但是輸出到屏幕的順序改變了。
GS=0,SS=0時,SM=1時,由于此時G通道是隔行掃描的,先送G1,G3,……G317,319再從G2,G4掃到G320,就像食堂打飯,本來正常順序是從第一人開始順序打飯,但是如果隊伍不變,但是隔一個人打飯,假設從奇數個開始打飯,那么先給所有奇數個打飯,之后才給排偶數的人打飯,這就造成偶數個打到的都是剩飯剩菜。但是液晶還有一個S通道,S通道是順序掃描,兩種效果疊加,所以最終顯示結果是下半部圖像和上半部調換并被拉長。故此得出結論,SM一定要設置為0!
二、顯存GRAM地址設置
本節要用到的寄存器有R03H,R50 R51 R52 R53共5個寄存器。
首先要注意的是,ORG=0時,ILI9325的內存地址是不能修改的,也就是說,內存地址0000H始終對應屏幕左上角(0,0),當然這是正常情況下的情形,我們可以通過第一節介紹的的方法控制顯示方式,但即便如此,也只是控制輸出數據的順序而已,地址與屏幕的默認對應關系是不可改變的。而HIMAX奇景光電的HX8352控制器是可以改變內存地址與屏幕的對應關系的,也就是說可以修改原點(0,0)在屏幕中的位置
R03:此寄存器用于設置寫入ram時,內存地址增加/減少的方向



其中 TRI DFM均默認0,不解釋,BGR置為1,BGR為1表示寫入GRAM的數據格式是按B G R的順序存放的,設置錯誤圖像會按照逆序的RGB顏色顯示,若發現顯示顏色有誤,改BGR為0就好了。
AM:水平/垂直掃描方向選擇,0為水平,1為垂直;
ID:內存地址計數器(AC)增/減方向,不解釋,看圖;
實際上AM和ID只對開辟窗口寫數據方式有用,需要結合R50~R53,一般初始化時會給R50~R53設置為239,319。
下一期將對橫屏模式作分析,敬請關注。由于水平有限,有錯漏的地方請見諒,敬請斧正。
一、豎屏顯示
要想實現橫屏顯示,首先要了解豎屏顯示的操作方法,前面說過原點位置(0,0)位于屏幕左上角,對于ILI9325(0,0)位置也是顯存地址00000H對應的地方,為什么用00000H而不用0H表示呢,因為Gram低八位用于表示X軸坐標,范圍從0~EFH(0~239),高12位用于Y軸地址坐標,范圍從0~13FH(0~319),所以右下角終點地址是13FEFH。但坐標地址并不是連續的,因為13FEFH = 81903,這與屏幕像素點總數與240*320=76800并不相等,因為低八位最大值是EFH,但不要緊,這個問題并不影響操作。默認情況下,每次向gram中寫像素數據,iLI9325的gram地址自動先從左到右,再從上到下增加。ILI9325用R20H和R21H兩個寄存器來確定GRAM地址
所以我們在某個點寫數據的過程是:
1.向寄存器R20H,R21H寫像素地址
2.寫一次R22H命令,通知ILI9325準備接受RGB數據
3.寫RGB數據
二、劃定窗口連續寫數據
按照第一節介紹的方法我們發現如果要在某個矩形區域連續寫同種顏色數據,每次都需要重新定義GRAM地址,效率很低,實際上可以通過劃定區域來向指定窗口區域中連續輸入數據,因為GRAM地址會按照寄存器R03H中的ORG AM ID確定的方向自動增/減,而且豎屏的時候。ORG = 1時,當通過50H~53H劃定區域時,芯片將GRAM地址00000H映射到窗口區域的某個頂點(根據AM、ID的設置,見下圖中各種模式中字母B的位置就是00000H的位置(Begin)),這樣就可以再橫屏顯示時也可以劃定區域連續填數據。
一般情況下,豎屏顯示時讓ORG = 0,因為很多人都會選擇ID = 11,AM=0的模式(下圖中右上角的模式,看字字母"F"的正常情況下的朝向),這樣區域填充數據時就符合使用者常規視覺上的理解,不用做坐標轉換,。此時,因為ORG = 0,即使通過R50~53H劃定窗口,但是00000H依然是在屏幕的左上角,而不是窗口區域的左上角!且此時向R20H R21H寫的地址必須是窗口內的地址,否則無效。
橫屏顯示時,令ORG = 1,這樣我們劃區域時GRAM起始地址00000H就始終映射到窗口中起點B的位置,此時地址自增的方向才符合人體視覺上的從左到右,從上到下。我選擇ID = 10 ,AM=1 ,對應下圖中的第二排第二種模式。記得此時要么SS=1 GS=1,要么SS=0,GS = 0,不懂什么意思請看上一篇。

程序代碼如下:
//設置光標位置
//Xpos:橫坐標
//Ypos:縱坐標
__inline void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
if(DeviceCode==0X52)
{
LCD_WriteReg(0x02, Xpos>>8);//起點x高八位
LCD_WriteReg(0x03, Xpos); //起點x低八位
LCD_WriteReg(0x06, Ypos>>8);//起點y高八位
LCD_WriteReg(0x07, Ypos); //起點y低八位
}else
if(DeviceCode==0X9325)
{
#if USE_HORIZONTAL == 0
LCD_WriteReg(0x50, Xpos);
LCD_WriteReg(0x51, LCD_W); //把終點定在屏幕右下角,確保Xpos有效,因為0x50的值必須<0x51的值
LCD_WriteReg(0x52, Ypos);
LCD_WriteReg(0x53, LCD_H);
#else
LCD_WriteReg(0x50, Ypos);
LCD_WriteReg(0x51, 239); //把終點定在屏幕右下角,確保Xpos有效,因為0x50的值必須<0x51的值
LCD_WriteReg(0x52, 0); //把終點定在屏幕右下角,確保Xpos有效,因為0x52的值必須<0x53的值
LCD_WriteReg(0x53, 319-Xpos);
#endif
LCD_WriteReg(0x20, 0x0000);
LCD_WriteReg(0x21, 0x0000);
}
LCD_WR_REG(WriteGram); //準備寫入ram
}
//LCD_SetDomain:設定窗口區域寫數據
//Xsta , Ysta:起點橫坐標和縱坐標
//Xend , Yend:終點橫坐標和縱坐標
void LCD_SetDomain(u16 Xsta, u16 Ysta,u16 Xend, u16 Yend)
{
if(DeviceCode==0X52)//HX8352
{
LCD_WriteReg(0x02, Xsta>>8);//起點x高八位但由于最大值為239,故高八位始終為0,可不寫
LCD_WriteReg(0x03, Xsta); //起點x低八位
LCD_WriteReg(0x04, Xend>>8);//終點x高八位
LCD_WriteReg(0x05, Xend); //終點x低八位
LCD_WriteReg(0x06, Ysta>>8);//起點y高八位
LCD_WriteReg(0x07, Ysta); //起點y低八位
LCD_WriteReg(0x08, Yend>>8);//終點y高八位
LCD_WriteReg(0x09, Yend); //終點y低八位
}
else
if(DeviceCode==0X9325) //ILI9325
{
#if USE_HORIZONTAL == 0
LCD_WriteReg(0x50, Xsta); //水平GRAM起始位置
LCD_WriteReg(0x51, Xend); //水平GRAM終點位置
LCD_WriteReg(0x52, Ysta); //水平GRAM起始位置
LCD_WriteReg(0x53, Yend); //垂直GRAM終點位置
//50h和52h是起點,51h和53h是終點
#else
LCD_WriteReg(0x50, Ysta); //水平GRAM起始位置
LCD_WriteReg(0x51, Yend); //水平GRAM終點位置
LCD_WriteReg(0x52, 319-Xend); //垂直GRAM起始位置
LCD_WriteReg(0x53, 319-Xsta); //垂直GRAM終點位置
#endif
LCD_WriteReg(0x20, 0x0000);
LCD_WriteReg(0x21, 0x0000);
}
LCD_WR_REG(WriteGram); //準備寫入ram
}
在上面代碼中,為什么寫50H~53H寫數據時坐標特別呢,因為上一篇說過,ILI9325的GRAM地址與屏幕的對應關系是不會改變的,不管怎么設置50H和51H始終是豎屏時的橫坐標,52H和53H始終和豎屏時的縱坐標一樣,這樣一來,只能坐標轉換了,橫屏時看上去的坐標轉換到豎屏的坐標圖上去,使(0,0)位置通過程序映射到橫屏時的左上角,好了,ILI9325的筆記到此為止,摸清了ILI9325,相信其他液晶控制IC也能舉一反三了。
|