- #include <reg51.h>
- #include "gui.h"
- #include "touch.h"
- /****************************************************************************
- *函數名:main
- *輸 入:無
- *輸 出:無
- *功 能:主函數
- ****************************************************************************/
- void main(void)
- {
- uchar rst;
- //--多出來兩個值使用來在內存上面跟別的變量分隔的--//
- uchar xValue[5] = {0, 0, 0, 0, 0}, yValue[5] = {0, 0, 0, 0, 0};
- long x, y;
- TFT_Init();
- rst = 1;
- /* 觸摸校正,默認使用開機不校正,如果觸摸正對可以改正,該函數里面的校正點 */
- /* 或者定義USE_TOUCH_ADJUST開啟開機校正,定義在touch.h的44行 */
- TOUCH_Adjust();
- while(1)
- {
- if(rst ==1)
- {
- TFT_ClearScreen(0xFFFF); //黑色
- GUI_WriteASCII(190, 0, "RST", 0xF800, 0xFFFF);
- GUI_Write32CnChar(60, 20, "普中科技", 0xF800, 0xFFFF);
- GUI_Line(60, 50, 188, 50, 0xF800);
-
- rst = 0;
- }
- if(TOUCH_XPT_ReadXY() == 1)
- {
- //--如果觸摸跟顯示發生偏移,可以根據顯示AD值--//
- //--調整下面公式里面的數值--//
- x = xpt_xy.y * TouchAdj.xFactor / LCD_ADJ_MUX + TouchAdj.xOffset;
- y = xpt_xy.x * TouchAdj.yFactor / LCD_ADJ_MUX + TouchAdj.yOffset;
- if (x > 240 )
- {
- x = 239;
- }
- if (y > 400)
- {
- y = 399;
- }
- x = 239 - x;
- y = 399 - y;
-
- if ((x > 190) && (y < 24))
- {
- rst = 1;
- }
- else
- {
- GUI_Dot((uint)x, (uint)y, 0xF800); //畫點
- //
- // //--計算讀取到的AD值--//
- // //--由于添加了顯示AD值,計算需要時間,所以觸摸有一點延遲--//
- // xValue[0] = (xpt_xy.x % 10000 /1000) + '0';
- // xValue[1] = (xpt_xy.x % 1000 /100) + '0';
- // xValue[2] = (xpt_xy.x % 100 /10) + '0';
- // xValue[3] = (xpt_xy.x % 10) + '0';
- // yValue[0] = (xpt_xy.y % 10000 /1000) + '0';
- // yValue[1] = (xpt_xy.y % 1000 /100) + '0';
- // yValue[2] = (xpt_xy.y % 100 /10) + '0';
- // yValue[3] = (xpt_xy.y % 10) + '0';
- // //--顯示AD值--//
- // GUI_WriteASCII(0, 370, "X:", 0xF800, 0xFFFF);
- // GUI_WriteASCII(32, 370, xValue, 0xF800, 0xFFFF);
- // GUI_WriteASCII(119, 370, "Y:", 0xF800, 0xFFFF);
- // GUI_WriteASCII(151, 370, yValue, 0xF800, 0xFFFF);
- }
- }
- }
- }
- #include"R61509.h"
- /****************************************************************************
- *函數名:TFT_WriteCmd
- *輸 入:cmd:寫入的十六命令
- * * cmh:寫入的18位命令中的最高兩位
- *輸 出:
- *功 能:向TFT屏寫入18位數據。
- ****************************************************************************/
- void TFT_WriteCmd(uint cmd)
- {
- uchar cmdH, cmdL;
- cmdH = cmd >> 8;
- cmdL = cmd & 0x00FF;
- TFT_WR = 1;
- TFT_CS = 0; //打開片選
- TFT_RS = 0; //選擇寫命令
- /* 放置數據 */
- TFT_DATAPORTH = cmdH;
- TFT_DATAPORTL = cmdL;
- TFT_WR=0;
- TFT_WR=1;
- TFT_CS=1; //關閉片選
- }
- /****************************************************************************
- *函數名:TFT_WriteData
- *輸 入:dat:寫入的16位數據
- * * dah:寫入的18位數據中的最高2位
- *輸 出:
- *功 能:向TFT屏寫入18位命令。
- ****************************************************************************/
- void TFT_WriteData(uint dat)
- {
- uchar datH, datL;
- datH = dat >> 8;
- datL = dat & 0x00FF;
- TFT_WR = 1;
- TFT_CS = 0; //打開片選
- TFT_RS = 1; //選擇寫數據
-
- /* 放置數據 */
- TFT_DATAPORTH = datH;
- TFT_DATAPORTL = datL;
- TFT_WR=0;
- TFT_WR=1;
-
- TFT_CS=1;//關閉片選
- }
- /****************************************************************************
- *函數名: TFT_WriteCmdData
- *輸 入:cmd:16位命令
- * * dat:16位數據
- *輸 出:
- *功 能:向TFT屏先寫入16位命令。在寫入16位數據
- ****************************************************************************/
- void TFT_WriteCmdData(uint cmd, uint dat)
- {
- TFT_WriteCmd(cmd);
- TFT_WriteData(dat);
- }
- /****************************************************************************
- *函數名: TFT_Init
- *輸 入:無
- *輸 出:無
- *功 能:初始化TFT屏
- ****************************************************************************/
- void TFT_Init(void)
- {
- uint i;
-
- TFT_CS=1; //關閉片選
- TFT_RD=1; //IO初始化
- TFT_WR=1; //IO初始化
-
- TFT_RST = 1;
- for(i=500; i>0; i--);
- TFT_RST = 0;
- for(i=500; i>0; i--);
- TFT_RST = 1;
- for(i=5000; i>0; i--);
-
- TFT_CS =0; //打開片選使能
- for(i=0; i<500; i++);
- TFT_WriteCmdData(0x0400,0x3102);
- TFT_WriteCmdData(0x0007,0x0021);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0110,0x0001);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0100,0x17B0);
- TFT_WriteCmdData(0x0112,0x0060);
- TFT_WriteCmdData(0x0010,0x001F);
- TFT_WriteCmdData(0x0101,0x0014);
- TFT_WriteCmdData(0x0102,0x019E);
- TFT_WriteCmdData(0x0103,0x3200);
- TFT_WriteCmdData(0x0107,0x0000);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0102,0x01BE);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0001,0x0100);
- TFT_WriteCmdData(0x0002,0x0000);
- TFT_WriteCmdData(0x0003,0x1230);
- TFT_WriteCmdData(0x0008,0x0808);
- TFT_WriteCmdData(0x0009,0x0000);
- TFT_WriteCmdData(0x000B,0x0010);
- TFT_WriteCmdData(0x000C,0x0000);
- TFT_WriteCmdData(0x0090,0x0000);
- TFT_WriteCmdData(0x0300,0x0706);
- TFT_WriteCmdData(0x0301,0x0206);
- TFT_WriteCmdData(0x0302,0x0002);
- TFT_WriteCmdData(0x0303,0x0201);
- TFT_WriteCmdData(0x0304,0x0300);
- TFT_WriteCmdData(0x0305,0x0207);
- TFT_WriteCmdData(0x0306,0x1416);
- TFT_WriteCmdData(0x0307,0x0706);
- TFT_WriteCmdData(0x0308,0x0206);
- TFT_WriteCmdData(0x0309,0x0002);
- TFT_WriteCmdData(0x030A,0x0201);
- TFT_WriteCmdData(0x030B,0x0300);
- TFT_WriteCmdData(0x030C,0x0207);
- TFT_WriteCmdData(0x030D,0x090B);
- //gamma
- TFT_WriteCmdData(0x0210,0x0000);
- TFT_WriteCmdData(0x0211,0x00EF);
- TFT_WriteCmdData(0x0212,0x0000);
- TFT_WriteCmdData(0x0213,0x018F);
- TFT_WriteCmdData(0x0401,0x0000);
- TFT_WriteCmdData(0x0404,0x0000);
- TFT_WriteCmdData(0x0010,0x0010);
- TFT_WriteCmdData(0x0011,0x0002);
- TFT_WriteCmdData(0x0012,0x0100);
- TFT_WriteCmdData(0x0101,0x0017);
- TFT_WriteCmdData(0x0200,0x0000);
- TFT_WriteCmdData(0x0201,0x0000);
- TFT_WriteCmd(0x0202);
- //display on
- TFT_WriteCmdData(0x0007,0x0021);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0007,0x0061);
- for(i=0; i<5000; i++);
- TFT_WriteCmdData(0x0007,0x0173);
- for(i=0; i<5000; i++);
- TFT_WriteCmd(0x0202);
- }
- /****************************************************************************
- *函數名:void TFT_Setwindow
- *輸入:xStart:其實X坐標
- * * yStart:其實Y坐標
- * * xEnd:結束X坐標
- * * yEnd:結束Y坐標
- *輸出:
- *功能:設置窗口的范圍,起始地址和終止地址。
- ****************************************************************************/
- void TFT_SetWindow(uint xStart, uint yStart,uint xEnd, uint yEnd)
- {
- TFT_WriteCmdData(0x200, xStart);
- TFT_WriteCmdData(0x201, yStart);
- TFT_WriteCmdData(0x0210, xStart);
- TFT_WriteCmdData(0x0212,yStart);
- TFT_WriteCmdData(0x211,xEnd);
- TFT_WriteCmdData(0x213,yEnd);
- TFT_WriteCmd(0x0202);
- }
- /****************************************************************************
- *函數名:TFT_ClearScreen
- *輸 入:backColor:16位真彩數值
- *輸 出:
- *功 能:清屏并涂上顏色。
- ****************************************************************************/
- void TFT_ClearScreen(uint color)
- {
- uint i, j;
- TFT_SetWindow(0,0,TFT_XMAX,TFT_YMAX); //作用區域
- for(i=0; i<TFT_XMAX+1; i++)
- {
- for (j=0; j<TFT_YMAX+1; j++)
- {
- TFT_WriteData(color);
- }
- }
- }
- #include"gui.h"
- //---漢字的字庫頭文件---//
- #include"charcode.h"
- //---如果要顯示圖片就添加這個頭文件---//
- #ifdef PICTURE_SHOW
- #include"picture.h"
- #endif
- /****************************************************************************
- *函數名:GUI_Dot
- *輸 入:x:點的X坐標
- * * y:點的Y坐標
- * * color:點的顏色
- *輸 出:
- *功 能:給一塊3*3像素涂上顏色。
- ****************************************************************************/
- void GUI_Dot(uint x, uint y, uint color)
- {
- uchar i;
- TFT_SetWindow(x - 1, y - 1, x + 1, y + 1); //單個像素
- for(i=0; i<9; i++)
- {
- TFT_WriteData(color);
- }
- }
- /****************************************************************************
- *函數名:GUI_DrowSign
- *輸 入:x:標記的X坐標;
- * * y:標記的Y坐標
- * * color:標記的顏色
- *輸 出:
- *功 能:畫一個十字的標記
- ****************************************************************************/
- void GUI_DrowSign(uint x, uint y, uint color)
- {
- uchar i;
- TFT_SetWindow(x-3, y, x+3, y);
- for(i=0; i<7; i++)
- {
- TFT_WriteData(color);
- }
- TFT_SetWindow(x, y-3, x, y+3);
- for(i=0; i<7; i++)
- {
- TFT_WriteData(color);
- }
- }
- ///****************************************************************************
- //*函數名:GUI_Box
- //*輸 入: sx, sy, ex, ey, color
- //*輸 出:
- //*功 能:給一個區域涂上顏色。
- //****************************************************************************/
- //void GUI_Box(uint sx, uint sy, uchar ex, uint ey, uint color)
- //{
- // uint temp;
- // TFT_SetWindow(sx, sy, ex, ey);
- // sx = ex - sx + 1;
- // sy = ey - sy + 1;
- // while (sx--)
- // {
- // temp = sy;
- // while (temp--)
- // {
- // TFT_WriteData(color);
- // }
- // }
- //}
- /****************************************************************************
- *函數名:GUI_Line
- *輸 入:xStart:直線的起始X坐標
- * * yStart:直線的其實Y坐標
- * * xEnd:直線的結束X坐標
- * * yEnd:直線的結束Y坐標
- * * color:直線的顏色
- *輸 出:
- *功 能:畫一條直線
- ****************************************************************************/
- void GUI_Line(uint xStart, uint yStart, uchar xEnd, uint yEnd, uint color)
- {
- uint t;
- int xerr = 0, yerr = 0, delta_x, delta_y, distance;
- int incx, incy;
- uint row, col;
- delta_x = xEnd - xStart;//計算坐標增量
- delta_y = yEnd - yStart;
- col = xStart;
- row = yStart;
- if (delta_x > 0)
- {
- incx=1;//設置單步方向
- }
- else
- {
- if (delta_x == 0)
- {
- incx = 0;//垂直線
- }
- else
- {
- incx = -1;
- delta_x = -delta_x;
- }
- }
- if (delta_y > 0)
- {
- incy = 1;
- }
- else
- {
- if (delta_y == 0)
- {
- incy = 0;//水平線
- }
- else
- {
- incy = -1;
- delta_y = -delta_y;
- }
- }
- if (delta_x > delta_y)
- {
- distance = delta_x;//選取基本增量坐標軸
- }
- else
- {
- distance = delta_y;
- }
- for (t=0; t<=distance+1; t++)
- { //畫線輸出
- GUI_Dot(col, row, color);
- xerr += delta_x;
- yerr += delta_y;
- if(xerr > distance)
- {
- xerr -= distance;
- col += incx;
- }
- if(yerr > distance)
- {
- yerr -= distance;
- row += incy;
- }
- }
- }
- /****************************************************************************
- *函數名:GUI_WriteCnChar
- *輸 入:x:漢字顯示的X坐標
- * * y:漢字顯示的Y坐標
- * * cn:要顯示的漢字
- * * wordColor:文字的顏色
- * * backColor:背景顏色
- *輸 出:
- *功 能:寫二號楷體漢字
- ****************************************************************************/
- #ifdef CHAR32_SHOW
- void GUI_Write32CnChar(uint x, uint y, uchar *cn, uint wordColor, uint backColor)
- {
- uchar i, j, wordNum;
- uint color;
- while (*cn != '\0')
- {
- TFT_SetWindow(x, y, x+31, y+28);
- for (wordNum=0; wordNum<20; wordNum++)
- { //wordNum掃描字庫的字數
- if ((CnChar32x29[wordNum].Index[0]==*cn)
- &&(CnChar32x29[wordNum].Index[1]==*(cn+1)))
- {
- for(i=0; i<116; i++)
- { //MSK的位數
- color=CnChar32x29[wordNum].Msk[i];
- for(j=0;j<8;j++)
- {
- if((color&0x80)==0x80)
- {
- TFT_WriteData(wordColor);
- }
- else
- {
- TFT_WriteData(backColor);
- }
- color<<=1;
- }//for(j=0;j<8;j++)結束
- }
- }
- } //for (wordNum=0; wordNum<20; wordNum++)結束
- cn += 2;
- x += 32;
- }
- }
- #endif
- /****************************************************************************
- *函數名:GUI_WriteEnChar
- *輸 入:x:字母顯示的X坐標
- * * y:字母顯示的Y坐標
- * * cn:要顯示的字母
- * * wordColor:文字的顏色
- * * backColor:背景顏色
- *輸 出:
- *功 能:寫四號字字母
- ****************************************************************************/
- #ifdef CHAR14_SHOW
- void GUI_Write14CnChar(uint x,uint y,uchar *cn,uint wordColor,uint backColor)
- {
- uchar i, j, wordNum;
- uint color;
- while (*cn != '\0')
- {
- TFT_SetWindow(x, y, x+23, y+18);
- for (wordNum=0; wordNum<20; wordNum++)
- { //wordNum掃描字庫的字數
- if ((CnChar19x24[wordNum].Index[0]==*cn)
- &&(CnChar19x24[wordNum].Index[1]==*(cn+1)))
- {
- for(i=0; i<57; i++)
- { //MSK的位數
- color=CnChar19x24[wordNum].Msk[i];
- for(j=0;j<8;j++)
- {
- if((color&0x80)==0x80)
- {
- TFT_WriteData(wordColor);
- }
- else
- {
- TFT_WriteData(backColor);
- }
- color<<=1;
- }//for(j=0;j<8;j++)結束
- }
- }
- } //for (wordNum=0; wordNum<20; wordNum++)結束
- cn += 2;
- x += 24;
- }
- }
- #endif
- /****************************************************************************
- *函數名:GUI_WriteASCII
- *輸 入:x:字母顯示的X坐標
- * * y:字母顯示的Y坐標
- * * cn:要顯示的字母
- * * wordColor:文字的顏色
- * * backColor:背景顏色
- *輸 出:
- *功 能:寫16X24的ASCII字符
- ****************************************************************************/
- #ifdef USE_ASCII
- void GUI_WriteASCII(uint x, uint y, uchar *p, uint wordColor, uint backColor)
- {
- uchar j, wordByte,wordNum;
- uint color;
- while(*p != '\0')
- {
- wordNum = *p - 32;
- TFT_SetWindow(x,y,x+15, y+23);
- for (wordByte=0; wordByte<48; wordByte++)
- {
- color = ASCII16x24[wordNum][wordByte];
- for (j=0; j<8; j++)
- {
- if ((color&0x80) == 0x80)
- {
- TFT_WriteData(wordColor);
- }
- else
- {
- TFT_WriteData(backColor);
- }
- color <<= 1;
- }
- }
- p++;
- x +=16;
- }
- }
- #endif
- /****************************************************************************
- *函數名:GUI_ShowPicture
- *輸 入:x:圖片顯示起始X坐標
- * * y:圖片顯示起始Y坐標
- * * wide:圖片的寬度
- * * high:圖片的高度
- *輸 出:
- *功 能:顯示一張圖片(取自picture.h中的pic[]數組,換圖片直接替換掉pic數組就
- * * 可以了)
- ****************************************************************************/
- #ifdef PICTURE_SHOW
- void GUI_ShowPicture(uint x, uint y, uchar wide, uint high)
- {
- uint temp = 0, tmp = 0, num = 0;
- TFT_SetWindow(x, y, x+wide-1, y+high-1);
- num = wide * high * 2;
- do
- {
- temp = pic[tmp + 1];
- temp = temp << 8;
- temp = temp | pic[tmp];
- TFT_WriteData(temp);//逐點顯示
- tmp += 2;
- }
- while(tmp < num);
- }
- #endif
- #include"touch.h"
- PosTypeDef TouchAdj; //定義一陣數據用來保存校正因數
- XPT_XY xpt_xy; //定義一個全局變量保存X、Y的值
- #define XY_READ_TIMS 10 //讀取的次數
- /****************************************************************************
- *函數名:TOUCH_SPI_Start
- *輸 入:無
- *輸 出:無
- *功 能:初始化觸摸SPI
- ****************************************************************************/
- void TOUCH_SPI_Start(void)
- {
- TOUCH_CLK = 0;
- TOUCH_CS = 1;
- TOUCH_DIN = 1;
- TOUCH_CLK = 1;
- TOUCH_CS = 0;
- }
- /****************************************************************************
- *函數名:TOUCH_SPI_Write
- *輸 入:dat:寫入數據
- *輸 出:無
- *功 能:使用SPI寫入數據
- ****************************************************************************/
- void TOUCH_SPI_Write(uchar dat)
- {
- uchar i;
- TOUCH_CLK = 0;
- for(i=0; i<8; i++)
- {
- TOUCH_DIN = dat >> 7; //放置最高位
- dat <<= 1;
- TOUCH_CLK = 0; //上升沿放置數據
- TOUCH_CLK = 1;
- }
- }
- /****************************************************************************
- *函數名:TOUCH_SPI_Read
- *輸 入:無
- *輸 出:dat:讀取 到的數據
- *功 能:使用SPI讀取數據
- ****************************************************************************/
- uint TOUCH_SPI_Read(void)
- {
- uint i, dat=0;
- TOUCH_CLK = 0;
- for(i=0; i<12; i++) //接收12位數據
- {
- dat <<= 1;
- TOUCH_CLK = 1;
- TOUCH_CLK = 0;
- dat |= TOUCH_DOUT;
- }
- return dat;
- }
- /****************************************************************************
- *函數名:TOUCH_XPT_ReadData
- *輸 入:cmd:讀取的X或者Y
- *輸 出:endValue:最終信號處理后返回的值
- *功 能:讀取觸摸數據
- ****************************************************************************/
- uint TOUCH_XPT_ReadData(uchar cmd)
- {
- uchar i, j;
- uint readValue[XY_READ_TIMS];
- long endValue;
- TOUCH_CLK = 0; //先拉低時間
- TOUCH_CS = 0; //選中芯片
-
- for(i=0; i<XY_READ_TIMS; i++) //讀取XY_READ_TIMS次結果
- {
- TOUCH_SPI_Write(cmd); //發送轉換命令
- //Delay_6us();
- for(j=6; j>0; j--); //延時等待轉換結果
- TOUCH_CLK = 1; //發送一個時鐘周期,清除BUSY
- _nop_();
- _nop_();
- TOUCH_CLK = 0;
- _nop_();
- _nop_();
-
- readValue[i] = TOUCH_SPI_Read();
- }
- TOUCH_CS = 1; //釋放片選
- //---軟件濾波---//
- //---先大到小排序,除去最高值,除去最低值,求其平均值---//
- for(i=0; i<XY_READ_TIMS - 1; i++) //從大到小排序
- {
- for(j= i+1; j<XY_READ_TIMS; j++)
- {
- if(readValue[i] < readValue[j])
- {
- endValue = readValue[i];
- readValue[i] = readValue[j];
- readValue[j] = endValue;
- }
- }
- }
- // if((readValue[2] - readValue[3]) > 5)
- // {
- // return 0;
- // }
- endValue = 0;
- for(i=2; i<XY_READ_TIMS-2; i++)
- {
- endValue += readValue[i];
- }
- endValue = endValue/ (XY_READ_TIMS - 4);//求平均值
- return endValue;
- }
- /****************************************************************************
- *函數名:TOUCH_XPT_ReadXY
- *輸 入:無
- *輸 出:1:成功 0:失敗
- *功 能:讀取XY的AD值
- ****************************************************************************/
- uchar TOUCH_XPT_ReadXY(void)
- {
- uint x1, x2, x, y1, y2, y;
- TOUCH_SPI_Start();
- //---分別讀兩次X值和Y值, 交叉著讀可以提高一些讀取精度---//
- x1 = TOUCH_XPT_ReadData(XPT_CMD_X);
- y1 = TOUCH_XPT_ReadData(XPT_CMD_Y);
- x2 = TOUCH_XPT_ReadData(XPT_CMD_X);
- y2 = TOUCH_XPT_ReadData(XPT_CMD_Y);
- //---求取X值的差值---//
- if (x1 > x2)
- {
- x = x1 - x2;
- }
- else
- {
- x = x2 - x1;
- }
- //---求取Y值的差值---//
- if (y1 > y2)
- {
- y = y1 - y2;
- }
- else
- {
- y = y2 - y1;
- }
- //---判斷差值是否大于50,大于就返回0,表示讀取失敗---//
- if((x > 50) || (y > 50))
- {
- return 0;
- }
- //---求取兩次讀取值的平均數作為讀取到的XY值---//
- xpt_xy.x = (x1 + x2) / 2;
- xpt_xy.y = (y1 + y2) / 2;
- xpt_xy.x &= 0xFFF0; //去掉低四位
- xpt_xy.y &= 0xFFF0;
- //---確定XY值的范圍,用在觸摸屏大于TFT時---//
- if((xpt_xy.x < 100) || (xpt_xy.y > 3900))
- {
- return 0;
- }
- return 1; // 返回1,表示讀取成功
- }
- /****************************************************************************
- *函數名:TOUCH_ReadAdj
- *輸 入:px:讀取到的X坐標值
- * * py:讀取到的Y坐標值
- *輸 出:無
- *功 能:給屏幕校正函數取四個點
- ****************************************************************************/
- void TOUCH_ReadAdj(uint *px, uint *py)
- {
- ulong i = 0;
- XPT_XY pot[4];
- /* 讀取四個定位點的坐標 */
- TFT_ClearScreen(0x0000);
- GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MIN, 0x0FF0);
- while(1)
- {
- if(TOUCH_XPT_ReadXY())
- {
- i++;
- if(i > 10)
- {
- pot[0].x = xpt_xy.x;
- pot[0].y = xpt_xy.y;
- break;
- }
- }
- }
- GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MIN, 0x0000);
- ADJ_CHECK_DELAY;
- GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MAX, 0x0FF0);
- i = 0;
- while(1)
- {
- if(TOUCH_XPT_ReadXY())
- {
- i++;
- if(i > 10)
- {
- pot[1].x = xpt_xy.x;
- pot[1].y = xpt_xy.y;
- break;
- }
- }
- }
- GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MAX, 0x0000);
- ADJ_CHECK_DELAY;
- GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MIN, 0x0FF0);
- i = 0;
- while(1)
- {
- if(TOUCH_XPT_ReadXY())
- {
- i++;
- if(i > 10)
- {
- pot[2].x = xpt_xy.x;
- pot[2].y = xpt_xy.y;
- break;
- }
- }
- }
- GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MIN, 0x0000);
- ADJ_CHECK_DELAY;
- GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MAX, 0x0FF0);
- i = 0;
- while(1)
- {
- if(TOUCH_XPT_ReadXY())
- {
- i++;
- if(i > 10)
- {
- pot[3].x = xpt_xy.x;
- pot[3].y = xpt_xy.y;
- break;
- }
- }
- }
- GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MAX, 0x0000);
- /* 處理讀取到的四個點的數據,整合成對角的兩個點 */
- #if LCD_TOUCH_TYPE == 0
- px[0] = (pot[0].x + pot[1].x) / 2;
- py[0] = (pot[0].y + pot[2].y) / 2;
- px[1] = (pot[3].x + pot[2].x) / 2;
- py[1] = (pot[3].y + pot[1].y) / 2;
- #endif
- #if LCD_TOUCH_TYPE == 1
- px[0] = (pot[0].x + pot[2].x) / 2;
- py[0] = (pot[0].y + pot[1].y) / 2;
- px[1] = (pot[3].x + pot[1].x) / 2;
- py[1] = (pot[3].y + pot[2].y) / 2;
- #endif
- }
- /****************************************************************************
- *函數名:TOUCH_Adjust
- *輸 入:無
- *輸 出:無
- *功 能:觸摸屏校正
- ****************************************************************************/
- void TOUCH_Adjust(void)
- {
- uint px[2], py[2];
- float xFactor, yFactor;
- /* 定位取點 */
- #ifdef USE_TOUCH_ADJUST
- TOUCH_ReadAdj(px, py);
- #else
- /* 將(10,10)和(TFT_XMAX - 10, TFT_YMAX - 10) 的坐標填上就不用每次開機都要校正了*/
- px[0] = 3664;
- py[0] = 3696;
- px[1] = 336;
- py[1] = 528;
-
- #endif
- #if LCD_TOUCH_TYPE == 0
- /* 求出比例因數 */
- xFactor = (float)LCD_ADJx / (px[1] - px[0]);
- yFactor = (float)LCD_ADJy / (py[1] - px[0]);
- /* 求出偏移量 */
- TouchAdj.xOffset = (int)LCD_ADJX_MAX - ((float)px[1] * xFactor + 0.5);
- TouchAdj.yOffset = (int)LCD_ADJY_MAX - ((float)py[1] * yFactor + 0.5);
- /* 將比例因數進行數據處理,然后保存 */
- TouchAdj.xFactor = xFactor * LCD_ADJ_MUX + 0.5;
- TouchAdj.yFactor = yFactor * LCD_ADJ_MUX + 0.5;
- #endif
- #if LCD_TOUCH_TYPE == 1
- /* 求出比例因數 */
- yFactor = (float)LCD_ADJY_MAX / (px[0] - px[1]);
- xFactor = (float)LCD_ADJX_MAX / (py[0] - py[1]);
- /* 將比例因數進行數據處理,然后保存 */
- TouchAdj.xFactor = xFactor * LCD_ADJ_MUX + 0.5;
- TouchAdj.yFactor = yFactor * LCD_ADJ_MUX + 0.5;
- /* 求出偏移量 */
- TouchAdj.xOffset = (int)LCD_ADJX_MAX - ((float)py[0] * xFactor + 0.5);
- TouchAdj.yOffset = (int)LCD_ADJY_MAX - ((float)px[0] * yFactor + 0.5);
- #endif
- }
復制代碼 |