找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6988|回复: 3
打印 上一主题 下一主题
收起左侧

TFT3.2-SD-TP彩屏(R61509-16Pins)驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:145818 发表于 2016-11-2 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #include "gui.h"
  3. #include "touch.h"

  4. /****************************************************************************
  5. *函数名:main
  6. *输  入:无
  7. *输  出:无
  8. *功  能:主函数
  9. ****************************************************************************/

  10. void main(void)
  11. {
  12.         uchar rst;
  13.         //--多出来两个值使用来在内存上面跟别的变量分隔的--//
  14.         uchar  xValue[5] = {0, 0, 0, 0, 0}, yValue[5] = {0, 0, 0, 0, 0};
  15.         long x, y;

  16.         TFT_Init();
  17.         rst = 1;
  18.         /* 触摸校正,默认使用开机不校正,如果触摸正对可以改正,该函数里面的校正点 */
  19.         /* 或者定义USE_TOUCH_ADJUST开启开机校正,定义在touch.h的44行 */
  20.         TOUCH_Adjust();
  21.         while(1)
  22.         {
  23.                 if(rst ==1)
  24.                 {        
  25.                         TFT_ClearScreen(0xFFFF); //黑色
  26.                         GUI_WriteASCII(190, 0, "RST", 0xF800, 0xFFFF);
  27.                         GUI_Write32CnChar(60, 20, "普中科技", 0xF800, 0xFFFF);
  28.                         GUI_Line(60, 50, 188, 50, 0xF800);
  29.                         
  30.                         rst = 0;
  31.                 }

  32.                 if(TOUCH_XPT_ReadXY() == 1)
  33.                 {
  34.                         //--如果触摸跟显示发生偏移,可以根据显示AD值--//
  35.                         //--调整下面公式里面的数值--//

  36.             x = xpt_xy.y * TouchAdj.xFactor / LCD_ADJ_MUX + TouchAdj.xOffset;
  37.             y = xpt_xy.x * TouchAdj.yFactor / LCD_ADJ_MUX + TouchAdj.yOffset;

  38.                         if (x > 240 )
  39.                         {
  40.                                 x = 239;
  41.                         }

  42.                         if (y > 400)
  43.                         {
  44.                                 y = 399;
  45.                         }
  46.                         x = 239 - x;
  47.                         y = 399 - y;
  48.                         
  49.                         if ((x > 190) && (y < 24))
  50.                         {
  51.                                 rst = 1;
  52.                         }

  53.                         else
  54.                         {        
  55.                                 GUI_Dot((uint)x, (uint)y, 0xF800);         //画点
  56. //                                 
  57. //                                 //--计算读取到的AD值--//
  58. //                                 //--由于添加了显示AD值,计算需要时间,所以触摸有一点延迟--//
  59. //                                 xValue[0] = (xpt_xy.x % 10000 /1000) + '0';
  60. //                                 xValue[1] = (xpt_xy.x % 1000 /100) + '0';
  61. //                                 xValue[2] = (xpt_xy.x % 100 /10) + '0';
  62. //                                 xValue[3] = (xpt_xy.x % 10) + '0';

  63. //                                 yValue[0] = (xpt_xy.y % 10000 /1000) + '0';
  64. //                                 yValue[1] = (xpt_xy.y % 1000 /100) + '0';
  65. //                                 yValue[2] = (xpt_xy.y % 100 /10) + '0';
  66. //                                 yValue[3] = (xpt_xy.y % 10) + '0';

  67. //                                 //--显示AD值--//
  68. //                                 GUI_WriteASCII(0, 370, "X:", 0xF800, 0xFFFF);
  69. //                                 GUI_WriteASCII(32, 370, xValue, 0xF800, 0xFFFF);        
  70. //                                 GUI_WriteASCII(119, 370, "Y:", 0xF800, 0xFFFF);
  71. //                                 GUI_WriteASCII(151, 370, yValue, 0xF800, 0xFFFF);
  72.                         }
  73.                 }

  74.         }
  75. }
  76. #include"R61509.h"

  77. /****************************************************************************
  78. *函数名:TFT_WriteCmd
  79. *输  入:cmd:写入的十六命令
  80. *      * cmh:写入的18位命令中的最高两位
  81. *输  出:
  82. *功  能:向TFT屏写入18位数据。
  83. ****************************************************************************/

  84. void TFT_WriteCmd(uint cmd)
  85. {
  86.     uchar cmdH, cmdL;

  87.     cmdH = cmd >> 8;
  88.     cmdL = cmd & 0x00FF;

  89.     TFT_WR = 1;
  90.         TFT_CS = 0;        //打开片选
  91.         TFT_RS = 0;        //选择写命令

  92.     /* 放置数据 */
  93.         TFT_DATAPORTH = cmdH;
  94.     TFT_DATAPORTL = cmdL;

  95.         TFT_WR=0;
  96.         TFT_WR=1;

  97.         TFT_CS=1;        //关闭片选
  98. }

  99. /****************************************************************************
  100. *函数名:TFT_WriteData
  101. *输  入:dat:写入的16位数据
  102. *      * dah:写入的18位数据中的最高2位
  103. *输  出:
  104. *功  能:向TFT屏写入18位命令。
  105. ****************************************************************************/

  106. void TFT_WriteData(uint dat)
  107. {
  108.     uchar datH, datL;

  109.     datH = dat >> 8;
  110.     datL = dat & 0x00FF;

  111.     TFT_WR = 1;
  112.         TFT_CS = 0;  //打开片选
  113.         TFT_RS = 1;  //选择写数据
  114.         
  115.         /* 放置数据 */
  116.         TFT_DATAPORTH = datH;
  117.     TFT_DATAPORTL = datL;

  118.         TFT_WR=0;
  119.         TFT_WR=1;
  120.         
  121.         TFT_CS=1;//关闭片选  
  122. }
  123. /****************************************************************************
  124. *函数名: TFT_WriteCmdData
  125. *输  入:cmd:16位命令
  126. *      * dat:16位数据
  127. *输  出:
  128. *功  能:向TFT屏先写入16位命令。在写入16位数据
  129. ****************************************************************************/

  130. void TFT_WriteCmdData(uint cmd, uint dat)
  131. {
  132.         TFT_WriteCmd(cmd);
  133.         TFT_WriteData(dat);        
  134. }
  135. /****************************************************************************
  136. *函数名: TFT_Init
  137. *输  入:无
  138. *输  出:无
  139. *功  能:初始化TFT屏
  140. ****************************************************************************/

  141. void TFT_Init(void)
  142. {
  143.         uint i;
  144.         
  145.         TFT_CS=1;   //关闭片选
  146.         TFT_RD=1;        //IO初始化                                
  147.         TFT_WR=1;        //IO初始化
  148.         
  149.         TFT_RST = 1;
  150.         for(i=500; i>0; i--);
  151.         TFT_RST = 0;
  152.         for(i=500; i>0; i--);
  153.         TFT_RST = 1;
  154.         for(i=5000; i>0; i--);        
  155.         
  156.         TFT_CS =0;  //打开片选使能
  157.         for(i=0; i<500; i++);

  158.     TFT_WriteCmdData(0x0400,0x3102);
  159.     TFT_WriteCmdData(0x0007,0x0021);
  160.     for(i=0; i<5000; i++);
  161.     TFT_WriteCmdData(0x0110,0x0001);
  162.     for(i=0; i<5000; i++);  
  163.     TFT_WriteCmdData(0x0100,0x17B0);
  164.     TFT_WriteCmdData(0x0112,0x0060);
  165.     TFT_WriteCmdData(0x0010,0x001F);
  166.     TFT_WriteCmdData(0x0101,0x0014);
  167.     TFT_WriteCmdData(0x0102,0x019E);
  168.     TFT_WriteCmdData(0x0103,0x3200);
  169.     TFT_WriteCmdData(0x0107,0x0000);
  170.     for(i=0; i<5000; i++);
  171.     TFT_WriteCmdData(0x0102,0x01BE);
  172.     for(i=0; i<5000; i++);  

  173.     TFT_WriteCmdData(0x0001,0x0100);
  174.     TFT_WriteCmdData(0x0002,0x0000);
  175.     TFT_WriteCmdData(0x0003,0x1230);
  176.     TFT_WriteCmdData(0x0008,0x0808);
  177.     TFT_WriteCmdData(0x0009,0x0000);
  178.     TFT_WriteCmdData(0x000B,0x0010);
  179.     TFT_WriteCmdData(0x000C,0x0000);
  180.     TFT_WriteCmdData(0x0090,0x0000);
  181.     TFT_WriteCmdData(0x0300,0x0706);
  182.     TFT_WriteCmdData(0x0301,0x0206);
  183.     TFT_WriteCmdData(0x0302,0x0002);
  184.     TFT_WriteCmdData(0x0303,0x0201);
  185.     TFT_WriteCmdData(0x0304,0x0300);
  186.     TFT_WriteCmdData(0x0305,0x0207);
  187.     TFT_WriteCmdData(0x0306,0x1416);
  188.     TFT_WriteCmdData(0x0307,0x0706);

  189.     TFT_WriteCmdData(0x0308,0x0206);
  190.     TFT_WriteCmdData(0x0309,0x0002);
  191.     TFT_WriteCmdData(0x030A,0x0201);
  192.     TFT_WriteCmdData(0x030B,0x0300);   
  193.     TFT_WriteCmdData(0x030C,0x0207);
  194.     TFT_WriteCmdData(0x030D,0x090B);
  195.     //gamma
  196.     TFT_WriteCmdData(0x0210,0x0000);
  197.     TFT_WriteCmdData(0x0211,0x00EF);
  198.     TFT_WriteCmdData(0x0212,0x0000);
  199.     TFT_WriteCmdData(0x0213,0x018F);
  200.     TFT_WriteCmdData(0x0401,0x0000);
  201.     TFT_WriteCmdData(0x0404,0x0000);
  202.     TFT_WriteCmdData(0x0010,0x0010);
  203.     TFT_WriteCmdData(0x0011,0x0002);
  204.     TFT_WriteCmdData(0x0012,0x0100);
  205.     TFT_WriteCmdData(0x0101,0x0017);
  206.     TFT_WriteCmdData(0x0200,0x0000);
  207.     TFT_WriteCmdData(0x0201,0x0000);
  208.     TFT_WriteCmd(0x0202);   
  209.     //display on
  210.     TFT_WriteCmdData(0x0007,0x0021);
  211.     for(i=0; i<5000; i++);
  212.     TFT_WriteCmdData(0x0007,0x0061);
  213.     for(i=0; i<5000; i++);
  214.     TFT_WriteCmdData(0x0007,0x0173);
  215.     for(i=0; i<5000; i++);  
  216.     TFT_WriteCmd(0x0202);   
  217. }

  218. /****************************************************************************
  219. *函数名:void TFT_Setwindow
  220. *输入:xStart:其实X坐标
  221. *    * yStart:其实Y坐标
  222. *    * xEnd:结束X坐标
  223. *    * yEnd:结束Y坐标
  224. *输出:
  225. *功能:设置窗口的范围,起始地址和终止地址。
  226. ****************************************************************************/
  227. void TFT_SetWindow(uint xStart, uint yStart,uint xEnd, uint yEnd)
  228. {
  229.         TFT_WriteCmdData(0x200, xStart);
  230.     TFT_WriteCmdData(0x201, yStart);

  231.     TFT_WriteCmdData(0x0210, xStart);
  232.     TFT_WriteCmdData(0x0212,yStart);

  233.     TFT_WriteCmdData(0x211,xEnd);
  234.     TFT_WriteCmdData(0x213,yEnd);

  235.         TFT_WriteCmd(0x0202);
  236. }

  237. /****************************************************************************
  238. *函数名:TFT_ClearScreen
  239. *输  入:backColor:16位真彩数值
  240. *输  出:
  241. *功  能:清屏并涂上颜色。
  242. ****************************************************************************/         
  243. void TFT_ClearScreen(uint color)
  244. {
  245.           uint i, j;

  246.         TFT_SetWindow(0,0,TFT_XMAX,TFT_YMAX);         //作用区域
  247.           for(i=0; i<TFT_XMAX+1; i++)
  248.         {
  249.                 for (j=0; j<TFT_YMAX+1; j++)
  250.                 {
  251.             TFT_WriteData(color);
  252.                 }

  253.         }
  254. }

  255. #include"gui.h"

  256. //---汉字的字库头文件---//
  257. #include"charcode.h"

  258. //---如果要显示图片就添加这个头文件---//
  259. #ifdef PICTURE_SHOW

  260. #include"picture.h"

  261. #endif

  262. /****************************************************************************
  263. *函数名:GUI_Dot
  264. *输  入:x:点的X坐标
  265. *      * y:点的Y坐标
  266. *      * color:点的颜色
  267. *输  出:
  268. *功  能:给一块3*3像素涂上颜色。
  269. ****************************************************************************/         

  270. void GUI_Dot(uint x, uint y, uint color)
  271. {  
  272.         uchar i;

  273.         TFT_SetWindow(x - 1, y - 1, x + 1, y + 1);  //单个像素

  274.         for(i=0; i<9; i++)
  275.         {
  276.                 TFT_WriteData(color);
  277.         }
  278. }

  279. /****************************************************************************
  280. *函数名:GUI_DrowSign
  281. *输  入:x:标记的X坐标;
  282. *      * y:标记的Y坐标
  283. *      * color:标记的颜色
  284. *输  出:
  285. *功  能:画一个十字的标记
  286. ****************************************************************************/         

  287. void GUI_DrowSign(uint x, uint y, uint color)
  288. {
  289.     uchar i;

  290.     TFT_SetWindow(x-3, y, x+3, y);
  291.     for(i=0; i<7; i++)
  292.     {
  293.         TFT_WriteData(color);   
  294.     }
  295.     TFT_SetWindow(x, y-3, x, y+3);
  296.     for(i=0; i<7; i++)
  297.     {
  298.         TFT_WriteData(color);   
  299.     }
  300. }

  301. ///****************************************************************************
  302. //*函数名:GUI_Box
  303. //*输  入: sx, sy, ex, ey, color
  304. //*输  出:
  305. //*功  能:给一个区域涂上颜色。
  306. //****************************************************************************/         
  307. //void GUI_Box(uint sx, uint sy, uchar ex, uint ey, uint color)
  308. //{
  309. //        uint temp;   
  310. //        TFT_SetWindow(sx, sy, ex, ey);
  311. //  sx = ex - sx + 1;
  312. //        sy = ey - sy + 1;
  313. //        while (sx--)
  314. //        {
  315. //                 temp = sy;
  316. //                while (temp--)
  317. //                 {        
  318. //                        TFT_WriteData(color);
  319. //                }
  320. //        }
  321. //}

  322. /****************************************************************************
  323. *函数名:GUI_Line
  324. *输  入:xStart:直线的起始X坐标
  325. *      * yStart:直线的其实Y坐标
  326. *      * xEnd:直线的结束X坐标
  327. *      * yEnd:直线的结束Y坐标
  328. *      * color:直线的颜色
  329. *输  出:
  330. *功  能:画一条直线
  331. ****************************************************************************/         

  332. void GUI_Line(uint xStart, uint yStart, uchar xEnd, uint yEnd, uint color)
  333. {
  334.         uint t;  
  335.         int xerr = 0, yerr = 0, delta_x, delta_y, distance;  
  336.         int incx, incy;  
  337.         uint row, col;  
  338.         delta_x = xEnd - xStart;//计算坐标增量  
  339.         delta_y = yEnd - yStart;  
  340.         col = xStart;  
  341.         row = yStart;  
  342.         if (delta_x > 0)
  343.         {
  344.                 incx=1;//设置单步方向
  345.         }           
  346.         else   
  347.         {  
  348.             if (delta_x == 0)
  349.                 {
  350.                         incx = 0;//垂直线
  351.                 }                  
  352.             else
  353.                         {
  354.                                 incx = -1;
  355.                                 delta_x = -delta_x;
  356.                         }  
  357.         }  
  358.         if (delta_y > 0)
  359.         {
  360.                 incy = 1;
  361.         }         
  362.         else  
  363.         {  
  364.             if (delta_y == 0)
  365.                 {
  366.                         incy = 0;//水平线  
  367.                 }
  368.             else
  369.                 {
  370.                         incy = -1;
  371.                         delta_y = -delta_y;
  372.                 }  
  373.         }  
  374.         if (delta_x > delta_y)
  375.         {
  376.                 distance = delta_x;//选取基本增量坐标轴  
  377.         }
  378.         else
  379.         {
  380.                 distance = delta_y;
  381.         }         
  382.         for (t=0; t<=distance+1; t++)  
  383.         {                                     //画线输出  
  384.             GUI_Dot(col, row, color);
  385.             xerr += delta_x;  
  386.             yerr += delta_y;  
  387.                   if(xerr > distance)  
  388.             {  
  389.                 xerr -= distance;  
  390.                 col += incx;  
  391.             }  
  392.             if(yerr > distance)  
  393.             {  
  394.                 yerr -= distance;  
  395.                 row += incy;  
  396.             }  
  397.         }  
  398. }

  399. /****************************************************************************
  400. *函数名:GUI_WriteCnChar
  401. *输  入:x:汉字显示的X坐标
  402. *      * y:汉字显示的Y坐标
  403. *      * cn:要显示的汉字
  404. *      * wordColor:文字的颜色
  405. *      * backColor:背景颜色
  406. *输  出:
  407. *功  能:写二号楷体汉字
  408. ****************************************************************************/         

  409. #ifdef CHAR32_SHOW

  410. void GUI_Write32CnChar(uint x, uint y, uchar *cn, uint wordColor, uint backColor)         
  411. {  
  412.         uchar i, j, wordNum;
  413.         uint color;
  414.         while (*cn != '\0')
  415.         {
  416.                 TFT_SetWindow(x, y, x+31, y+28);
  417.                 for (wordNum=0; wordNum<20; wordNum++)
  418.                 {        //wordNum扫描字库的字数
  419.                         if ((CnChar32x29[wordNum].Index[0]==*cn)
  420.                              &&(CnChar32x29[wordNum].Index[1]==*(cn+1)))
  421.                         {
  422.                                 for(i=0; i<116; i++)
  423.                                 {        //MSK的位数
  424.                                         color=CnChar32x29[wordNum].Msk[i];
  425.                                         for(j=0;j<8;j++)
  426.                                         {
  427.                                                 if((color&0x80)==0x80)
  428.                                                 {
  429.                                                         TFT_WriteData(wordColor);
  430.                                                 }                                                
  431.                                                 else
  432.                                                 {
  433.                                                         TFT_WriteData(backColor);
  434.                                                 }
  435.                                                 color<<=1;
  436.                                         }//for(j=0;j<8;j++)结束
  437.                                 }   
  438.                         }
  439.                 } //for (wordNum=0; wordNum<20; wordNum++)结束         
  440.                 cn += 2;
  441.                 x += 32;
  442.         }
  443. }
  444. #endif

  445. /****************************************************************************
  446. *函数名:GUI_WriteEnChar
  447. *输  入:x:字母显示的X坐标
  448. *      * y:字母显示的Y坐标
  449. *      * cn:要显示的字母
  450. *      * wordColor:文字的颜色
  451. *      * backColor:背景颜色
  452. *输  出:
  453. *功  能:写四号字字母
  454. ****************************************************************************/         

  455. #ifdef CHAR14_SHOW

  456. void GUI_Write14CnChar(uint x,uint y,uchar *cn,uint wordColor,uint backColor)         
  457. {  
  458.         uchar i, j, wordNum;
  459.         uint color;
  460.         while (*cn != '\0')
  461.         {
  462.                 TFT_SetWindow(x, y, x+23, y+18);
  463.                 for (wordNum=0; wordNum<20; wordNum++)
  464.                 {        //wordNum扫描字库的字数
  465.                         if ((CnChar19x24[wordNum].Index[0]==*cn)
  466.                              &&(CnChar19x24[wordNum].Index[1]==*(cn+1)))
  467.                         {
  468.                                 for(i=0; i<57; i++)
  469.                                 {        //MSK的位数
  470.                                         color=CnChar19x24[wordNum].Msk[i];
  471.                                         for(j=0;j<8;j++)
  472.                                         {
  473.                                                 if((color&0x80)==0x80)
  474.                                                 {
  475.                                                         TFT_WriteData(wordColor);
  476.                                                 }                                                
  477.                                                 else
  478.                                                 {
  479.                                                         TFT_WriteData(backColor);
  480.                                                 }
  481.                                                 color<<=1;
  482.                                         }//for(j=0;j<8;j++)结束
  483.                                 }   
  484.                         }
  485.                 } //for (wordNum=0; wordNum<20; wordNum++)结束         
  486.                 cn += 2;
  487.                 x += 24;
  488.         }
  489. }

  490. #endif

  491. /****************************************************************************
  492. *函数名:GUI_WriteASCII
  493. *输  入:x:字母显示的X坐标
  494. *      * y:字母显示的Y坐标
  495. *      * cn:要显示的字母
  496. *      * wordColor:文字的颜色
  497. *      * backColor:背景颜色
  498. *输  出:
  499. *功  能:写16X24的ASCII字符
  500. ****************************************************************************/         

  501. #ifdef USE_ASCII

  502. void GUI_WriteASCII(uint x, uint y, uchar *p, uint wordColor, uint backColor)
  503. {
  504.         uchar j, wordByte,wordNum;
  505.         uint color;
  506.         while(*p != '\0')
  507.         {
  508.                 wordNum = *p - 32;
  509.                 TFT_SetWindow(x,y,x+15, y+23);
  510.                 for (wordByte=0; wordByte<48; wordByte++)
  511.                 {
  512.                         color = ASCII16x24[wordNum][wordByte];
  513.                         for (j=0; j<8; j++)
  514.                         {
  515.                                 if ((color&0x80) == 0x80)
  516.                                 {
  517.                                         TFT_WriteData(wordColor);
  518.                                 }                                                
  519.                                 else
  520.                                 {
  521.                                         TFT_WriteData(backColor);
  522.                                 }         
  523.                                 color <<= 1;
  524.                         }
  525.                 }
  526.                 p++;
  527.                 x +=16;
  528.         }
  529. }
  530. #endif

  531. /****************************************************************************
  532. *函数名:GUI_ShowPicture
  533. *输  入:x:图片显示起始X坐标
  534. *      * y:图片显示起始Y坐标
  535. *      * wide:图片的宽度
  536. *      * high:图片的高度
  537. *输  出:
  538. *功  能:显示一张图片(取自picture.h中的pic[]数组,换图片直接替换掉pic数组就
  539. *      * 可以了)
  540. ****************************************************************************/         

  541. #ifdef PICTURE_SHOW

  542. void GUI_ShowPicture(uint x, uint y, uchar wide, uint high)
  543. {
  544.         uint temp = 0, tmp = 0, num = 0;
  545.         TFT_SetWindow(x, y, x+wide-1, y+high-1);
  546.         num = wide * high * 2;
  547.         do
  548.         {  
  549.                 temp = pic[tmp + 1];
  550.                 temp = temp << 8;
  551.                 temp = temp | pic[tmp];
  552.                 TFT_WriteData(temp);//逐点显示
  553.                 tmp += 2;
  554.         }
  555.         while(tmp < num);        
  556. }

  557. #endif














  558. #include"touch.h"

  559. PosTypeDef TouchAdj; //定义一阵数据用来保存校正因数
  560. XPT_XY xpt_xy;             //定义一个全局变量保存X、Y的值
  561. #define XY_READ_TIMS  10                   //读取的次数

  562. /****************************************************************************
  563. *函数名:TOUCH_SPI_Start
  564. *输  入:无
  565. *输  出:无
  566. *功  能:初始化触摸SPI
  567. ****************************************************************************/

  568. void TOUCH_SPI_Start(void)
  569. {
  570.         TOUCH_CLK = 0;
  571.         TOUCH_CS  = 1;
  572.         TOUCH_DIN = 1;
  573.         TOUCH_CLK = 1;
  574.         TOUCH_CS  = 0;               
  575. }

  576. /****************************************************************************
  577. *函数名:TOUCH_SPI_Write
  578. *输  入:dat:写入数据
  579. *输  出:无
  580. *功  能:使用SPI写入数据
  581. ****************************************************************************/

  582. void TOUCH_SPI_Write(uchar dat)
  583. {
  584.         uchar i;
  585.         TOUCH_CLK = 0;
  586.         for(i=0; i<8; i++)
  587.         {
  588.                 TOUCH_DIN = dat >> 7;          //放置最高位
  589.                 dat <<= 1;
  590.                 TOUCH_CLK = 0;                        //上升沿放置数据

  591.                 TOUCH_CLK = 1;

  592.         }
  593. }

  594. /****************************************************************************
  595. *函数名:TOUCH_SPI_Read
  596. *输  入:无
  597. *输  出:dat:读取 到的数据
  598. *功  能:使用SPI读取数据
  599. ****************************************************************************/

  600. uint TOUCH_SPI_Read(void)
  601. {
  602.         uint i, dat=0;
  603.         TOUCH_CLK = 0;
  604.         for(i=0; i<12; i++)                //接收12位数据
  605.         {
  606.                 dat <<= 1;

  607.                 TOUCH_CLK = 1;
  608.                 TOUCH_CLK = 0;

  609.                 dat |= TOUCH_DOUT;

  610.         }
  611.         return dat;        
  612. }

  613. /****************************************************************************
  614. *函数名:TOUCH_XPT_ReadData
  615. *输  入:cmd:读取的X或者Y
  616. *输  出:endValue:最终信号处理后返回的值
  617. *功  能:读取触摸数据
  618. ****************************************************************************/

  619. uint TOUCH_XPT_ReadData(uchar cmd)
  620. {
  621.         uchar i, j;
  622.         uint readValue[XY_READ_TIMS];
  623.         long endValue;

  624.         TOUCH_CLK = 0;    //先拉低时间
  625.         TOUCH_CS  = 0;    //选中芯片
  626.         
  627.         for(i=0; i<XY_READ_TIMS; i++)                 //读取XY_READ_TIMS次结果
  628.         {        
  629.                 TOUCH_SPI_Write(cmd);  //发送转换命令
  630.                 //Delay_6us();
  631.                 for(j=6; j>0; j--);         //延时等待转换结果
  632.                 TOUCH_CLK = 1;          //发送一个时钟周期,清除BUSY
  633.                 _nop_();
  634.                 _nop_();
  635.                 TOUCH_CLK = 0;
  636.                 _nop_();
  637.                 _nop_();
  638.         
  639.                 readValue[i] = TOUCH_SPI_Read();
  640.         }
  641.         TOUCH_CS = 1; //释放片选

  642.         //---软件滤波---//
  643.         //---先大到小排序,除去最高值,除去最低值,求其平均值---//
  644.            for(i=0; i<XY_READ_TIMS - 1; i++)        //从大到小排序
  645.         {
  646.                 for(j= i+1; j<XY_READ_TIMS; j++)
  647.                 {
  648.                         if(readValue[i] < readValue[j])
  649.                         {
  650.                                 endValue = readValue[i];
  651.                                 readValue[i] = readValue[j];
  652.                                 readValue[j] = endValue;
  653.                         }  
  654.                 }
  655.         }
  656. //        if((readValue[2] - readValue[3]) > 5)
  657. //        {
  658. //                return 0;
  659. //        }
  660.         endValue = 0;
  661.         for(i=2; i<XY_READ_TIMS-2; i++)                  
  662.         {
  663.                 endValue += readValue[i];
  664.         }
  665.         endValue = endValue/ (XY_READ_TIMS - 4);//求平均值

  666.         return endValue;
  667. }

  668. /****************************************************************************
  669. *函数名:TOUCH_XPT_ReadXY
  670. *输  入:无
  671. *输  出:1:成功 0:失败
  672. *功  能:读取XY的AD值
  673. ****************************************************************************/

  674. uchar TOUCH_XPT_ReadXY(void)
  675. {        
  676.         uint x1, x2, x, y1, y2, y;

  677.         TOUCH_SPI_Start();
  678.         //---分别读两次X值和Y值, 交叉着读可以提高一些读取精度---//
  679.         x1 = TOUCH_XPT_ReadData(XPT_CMD_X);
  680.         y1 = TOUCH_XPT_ReadData(XPT_CMD_Y);
  681.         x2 = TOUCH_XPT_ReadData(XPT_CMD_X);
  682.         y2 = TOUCH_XPT_ReadData(XPT_CMD_Y);

  683.         //---求取X值的差值---//
  684.         if (x1 > x2)
  685.         {
  686.                 x = x1 - x2;
  687.         }
  688.         else
  689.         {
  690.                 x = x2 - x1;
  691.         }

  692.         //---求取Y值的差值---//
  693.         if (y1 > y2)
  694.         {
  695.                 y = y1 - y2;
  696.         }
  697.         else
  698.         {
  699.                 y = y2 - y1;
  700.         }

  701.         //---判断差值是否大于50,大于就返回0,表示读取失败---//
  702.         if((x > 50) || (y > 50))  
  703.         {
  704.                 return 0;
  705.         }

  706.         //---求取两次读取值的平均数作为读取到的XY值---//
  707.         xpt_xy.x = (x1 + x2) / 2;
  708.         xpt_xy.y = (y1 + y2) / 2;

  709.         xpt_xy.x &= 0xFFF0;          //去掉低四位
  710.         xpt_xy.y &= 0xFFF0;

  711.         //---确定XY值的范围,用在触摸屏大于TFT时---//
  712.         if((xpt_xy.x < 100) || (xpt_xy.y > 3900))
  713.         {
  714.                 return 0;
  715.         }

  716.         return 1;  // 返回1,表示读取成功
  717. }

  718. /****************************************************************************
  719. *函数名:TOUCH_ReadAdj
  720. *输  入:px:读取到的X坐标值
  721. *      * py:读取到的Y坐标值
  722. *输  出:无
  723. *功  能:给屏幕校正函数取四个点
  724. ****************************************************************************/         

  725. void TOUCH_ReadAdj(uint *px, uint *py)
  726. {
  727.     ulong i = 0;
  728.     XPT_XY pot[4];

  729.     /* 读取四个定位点的坐标 */
  730.     TFT_ClearScreen(0x0000);
  731.     GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MIN, 0x0FF0);
  732.     while(1)
  733.     {
  734.         if(TOUCH_XPT_ReadXY())
  735.         {
  736.             i++;
  737.             if(i > 10)
  738.             {
  739.                 pot[0].x = xpt_xy.x;
  740.                 pot[0].y = xpt_xy.y;
  741.                 break;
  742.             }
  743.         }   
  744.     }
  745.     GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MIN, 0x0000);
  746.     ADJ_CHECK_DELAY;
  747.     GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MAX, 0x0FF0);
  748.     i = 0;
  749.     while(1)
  750.     {
  751.         if(TOUCH_XPT_ReadXY())
  752.         {
  753.             i++;
  754.             if(i > 10)
  755.             {
  756.                 pot[1].x = xpt_xy.x;
  757.                 pot[1].y = xpt_xy.y;
  758.                 break;
  759.             }
  760.         }   
  761.     }
  762.     GUI_DrowSign(LCD_ADJX_MIN, LCD_ADJY_MAX, 0x0000);
  763.     ADJ_CHECK_DELAY;
  764.     GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MIN, 0x0FF0);
  765.     i = 0;
  766.     while(1)
  767.     {
  768.         if(TOUCH_XPT_ReadXY())
  769.         {
  770.             i++;
  771.             if(i > 10)
  772.             {
  773.                 pot[2].x = xpt_xy.x;
  774.                 pot[2].y = xpt_xy.y;
  775.                 break;
  776.             }
  777.         }   
  778.     }
  779.     GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MIN, 0x0000);
  780.     ADJ_CHECK_DELAY;
  781.     GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MAX, 0x0FF0);
  782.     i = 0;
  783.     while(1)
  784.     {
  785.         if(TOUCH_XPT_ReadXY())
  786.         {
  787.             i++;
  788.             if(i > 10)
  789.             {
  790.                 pot[3].x = xpt_xy.x;
  791.                 pot[3].y = xpt_xy.y;
  792.                 break;
  793.             }
  794.         }   
  795.     }      
  796.     GUI_DrowSign(LCD_ADJX_MAX, LCD_ADJY_MAX, 0x0000);

  797.     /* 处理读取到的四个点的数据,整合成对角的两个点 */
  798. #if LCD_TOUCH_TYPE == 0
  799.     px[0] = (pot[0].x + pot[1].x) / 2;
  800.     py[0] = (pot[0].y + pot[2].y) / 2;
  801.     px[1] = (pot[3].x + pot[2].x) / 2;
  802.     py[1] = (pot[3].y + pot[1].y) / 2;
  803. #endif

  804. #if LCD_TOUCH_TYPE == 1

  805.     px[0] = (pot[0].x + pot[2].x) / 2;
  806.     py[0] = (pot[0].y + pot[1].y) / 2;
  807.     px[1] = (pot[3].x + pot[1].x) / 2;
  808.     py[1] = (pot[3].y + pot[2].y) / 2;  
  809. #endif     
  810. }

  811. /****************************************************************************
  812. *函数名:TOUCH_Adjust
  813. *输  入:无
  814. *输  出:无
  815. *功  能:触摸屏校正
  816. ****************************************************************************/         

  817. void TOUCH_Adjust(void)
  818. {
  819.     uint px[2], py[2];
  820.     float xFactor, yFactor;

  821.     /* 定位取点 */
  822. #ifdef USE_TOUCH_ADJUST
  823.     TOUCH_ReadAdj(px, py);
  824. #else

  825.         /* 将(10,10)和(TFT_XMAX - 10, TFT_YMAX - 10) 的坐标填上就不用每次开机都要校正了*/
  826.         px[0] = 3664;
  827.     py[0] = 3696;
  828.     px[1] = 336;
  829.     py[1] = 528;
  830.         
  831. #endif        

  832. #if LCD_TOUCH_TYPE == 0
  833.     /* 求出比例因数 */
  834.     xFactor = (float)LCD_ADJx / (px[1] - px[0]);
  835.     yFactor = (float)LCD_ADJy / (py[1] - px[0]);  

  836.     /* 求出偏移量 */
  837.     TouchAdj.xOffset = (int)LCD_ADJX_MAX - ((float)px[1] * xFactor + 0.5);
  838.     TouchAdj.yOffset = (int)LCD_ADJY_MAX - ((float)py[1] * yFactor + 0.5);

  839.     /* 将比例因数进行数据处理,然后保存 */
  840.     TouchAdj.xFactor = xFactor * LCD_ADJ_MUX + 0.5;
  841.     TouchAdj.yFactor = yFactor * LCD_ADJ_MUX + 0.5;
  842. #endif

  843. #if LCD_TOUCH_TYPE == 1  

  844.     /* 求出比例因数 */
  845.     yFactor = (float)LCD_ADJY_MAX / (px[0] - px[1]);
  846.     xFactor = (float)LCD_ADJX_MAX / (py[0] - py[1]);

  847.     /* 将比例因数进行数据处理,然后保存 */
  848.     TouchAdj.xFactor = xFactor * LCD_ADJ_MUX + 0.5;
  849.     TouchAdj.yFactor = yFactor * LCD_ADJ_MUX + 0.5;

  850.     /* 求出偏移量 */
  851.     TouchAdj.xOffset = (int)LCD_ADJX_MAX - ((float)py[0] * xFactor + 0.5);
  852.     TouchAdj.yOffset = (int)LCD_ADJY_MAX - ((float)px[0] * yFactor + 0.5);
  853. #endif
  854. }
复制代码

评分

参与人数 2黑币 +62 收起 理由
user2402166 + 12 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:760198 发表于 2020-5-24 21:43 | 只看该作者
请问这个驱动怎么使用呀
回复

使用道具 举报

板凳
ID:585455 发表于 2020-10-1 16:45 | 只看该作者
缺庫函數,可以補足嗎?感謝你。
回复

使用道具 举报

地板
ID:97678 发表于 2021-1-7 16:21 | 只看该作者
可以补足所有的文件吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表