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