?? lcddrive.c
字號:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:TFT4267液晶模塊驅動。驅動芯片為S6D0129 (片內172800字節GRAM,即240*320*18/8),
*
* RGB對應值(16位數據,d15--d0):
* d15--d11 R色
* d10--d5 G色
* d4--d0 B色
* 寫操作時地址計數器會自動增長,而讀操作則不會自動增長。讀操作時,讀第2個數
* 據才是有效的數據
****************************************************************************************/
#include "config.h"
/*******************************************************
* 名稱: TftSendCom
* 功能: 向TFT液晶模塊發送命令字。
* 入口參數: com 命令字(uint16)
* 出口參數: 無
*******************************************************/
void TftSendCom(uint16 com)
{
S6D0129_IR = com; //控制指令
}
/*******************************************************
* 名稱: TftSendDat
* 功能: 向TFT液晶模塊發送數據。
* 入口參數: dat 待發送的數據(uint16)
* 出口參數: 無
*******************************************************/
void TftSendDat(uint16 dat)
{
S6D0129_DR = dat; //數據
}
/*******************************************************
* 名稱: TftRcvDat
* 功能: 讀取TFT液晶模塊的數據。
* 入口參數: 無
* 出口參數: 返回值即是讀出的數據
*******************************************************/
uint16 TftRcvDat(void)
{
uint16 ret;
ret = S6D0129_DR; //儲存接收數據
return(ret);
}
/*******************************************************
* 名稱: TftSetAddr
* 功能: 設置數據地址指針(坐標值)。
* 入口參數: x 橫坐標的值 (0-239)
* y 縱坐標的值 (0-319)
* 出口參數: 設置正確返回TRUE,參數超出范圍返回FALSE
*******************************************************/
uint8 TftSetAddr(uint16 x, uint16 y)
{
TftSendCom(SET_ADDR_X); // 設置地址低8位
TftSendDat(x);
TftSendCom(SET_ADDR_Y); // 設置地址高9位
TftSendDat(y);
if((x<240) && (y<320)) return(TRUE);
else return(FALSE);
}
/*******************************************************
* 名稱: TftSetWrite
* 功能: 設置數據地址指針(坐標值),并發送寫數據命令。
* 接著不斷的寫入數據即可,GRAM地址會自動增加。
* 入口參數: x 橫坐標的值 (0-239)
* y 縱坐標的值 (0-319)
* 出口參數: 設置正確返回TRUE,參數超出范圍返回FALSE
*******************************************************/
uint8 TftSetWrite(uint16 x, uint16 y)
{
uint8 ret;
ret = TftSetAddr(x, y);
TftSendCom(WR_RD_DATA); // 寫數據
return(ret);
}
/*******************************************************
* 名稱: TftSetWindow
* 功能: 設置數據填充窗口大小。
* 入口參數: x0,y0 窗口左上角座標
* x1,y1 窗口右上角座標
* 出口參數: 設置正確返回TRUE,參數錯誤返回FALSE
*******************************************************/
uint8 TftSetWindow(uint16 x0, uint16 y0, uint16 x1, uint16 y1)
{
uint16 hea_hsa;
// 參數過濾
if(x1>239) x1 = 239; //行超過范圍(240),處理
if(y1>319) y1 = 319; //列超過范圍(320),處理
if((x1<=x0) || (y1<=y0)) return(FALSE);
// 設置數據填充窗口大小
hea_hsa = (x1<<8) | x0;
TftSendCom(SET_WINDOW_SX_EX); //行地址設置
TftSendDat(hea_hsa);
TftSendCom(SET_WINDOW_SY); //列地址設置
TftSendDat(y0);
TftSendCom(SET_WINDOW_EY);
TftSendDat(y1);
return(TRUE);
}
/*******************************************************
* 名稱: DelaymS
* 功能: 軟件延時(1mS,與系統時鐘有關)。
* 入口參數: no 延時控制(uint32),值越大延時越長
* 出口參數: 無
*******************************************************/
void DelaymS(uint32 no)
{
uint32 i;
for(; no>0; no--)
{
for(i=0; i<900; i++);
}
}
/****************************************************************************
* 名稱:TFT_FillSCR()
* 功能:全屏填充。直接使用數據填充顯示緩沖區。
* 入口參數:dat 填充的數據
* 出口參數:無
****************************************************************************/
void TFT_FillSCR(uint16 dat)
{
uint16 i, j;
TftSetWindow(0,0, 239, 319);
TftSetWrite(0, 0);
for(i=0; i<GUI_LCM_YMAX; i++) // 歷遍所有行
{
for(j=0; j<GUI_LCM_XMAX; j++) // 歷遍所有行
{
TftSendDat(dat); // 填充數據
}
}
}
/*******************************************************
* 名稱: TftReset
* 功能: 控制TFT液晶模塊復位。
* 入口參數: 無
* 出口參數: 無
*******************************************************/
void TftReset(void)
{
PINSEL1 = PINSEL1 & (~(0x03<<12)); //置
IO0DIR = IO0DIR | S6D0129_RST;
IO0CLR = S6D0129_RST;
DelaymS(10);
IO0SET = S6D0129_RST;
DelaymS(10);
}
// 定義TFT4267初始化數據信息
STCOM_INI TFT4267_INI[] =
{ // 電源設置
{0x0000, 0x0001, 10}, // Start Oscillation
{0x000B, 0x0000, 0}, // Frame cycle setting
{0x000C, 0x0000, 15}, // External display interface setting
{0x0011, 0x2E00, 0}, // Power control2 setting
{0x0014, 0x1119, 0}, // Power control5 setting
{0x0010, 0x1040, 15}, // Power control1 setting
{0x0013, 0x0040, 15}, // Power control4 setting
{0x0013, 0x0060, 15}, // Power control4
{0x0013, 0x0070, 60}, // Power control4
{0x0011, 0x3100, 0}, // Power control2
{0x0010, 0x1600, 20}, // Power control1
// 顯示設置
{0x0001, 0x0927, 0}, // Driver output setting (240x320 mode, GS=0, SS=1)
{0x0002, 0x0700, 0}, // LCD driving waveform setting
{0x0003, 0x1030, 0}, // Entry mode setting (TRI=0, DFM=0, BGR=1, ID1:ID0 =11)
{0x0007, 0x0004, 0}, // Display control1 (VLE2:VLE1=00, REV=1)
{0x0008, 0x0505, 0}, // Display control2
{0x0009, 0x0000, 0}, // ***
{0x0040, 0x0000, 0}, // Gate scan position (start G1 scan)
{0x0041, 0x0000, 0}, // Vertical scroll setting
{0x0042, 319, 0}, // Screen end position (320-1)
{0x0043, 0, 0}, // Screen start position (0)
{0x0044, 0, 0}, // 2th Screen end position
{0x0045, 0, 0}, // 2th Screen start position
{0x0046, 0xEF00, 0}, // window addr set for x0,x1 (0, 239)
{0x0047, 0x013F, 0}, // window addr set for y0 (319)
{0x0048, 0x0000, 20}, // window addr set for y1 (0)
{0x0030, 0x0404, 0}, // Gamma control1
{0x0031, 0x0006, 0}, // Gamma control2
{0x0032, 0x0000, 0}, // Gamma control3
{0x0033, 0x0202, 0}, // Gamma control4
{0x0034, 0x0707, 0}, // Gamma control5
{0x0035, 0x0107, 0}, // Gamma control6
{0x0036, 0x0303, 0}, // Gamma control7
{0x0037, 0x0202, 0}, // Gamma control8
{0x0038, 0x1100, 0}, // Gamma control9
{0x0039, 0x1100, 0}, // Gamma control10
// 打開顯示
{0x0007, 0x0015, 40}, // Display control (GON=1, open disp)
{0x0007, 0x0017, 40},
{0x0020, 0x0000, 0}, // set GRAM addr(AD7--0)
{0x0021, 0x0000, 20}, // set GRAM addr(AD16--8)
{DATA_END, 0, 0}
};
/*******************************************************
* 名稱: TftInit
* 功能: 初始化TFT液晶模塊。
* 入口參數: 無
* 出口參數: 無
*******************************************************/
void TftInit(void)
{
STCOM_INI init_dat;
int i;
TftReset();
for(i=0; i<100; i++) // 設定最多100條初始化命令
{
init_dat = TFT4267_INI[i];
if(init_dat.com==DATA_END) break;
TftSendCom(init_dat.com);
TftSendDat(init_dat.dat);
DelaymS(init_dat.dly);
}
}
/****************************************************************************
* 名稱:GUI_Initialize()
* 功能:初始化GUI,包括初始化顯示緩沖區,初始化LCM并清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_Initialize(void)
{
TftInit(); //初始化TFT顯示屏幕
TFT_FillSCR(GUI_CCOLOR); //清屏色
}
/****************************************************************************
* 名稱:GUI_FillSCR()
* 功能:全屏填充。直接使用數據填充顯示緩沖區。
* 入口參數:dat 填充的數據
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_FillSCR(TCOLOR dat)
{
TFT_FillSCR(dat);
}
/****************************************************************************
* 名稱:GUI_ClearSCR()
* 功能:清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_ClearSCR(void)
{
TFT_FillSCR(GUI_CCOLOR);
}
/****************************************************************************
* 名稱:GUI_Point()
* 功能:在指定位置上畫點。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* color 顯示顏色
* 出口參數:返回值為1時表示操作成功,為0時表示操作失敗。
****************************************************************************/
uint8 GUI_Point(uint16 x, uint16 y, TCOLOR color)
{ /* 參數過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 刷新顯示 */
TftSetWrite(x, y);
TftSendDat(color);
return(1);
}
/****************************************************************************
* 名稱:GUI_ReadPoint()
* 功能:讀取指定位置點的顏色數據。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* 出口參數:返回值即是讀出值(RRRRRGGGGGGBBBBB)。
****************************************************************************/
uint8 GUI_ReadPoint(uint16 x, uint16 y, TCOLOR *ret)
{ uint16 bak;
/* 參數過濾 */
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
/* 讀取數據 */
TftSetAddr(x, y); // 設置地址
TftSendCom(WR_RD_DATA);
bak = TftRcvDat();
bak = TftRcvDat();
*ret = bak;
return(1);
}
/****************************************************************************
* 名稱:GUI_HLine()
* 功能:畫水平線。
* 入口參數:x0 水平線起點所在列的位置
* y0 水平線起點所在行的位置
* x1 水平線終點所在列的位置
* color 顯示顏色
* 出口參數:無
* 說明:操作失敗原因是指定地址超出緩沖區范圍。
****************************************************************************/
void GUI_HLine(uint16 x0, uint16 y0, uint16 x1, TCOLOR color)
{ uint16 bak;
if(x0>x1) // 對x0、x1大小進行排列,以便畫圖
{ bak = x1;
x1 = x0;
x0 = bak;
}
GUI_Point(x0, y0, color); // 顯示第一點
x0++;
while(x1>=x0)
{ TftSendDat(color); // 不斷填充并顯示
x0++;
}
}
/****************************************************************************
* 名稱:GUI_RLine()
* 功能:畫垂直線。
* 入口參數: x0 垂直線起點所在列的位置
* y0 垂直線起點所在行的位置
* y1 垂直線終點所在行的位置
* color 顯示顏色
* 出口參數:無
* 說明:操作失敗原因是指定地址超出緩沖區范圍。
****************************************************************************/
void GUI_RLine(uint16 x0, uint16 y0, uint16 y1, TCOLOR color)
{ uint16 bak;
if(y0>y1) // 對y0、y1大小進行排列,以便畫圖
{ bak = y1;
y1 = y0;
y0 = bak;
}
while(y1>=y0)
{ GUI_Point(x0, y0, color); // 逐點顯示,描出垂直線
y0++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -