?? lcddrive.c
字號:
/***************************************************************************************** 文件名:LCDDRIVE.C* 功能:TFT6758液晶模塊驅動。驅動芯片為HD66781 (片內224640字節GRAM,即240*(96+320)*18/8),* 門驅動(Gate driver)芯片為HD66783。* * RGB對應值(16位數據,d15--d0):* d15--d11 R色* d10--d5 G色* d4--d0 B色* 寫操作時地址計數器會自動增長,而讀操作則不會自動增長。讀操作時,讀第2個數* 據才是有效的數據****************************************************************************************/#include "lpc2294.h"#include "lcddrive.h"/******************************************************** 名稱: TftSendCom* 功能: 向TFT液晶模塊發送命令字。* 入口參數: com 命令字(uint16)* 出口參數: 無*******************************************************/void TftSendCom(uint16 com){ HD66781_IR = com;}/******************************************************** 名稱: TftSendDat* 功能: 向TFT液晶模塊發送數據。* 入口參數: dat 待發送的數據(uint16)* 出口參數: 無*******************************************************/void TftSendDat(uint16 dat){ HD66781_DR = dat;}/******************************************************** 名稱: TftRcvDat* 功能: 讀取TFT液晶模塊的數據。* 入口參數: 無* 出口參數: 返回值即是讀出的數據*******************************************************/uint16 TftRcvDat(void){ uint16 ret; ret = HD66781_DR; return(ret);}#define MAX_WAIT 10000 /* 等待超時控制值 *//******************************************************** 名稱: TftSerialCom* 功能: 向TFT液晶模塊發送串行命令(HD66781-->HD66783)。* 入口參數: indx 目標寄存器索引* dat 待發送的數據(uint16)* 出口參數: 無*******************************************************/void TftSerialCom(uint16 indx, uint16 dat){ uint32 delay; uint16 bak; TftSendCom(GATEIC_DAT); TftSendDat(dat); // 發送數據 delay = 0; TftSendCom(GATEIC_CON); while(1) { bak = TftRcvDat(); // 讀TE位(0110H寄存器的d8位) if((bak&0x0100) == 0) break; // 若TE=0,表明允許發送數據 delay++; if(delay>MAX_WAIT) return; // 超時操作 } indx |= 0x0100; // 設置TE=1 TftSendDat(indx); // 指定目標寄存器索引}/******************************************************** 名稱: 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) { // 參數過濾 if(x1>239) x1 = 239; if(y1>319) y1 = 319; if((x1<=x0) || (y1<=y0)) return(FALSE); // 設置數據填充窗口大小 TftSendCom(SET_WINDOW_SX); TftSendDat(x0); TftSendCom(SET_WINDOW_SY); TftSendDat(y0); TftSendCom(SET_WINDOW_EX); TftSendDat(x1); 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<1500; 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){ IO0DIR = HD66781_RST; IO0CLR = HD66781_RST; DelaymS(10); IO0SET = HD66781_RST; DelaymS(10); }// 定義TFT6758初始化數據信息STCOM_INI TFT6758_INI[] = { // 設置電源 {HD66783_COM, 0x0001, 0x0474, 0}, // HD66783電壓設置1 {HD66783_COM, 0x0002, 0x02DE, 0}, // HD66783電壓設置2 {HD66783_COM, 0x0001, 0x0C74, 0}, {HD66781_COM, 0x0100, 0x0050, 0}, // HD66781電源控制 {HD66783_COM, 0x0000, 0x080C, 0}, // HD66783電源控制 {HD66783_COM, 0x0002, 0x012E, 0}, {HD66783_COM, 0x0001, 0x04B2, 30}, {HD66783_COM, 0x0001, 0x04F0, 0}, {HD66783_COM, 0x0003, 0x0008, 0}, // HD66783掃描模式設置 {HD66783_COM, 0x0006, 0x09C0, 70}, // HD66783輸出設置 // 打開顯示 {HD66783_COM, 0x0000, 0x0C0A, 0}, {HD66781_COM, 0x0100, 0x0110, 0}, // 電源控制1, STB=0, SLP=0, DSTB=0 (正常工作模式) {HD66781_COM, 0x0007, 0x0001, 50}, {HD66781_COM, 0x0007, 0x0012, 0}, {HD66783_COM, 0x0000, 0x0C08, 0}, {HD66781_COM, 0x0007, 0x0003, 50}, {HD66781_COM, 0x0007, 0x0013, 0}, {HD66781_COM, 0x0007, 0x0113, 0}, // 顯示控制1, D1:D0=11(使能顯示) // 其它設置 {HD66781_COM, 0x0001, 0x0100, 0}, // 驅動輸出控制, SS=1 {HD66781_COM, 0x0002, 0x0700, 0}, // 驅動波形控制 {HD66781_COM, 0x0003, 0x1030, 0}, // 啟動模式設置, HWM=0, ID1:ID0 =11, AM=0 (不使用緩沖, 地址自動更新為"左上"至"右下"方式) // BRG=0, OSD=0, TRI=0 (點象素數據為:RRRRRGGGGGGBBBBB) {HD66781_COM, 0x0004, 0x0000, 0}, // 縮放控制1 {HD66781_COM, 0x0005, 0x0000, 0}, // 縮放控制2 {HD66781_COM, 0x0008, 0x0303, 0}, // 顯示控制2, FP3:FP0=3, BP2:BP0=3 (非顯示周期數) {HD66781_COM, 0x0009, 0x142C, 0}, // 顯示控制3 {HD66781_COM, 0x000B, 0x0000, 0}, // 顯示控制4, FRCON=0, COL1:0=00 (262144色) {HD66781_COM, 0x000C, 0x0001, 0}, // 外部顯示接口控制1 {HD66781_COM, 0x000D, 0x0010, 0}, // 幀周期控制 {HD66781_COM, 0x000E, 0x0210, 0}, // 外部顯示接口控制2 {HD66781_COM, 0x000F, 0x0000, 0}, // 外部顯示接口控制3 {HD66781_COM, 0x0010, 0x0000, 0}, // 門驅動(Gate driver)接口控制1 {HD66781_COM, 0x0011, 0x0000, 0}, // 門驅動(Gate driver)接口控制2 {HD66781_COM, 0x0012, 0x0002, 0}, // 門驅動(Gate driver)接口控制3 {HD66781_COM, 0x0013, 0x0000, 0}, // 門驅動(Gate driver)接口控制4 {HD66781_COM, 0x0015, 0x0000, 0}, // 門驅動(Gate driver)接口控制5 {HD66781_COM, 0x0016, 0x0000, 0}, // 門驅動(Gate driver)接口控制6 {HD66781_COM, 0x0017, 0x0000, 0}, // 門驅動(Gate driver)接口控制7 {HD66781_COM, 0x0018, 0x0005, 0}, // 門驅動(Gate driver)接口控制8 {HD66781_COM, 0x0019, 0x0000, 0}, // 門驅動(Gate driver)接口控制9 {HD66781_COM, 0x001B, 0x0000, 0}, // 門驅動(Gate driver)接口控制10 {HD66781_COM, 0x0200, 0x0000, 0}, // GRAM地址設置(R201H,R200H), 0x0000 {HD66781_COM, 0x0201, 0x0000, 0}, {HD66781_COM, 0x0203, 0x0000, 0}, // GRAM寫屏蔽控制(R204H,R203H), 0x0000 {HD66781_COM, 0x0204, 0x0000, 0}, {HD66781_COM, 0x0210, 0x0000, 0}, // window地址設置(R210H,R211H):水平方向為0--239 (x = 239+1) {HD66781_COM, 0x0211, 0x00EF, 0}, {HD66781_COM, 0x0212, 0x0000, 0}, // window地址設置(R212H,R213H):垂直方向為0--319 (y = 319+1) {HD66781_COM, 0x0213, 0x013F, 0}, {HD66781_COM, 0x0400, 0x0027, 0}, // 液晶光柵行設置,NL0[5:0]=39, 即(39+1)*8=320 {HD66781_COM, 0x0401, 0x0001, 0}, // 基本顯示控制, REV=1(正方向顯示), VLE=0(不滾屏) {HD66781_COM, 0x0402, 0x0000, 0}, // 顯示起始行地址(y), 0 {HD66781_COM, 0x0403, 0x013F, 0}, // 顯示終止行地址(y), 319 {HD66781_COM, 0x0404, 0x0000, 0}, // 滾屏行數, 0 {HD66781_COM, 0x0405, 0x0000, 0}, // 縮放顯示起始行地址(y), 0 {HD66781_COM, 0x0406, 0x0000, 0}, // 縮放顯示終止行地址(y), 0 {DATA_END, 0, 0, 0}};// 定義總線速度控制字 #define BCFG_DEF 0x10000400#define IDCY (0x01<<0)#define WST1 (0x03<<5)#define WST2 (0x03<<11)#define BCFG3_SET (BCFG_DEF | IDCY | WST1 | WST2)/******************************************************** 名稱: TftInit* 功能: 初始化TFT液晶模塊。* 入口參數: 無* 出口參數: 無*******************************************************/void TftInit(void) { STCOM_INI init_dat; int i; BCFG3 = BCFG3_SET; TftReset(); for(i=0; i<100; i++) // 設定最多100條初始化命令 { init_dat = TFT6758_INI[i]; if(init_dat.type==DATA_END) break; if(init_dat.type==HD66783_COM) { TftSerialCom(init_dat.com, init_dat.dat); } else { TftSendCom(init_dat.com); TftSendDat(init_dat.dat); } DelaymS(init_dat.dly); } }/******************************************************** 名稱: TFT_UpdateRects* 功能: 更新LCM顯示區域。更新數據在Framebuffer中。* 入口參數: x,y 更新區域的起始點* w,y 區域寬度和高度* buffer Framebuffer起始地址* 出口參數: 無*******************************************************/void TFT_UpdateRects( int x, int y, // 起始點坐標 int w, int h, // 區域寬度、高度 uint16 *buffer) // Framebuffer起始地址 { int i, j; uint16 *addr;#if SWAP_XY_EN==1 int Xok, Yok; #endif // 需填充區域參數過濾 if(x<0) { w = w + x; x = 0; } if(y<0) { h = h + y; y = 0; } #if SWAP_XY_EN==1 if( x > (GUI_LCM_YMAX-1) || y > (GUI_LCM_XMAX-1) ) { return; } if((x+w) > (GUI_LCM_YMAX-1)) { w = GUI_LCM_YMAX - x; } if((y+h) > (GUI_LCM_XMAX-1)) { h = GUI_LCM_XMAX - y; } #else if( x > (GUI_LCM_XMAX-1) || y > (GUI_LCM_YMAX-1) ) { return; } if((x+w) > (GUI_LCM_XMAX-1)) { w = GUI_LCM_XMAX - x; } if((y+h) > (GUI_LCM_YMAX-1)) { h = GUI_LCM_YMAX - y; } #endif if((w<=0) || (h<=0)) return; /* 若需要交換x、y軸,則Yok = x, Xok = GUI_LCM_XMAX - y-1。則填充矩形算法為: 起點為(GUI_LCM_XMAX - y - h, x); 每一行數據個數為h個字節,共w行數據; 行數據起始點地址:addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i (第i行,n為0--w)。 同一行中,下一點數據地址變化:addr = addr - GUI_LCM_YMAX; 以上所說的"行"、Xok和Yok,是針對液晶屏的。*/#if SWAP_XY_EN==1 Xok = (int)GUI_LCM_XMAX - (y + h); Yok = x; for(i=0; i<w; i++) // 輸出w行數據 { // 計算出更新區域的buffer地址 addr = buffer + ((y + h - 1)*GUI_LCM_YMAX + x) + i; // 輸出一行(w個)數據 TftSetWrite(Xok, Yok); for(j=0; j<h; j++) { TftSendDat(*addr); addr = addr - GUI_LCM_YMAX; } // 指向下一行 Yok++; } #else for(i=0; i<h; i++) // 輸出h行數據 { // 計算出更新區域的buffer地址 addr = buffer + (y*GUI_LCM_XMAX + x); // 輸出一行(w)數據 TftSetWrite(x, y); for(j=0; j<w; j++) { TftSendDat(*addr); addr++; } // 指向下一行 y++; } #endif }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -