在移植前, 仔細(xì)閱讀UC/GUI 3.90的用戶手冊(cè)中關(guān)于顯示驅(qū)動(dòng)與UC/GUI底層配置信息. 在UC/GUI用戶手冊(cè)中, UC/GUI按接口連接類型分成了幾大類, 分別為完全總線型, 簡(jiǎn)單總線型, 4腳SPI, 3腳SPI, IIC型. 從手冊(cè)中得知, 本電路中TFT4267與ARM的連接方式屬于簡(jiǎn)單總線型.
移植工作主要是修改LCDConf.h和LCD驅(qū)動(dòng)文件的編寫, UC/GUI也提供了一些芯片的驅(qū)動(dòng)文件, 可以從中選擇一個(gè)接口連接類型相同的芯片驅(qū)動(dòng)文件來(lái)修改. 本移植使用LCDSLin.c驅(qū)動(dòng)文件作為參照.
LCDConf.h文件的修改
LCD的大小、顏色,對(duì)應(yīng)的LCD控制器以及與硬件連接有關(guān)的LCD讀寫函數(shù)在該文件中定義, 按照UC/GUI 的規(guī)定,底層的讀寫LCD函數(shù)包括LCD_WRITE_A1()(即寫LCD命令)、LCD_WRITE_A0()(寫LCD數(shù)據(jù))、 LCD_READ_A0()(讀LCD狀態(tài))、LCD_READ_A1()(讀LCD數(shù)據(jù)),以及LCD初始化函數(shù) LCD_CONTROLLER_INIT(), 這些函數(shù)的實(shí)現(xiàn)與底層硬件有關(guān),必須根據(jù)硬件連接的具體情況編寫這些函數(shù)。其中LCD的四個(gè)讀寫函數(shù)不是都要編寫的, 通常根據(jù)情況三個(gè)就可以了, LCD_READ_A0讀狀態(tài)函數(shù)在LCD_WAIT()中使用, 如果LCD寫數(shù)據(jù)不需要等待, 該函數(shù)可以定義為空操作. LCD_READ_A1讀數(shù)據(jù)函數(shù)在獲取像素點(diǎn)顏色值_GetPixel()中時(shí)調(diào)用, 如果UC/GUI的顯示緩存選項(xiàng)打開(kāi), 此函數(shù)也可定義為空操作. LCD_CONTROLLER_INIT()宏在LCD_L0_Init()函數(shù)中調(diào)用, 以初始化LCD, 此宏也非必需, 如果沒(méi)有定義該宏, 必須提供一個(gè)LCD初始化函數(shù)給LCD_L0_Init()函數(shù)調(diào)用.
本文具體實(shí)現(xiàn)如下:
#define S6D0129_CMD (*((volatile unsigned short *) 0x83200000))
#define S6D0129_DAT (*((volatile unsigned short *) 0x83200002))
#define LCD_WRITE_A1(dat) LCD_Write01(dat) //write command
#define LCD_WRITE_A0(dat) LCD_Write00(dat) //write data
#define LCD_READ_A1() LCD_Read01() //read data
void LCD_Write00(unsigned short dat)
{
S6D0129_DAT = dat;
}
void LCD_Write01(unsigned short dat)
{
S6D0129_CMD = dat;
}
unsigned short LCD_Read01(void)
{
unsigned short r;
r= S6D0129_DAT;
return(r);
}
驅(qū)動(dòng)文件的編寫
下表中的函數(shù)為UC/GUI上層各模塊調(diào)用硬件功能的接口函數(shù), 而它們又調(diào)用用戶編寫的幾個(gè)基本的函數(shù)如畫點(diǎn), 獲取單個(gè)像素的顏色值等, 因此最基本的移植只需向UC/GUI提供畫點(diǎn)函數(shù)_SetPixel()和獲取像素信息_GetPixel()函數(shù). 下列函數(shù)中關(guān)于像素點(diǎn)位置坐標(biāo)都為int型, 須注意與這些函數(shù)傳遞參數(shù)時(shí)的數(shù)據(jù)類型, 及發(fā)生類型傳換時(shí)編譯器的行為.
表1 硬件接口函數(shù)的名稱和功能
函數(shù)名稱 功 能
LCD_L0_InIt() 顯示初始化
LCD_L0_ReInIt() 重新初始化而不擦除顯示內(nèi)容
LCD_L0_OFF 關(guān)顯示
LCD_L0_ON 開(kāi)顯示
LCD_L0_DrawBitmap() 畫圖
LCD_L0_DrawPixel() 以指定顏色畫點(diǎn)
LCD_L0_DrwaVline() 畫水平線
LCD_L0_DrwaVline() 畫垂直線
LCD_L0_FillRect() 填充一矩形
LCD_L0_XorPixel() 翻轉(zhuǎn)指定點(diǎn)顏色
根據(jù)不同的硬件特性, 可以對(duì)上表中一些函數(shù)實(shí)現(xiàn)進(jìn)行優(yōu)化, 比如UC/GUI提供的LCDSLin.c文件, 其中LCD_L0_DrawBitmap函數(shù)調(diào)用了一個(gè)DrawBitLine1BPP()畫1BPP位圖的函數(shù), 驅(qū)動(dòng)必須向DrawBitLine1BPP()提供XY20FF位置轉(zhuǎn)換函數(shù)及LCD_WRITE, XY20FF的像素坐標(biāo)(x,y)轉(zhuǎn)換為顯示緩沖的偏移量, LCD_WRITE根據(jù)偏移量進(jìn)行畫點(diǎn)的函數(shù).
移植工作最基本的工作實(shí)現(xiàn)_SetPixel()和_GetPixel()函數(shù)兩個(gè)函數(shù)就可以, 優(yōu)化可以慢慢熟悉后再進(jìn)行.