搜索
bottom↓
回复: 2

请求帮助:SK-LPC1788开发板触摸屏受4.3寸TFT(480*272)干扰

[复制链接]

出0入0汤圆

发表于 2015-11-14 20:20:43 | 显示全部楼层 |阅读模式
本帖最后由 LO单片机VE 于 2015-11-14 22:33 编辑

最近一直都在SK-LPC1788开发板上学习TFT显示与触摸屏功能,现在的问题是当触摸屏外接单独测试读数是很稳定的,AD值读出来跳变在1-2个码左右;如果把触摸屏贴在TFT显示屏上,同时TFT正常显示,这时触摸读取的AD值就不稳定了,跳码在几十个码之间。
我自己有做如下尝试,但效果没有改善:
1. X+,Y+,X—,Y-上各焊了一个221(220PF)的电容到地;
2. TFT显示屏外壳接地;
3. 换过TSC2046触摸芯片;
4. 换过四线制电阻触摸屏;
5. 软件上将TFT的刷新率降低;

(注:在TFT显示关闭的状态下,触摸屏贴在TFT上读取显示很稳定的,从这点可以更加确信是TFT显示干扰了触摸屏!)

  我现在想不通TFT外壳都接地了怎么还会干扰到触摸屏呢,不知道该如何解决,希望各位看过这个问题能提供点意见,小弟在此先谢过了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出45入29汤圆

发表于 2015-11-15 22:33:16 | 显示全部楼层
先发原理图 资料 共享再说

出0入0汤圆

 楼主| 发表于 2015-11-16 10:59:20 | 显示全部楼层
我将与触摸和LCD相关的原理图和程序发上来,请大家帮我一起分析分析,如果资料还不够完善的我将积极配合上传,谢谢。

/***********************************Touch_SPI.c文件*************************************/
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <LPC177x_8x.h>
  5. #include "lpc_types.h"
  6. #include "Touch_spi.h"

  7. /*******************************************************************************
  8. 软件模拟SPI方式读取触摸屏
  9. *******************************************************************************/

  10. #define TFT_TOUCH_CS_L       (LPC_GPIO0->CLR |= (0x1<<6))    //P0.6 (OUTPUT)
  11. #define TFT_TOUCH_CS_H       (LPC_GPIO0->SET |= (0x1<<6))

  12. #define TFT_TOUCH_INT        (LPC_GPIO2->PIN&(0x1<<15))      //P2.15 (INPUT)

  13. #define TFT_TOUCH_BUSY       (LPC_GPIO2->PIN&(0x1<<14))      //P2.14 (INPUT)

  14. #define TFT_TOUCH_SCK_L      (LPC_GPIO1->CLR |= (0x1<<19))   //P1.19 (OUTPUT)
  15. #define TFT_TOUCH_SCK_H      (LPC_GPIO1->SET |= (0x1<<19))

  16. #define TFT_TOUCH_MOSI_L     (LPC_GPIO0->CLR |= (0x1<<13))   //P0.13 (OUTPUT)
  17. #define TFT_TOUCH_MOSI_H     (LPC_GPIO0->SET |= (0x1<<13))

  18. #define TFT_TOUCH_MISO       (LPC_GPIO0->PIN&(0x1<<12))      //P0.12 (INPUT)


  19. /*
  20. #define TFT_TOUCH_CS_L       (LPC_GPIO2->CLR |= (0x1<<23))   //P2.23 (OUTPUT)
  21. #define TFT_TOUCH_CS_H       (LPC_GPIO2->SET |= (0x1<<23))

  22. #define TFT_TOUCH_INT        (LPC_GPIO0->PIN&(0x1<<16))      //P0.16 (INPUT)

  23. #define TFT_TOUCH_BUSY       (LPC_GPIO0->PIN&(0x1<<15))      //P0.15 (INPUT)

  24. #define TFT_TOUCH_SCK_L      (LPC_GPIO2->CLR |= (0x1<<22))   //P2.22 (OUTPUT)
  25. #define TFT_TOUCH_SCK_H      (LPC_GPIO2->SET |= (0x1<<22))

  26. #define TFT_TOUCH_MOSI_L     (LPC_GPIO2->CLR |= (0x1<<27))   //P2.27 (OUTPUT)
  27. #define TFT_TOUCH_MOSI_H     (LPC_GPIO2->SET |= (0x1<<27))

  28. #define TFT_TOUCH_MISO       (LPC_GPIO2->PIN&(0x1<<26))      //P2.26 (INPUT)
  29. */

  30. #define DELAY_200NS           30

  31. /*******************************************************************************
  32. 函数名称:void DelayNo(uint32_t  i)
  33. 功    能:SPI延时函数
  34. 参    数:无
  35. 返回值  :无
  36. ********************************************************************************/
  37. void DelayNo(uint32_t  i)
  38. {
  39.         for(;i>0;i--);
  40. }
  41. /*******************************************************************************
  42. 函数名称:void SPI_GPIOInit(void)
  43. 功    能:SPI引脚初始化配置
  44. 参    数:无
  45. 返回值  :无
  46. ********************************************************************************/   
  47. void SPI_GPIOInit(void)
  48. {
  49.        
  50.         LPC_IOCON->P1_19 &= ~0x07;        //SCLK  OUTPUT
  51.         LPC_GPIO1->DIR |=(0x01<<19);
  52.        
  53.         LPC_IOCON->P0_6  &= ~0x07;              //CS  OUTPUT
  54.         LPC_GPIO0->DIR |=(0x01<<6);
  55.         LPC_GPIO0->SET |=(0x01<<6);
  56.        
  57.         LPC_IOCON->P0_12 &= ~0x07;        //MISO  INPUT
  58.   LPC_GPIO0->DIR &=~(0x01<<12);               
  59.        
  60.         LPC_IOCON->P0_13 &= ~0x07;        //MOSI  OUTPUT
  61.         LPC_GPIO0->DIR |=(0x01<<13);
  62.        
  63.   LPC_IOCON ->P2_15 &= ~0x07;       //PEINT  INPUT
  64.   LPC_GPIO2->DIR &=~(0x01<<15);               
  65.        
  66.   LPC_IOCON ->P2_14 &= ~0x07;       //BUSY  INPUT
  67.   LPC_GPIO2->DIR &=~(0x01<<14);                       
  68. /*
  69.         LPC_IOCON->P2_22 &= ~0x07;        //SCLK  OUTPUT
  70.         LPC_GPIO2->DIR |=(0x01<<22);
  71.        
  72.         LPC_IOCON->P2_23 &= ~0x07;              //CS  OUTPUT
  73.         LPC_GPIO2->DIR |=(0x01<<23);
  74.         LPC_GPIO2->SET |=(0x01<<23);
  75.        
  76.         LPC_IOCON->P2_26 &= ~0x07;        //MISO  INPUT
  77.   LPC_GPIO2->DIR &=~(0x01<<26);               
  78.        
  79.         LPC_IOCON->P2_27 &= ~0x07;        //MOSI  OUTPUT
  80.         LPC_GPIO2->DIR |=(0x01<<27);
  81.        
  82.   LPC_IOCON ->P0_16 &= ~0x07;       //PEINT  INPUT
  83.   LPC_GPIO0->DIR &=~(0x01<<16);               
  84.        
  85.   LPC_IOCON ->P0_15 &= ~0x07;       //BUSY  INPUT
  86.   LPC_GPIO0->DIR &=~(0x01<<15);       
  87. */
  88. }
  89. /*******************************************************************************
  90. 函数名称:uint16_t SPI_WriteRead(uint8_t data)
  91. 功    能:向ADS7843/TSC2046发送一个命令字节数据同时读取数据
  92. 参    数:无
  93. 返回值  :读取的坐标数据
  94. ********************************************************************************/
  95. uint16_t SPI_WriteRead(uint8_t data)
  96. {
  97.         uint8_t  i;
  98.         static uint16_t ret_dat;
  99.        
  100.         data = data|0x80;                        //设置S位
  101.   TFT_TOUCH_CS_H;                    //CS=1;
  102.   TFT_TOUCH_SCK_L;            //DCLK=0;
  103.   TFT_TOUCH_MOSI_L;           //MOSI=0;
  104.         DelayNo(DELAY_200NS);       

  105.   TFT_TOUCH_CS_L;                    //CS=0;
  106.         for(i=0;i<8;i++)
  107.         {
  108.                 if((data&0x80)!=0) TFT_TOUCH_MOSI_H;               
  109.                 else                     TFT_TOUCH_MOSI_L;               

  110.                 DelayNo(DELAY_200NS);
  111.     TFT_TOUCH_SCK_H;
  112.                 DelayNo(DELAY_200NS);

  113.     TFT_TOUCH_SCK_L;
  114.                 data=data<<1;
  115.         }
  116.   TFT_TOUCH_MOSI_L;           //MOSI=0;
  117.         DelayNo(DELAY_200NS);
  118.         DelayNo(DELAY_200NS);
  119.         DelayNo(DELAY_200NS);

  120.   TFT_TOUCH_SCK_H;
  121.         DelayNo(DELAY_200NS);
  122.   TFT_TOUCH_SCK_L;
  123.         ret_dat=0;
  124.         while(TFT_TOUCH_BUSY)  //判忙
  125.         {
  126.          TFT_TOUCH_SCK_H;
  127.          DelayNo(DELAY_200NS);   //模拟1个周期的SCK信号
  128.    TFT_TOUCH_SCK_L;       
  129.         }
  130.        
  131.         for(i=0;i<12;i++)
  132.         {
  133.                  ret_dat=ret_dat<<1;
  134.                 DelayNo(DELAY_200NS);
  135.     TFT_TOUCH_SCK_H;
  136.                 if(TFT_TOUCH_MISO!=0)  ret_dat=ret_dat|1;
  137.                 DelayNo(DELAY_200NS);
  138.     TFT_TOUCH_SCK_L;
  139.                 if(i==6)
  140.                 {
  141.                  DelayNo(DELAY_200NS);
  142.                  DelayNo(DELAY_200NS);
  143.                 }
  144.         }
  145.         for(i=0;i<3;i++)
  146.         {
  147.                 DelayNo(DELAY_200NS);
  148.     TFT_TOUCH_SCK_H;
  149.                 DelayNo(DELAY_200NS);
  150.     TFT_TOUCH_SCK_L;
  151.         }
  152.         DelayNo(DELAY_200NS);
  153.   TFT_TOUCH_CS_H;                    //CS=1;
  154.                
  155.         return (ret_dat);
  156. }

  157. /*******************************************************************************/
复制代码


/***********************************TouchConf.c文件*************************************/
  1. #include "GUI.h"
  2. #include "stddef.h"
  3. #include "TouchConf.h"

  4. #ifndef _WINDOWS
  5. #include "LPC177x_8x.h"
  6. #include "Touch_spi.h"
  7. #endif


  8. /*********************************************************************/
  9. extern short TP_X[1],TP_Y[1],Pressed_Flag;       
  10. extern short AD_X[1],AD_Y[1];
  11. // Touch screen

  12. #define TCS_LOW()               (LPC_GPIO0->CLR |= (0x1<<6))   //TOUCH CS  P0.6
  13. #define TCS_HIGH()             (LPC_GPIO0->SET |= (0x1<<6))

  14. #define PEN_State                     (LPC_GPIO2->PIN&(0x1<<15))    //P2.15
  15. #define TOUCH_BUSY       (LPC_GPIO2->PIN&(0x1<<14))

  16. /*
  17. #define TCS_LOW()               (LPC_GPIO2->CLR |= (0x1<<23))   //TOUCH CS  P2.23
  18. #define TCS_HIGH()             (LPC_GPIO2->SET |= (0x1<<23))

  19. #define PEN_State                     (LPC_GPIO0->PIN&(0x1<<16))   
  20. #define TOUCH_BUSY       (LPC_GPIO0->PIN&(0x1<<15))
  21. */
  22. /*********************************************************************
  23. a[0]=A  a[1]=B  a[2]=C  a[3]=D  a[4]=E  a[5]=F  a[6]=运算除数  
  24. x[n] y[n] 触摸屏坐标    xfb[n] yfb[n] 显示屏坐标
  25. *********************************************************************/
  26. typedef struct {   
  27.       int x[5], xfb[5];  
  28.       int y[5], yfb[5];
  29.       int a[7];  //int占4个字节
  30. } calibration;

  31. calibration cal;
  32. /*********************************************************************
  33. *
  34. *       Global functions for GUI touch
  35. *
  36. **********************************************************************
  37. */

  38. #if GUI_SUPPORT_TOUCH  // Used when touch screen support is enabled

  39. /*********************************************************************
  40. *
  41. *       Touch_Delay
  42. *
  43. *********************************************************************/
  44. void Touch_Delay(void)
  45. {
  46.         uint32_t i;
  47.         for(i=0;i<1000;i++);
  48. }       
  49. /*********************************************************************
  50. * 函数名:Touch_Init()
  51. * 参数  :void
  52. * 返回值:void
  53. * 描述  :触摸屏初始化
  54. *********************************************************************/
  55. void Touch_Init(uint16_t lcd_xsize,uint16_t lcd_ysize)
  56. {  
  57.         /*初始化触摸屏*/
  58.        
  59.         LPC_IOCON->P0_6  &= ~0x07;          // P0.6 - TP_CS - used as GPIO
  60.         LPC_GPIO0->DIR |=(0x01<<6);
  61.         LPC_GPIO0->SET |=(0x01<<6);
  62.   
  63.   LPC_IOCON ->P2_15 =0x00;          //P2.15 PENIRQ INPUT
  64.   LPC_GPIO2->DIR &=~(0x01<<15);               
  65.        
  66. /*
  67.         LPC_IOCON->P2_23  &= ~0x07;          // P2.23 - TP_CS - used as GPIO
  68.         LPC_GPIO2->DIR |=(0x01<<23);
  69.         LPC_GPIO2->SET |=(0x01<<23);
  70.   
  71.   LPC_IOCON ->P0_16 =0x00;          //P0.16 PENIRQ INPUT
  72.   LPC_GPIO0->DIR &=~(0x01<<16);       
  73. */
  74.        
  75. //LPC_GPIOINT->IO2IntEnF|=1<<15;                   //使能GPIO2的15管脚的下降沿中断
  76. /*配置GPIO中断的先占优先级为1,从优先级为1*/
  77. //NVIC_SetPriority(GPIO_IRQn, ((0x01<<3)|0x01));
  78. /*使能GPIO的中断通道*/
  79. //NVIC_EnableIRQ(GPIO_IRQn);
  80.        
  81.         SPI_GPIOInit();
  82. }
  83. /*********************************************************************
  84. * Function Name  : Touch_ReadAdXY
  85. * Description    : 读取ADS7843/TSC2046  通道X+ 通道Y+的ADC值
  86. * Input          : None
  87. * Output         : None
  88. * Return         : ADS7843/TSC2046 返回 通道X+ 通道Y+的ADC值
  89. * Attention                 : None
  90. *********************************************************************/
  91. void Touch_ReadAdXY(int *x,int *y)  
  92. {
  93.   int adx=0,ady=0;
  94.        
  95.         adx = SPI_WriteRead(TOUCH_CHX);   //读取X坐标指令
  96.         ady = SPI_WriteRead(TOUCH_CHY);   //读取Y坐标指令
  97.   *x=adx;
  98.   *y=ady;
  99. }
  100. /*********************************************************************
  101. 函 数 名:unsigned short Softfilter(int (*dat)[13])
  102. 功    能:数据滤波
  103. 说    明:无
  104. 入口参数:(*dat)[13]
  105. 返 回 值:无
  106. 设    计:zhou feng           日    期:2012-09-10
  107. 修    改:                    日    期:
  108. *********************************************************************/
  109. unsigned short Softfilter(int (*dat)[13])
  110. {
  111.   unsigned int dbt[3],tmpx =0xFFF;
  112.         signed   int m0,m1,m2;

  113. /******************降序排列************************
  114.         for(m0=0;m0<13;m0++)   
  115.         {
  116.                 for(m1=0;m1<13;m1++)
  117.                 {
  118.                         if(dat[0][m1]<dat[0][m1+1])   
  119.                         {
  120.                                 m2           = dat[0][m1];
  121.                                 dat[0][m1]   = dat[0][m1+1];
  122.                                 dat[0][m1+1] = m2;
  123.                         }
  124.                 }
  125.         }
  126. *******************升序排列***********************/       
  127.         for(m0=0;m0<(13-1);m0++)   
  128.         {
  129.                 for(m1=m0+1;m1<13;m1++)
  130.                 {
  131.                         if(dat[0][m0]>dat[0][m1])   
  132.                         {
  133.                                 m2           = dat[0][m0];
  134.                                 dat[0][m0]   = dat[0][m1];
  135.                                 dat[0][m1]   = m2;
  136.                         }
  137.                 }
  138.         }
  139. /*************************************************/
  140.   dbt[0] = (dat[0][2]+ dat[0][3]+dat[0][4])/3;  //取中间9个有效数据,分3组取平均
  141.         dbt[1] = (dat[0][5]+ dat[0][6]+dat[0][7])/3;
  142.         dbt[2] = (dat[0][8]+ dat[0][9]+dat[0][10])/3;

  143.         m0 = dbt[0]-dbt[1];
  144.         m1 = dbt[1]-dbt[2];
  145.         m2 = dbt[2]-dbt[0];
  146.        
  147.         m0 = m0>0?m0:(-m0);
  148.         m1 = m1>0?m1:(-m1);
  149.         m2 = m2>0?m2:(-m2);
  150. /*************************************************/
  151.         if(m0<THRESHOLD && m1<THRESHOLD && m2<THRESHOLD)   //调节数据跳变量门限值
  152.         {
  153.                 if(m0<m1)
  154.           {
  155.                  if(m2<m0)
  156.                  {
  157.                          tmpx = (dbt[0]+dbt[2])/2;
  158.                  }
  159.                  else
  160.                  {
  161.                         tmpx = (dbt[0]+dbt[1])/2;
  162.                  }
  163.           }
  164.                 else if(m2<m1)
  165.                 {
  166.                  tmpx = (dbt[0]+dbt[2])/2;
  167.                 }
  168.                 else
  169.                 {
  170.            tmpx = (dbt[1]+dbt[2])/2;
  171.                 }
  172.         }
  173.         else
  174.         {
  175.                 tmpx = 0xFFF;
  176.         }
  177.        
  178.         return (unsigned short)tmpx;
  179. }
  180. /*********************************************************************
  181. 函 数 名:Coordinate * Read_ADS7846_Filter(void)
  182. 功    能:读取触摸数据(带滤波处理)
  183. 说    明:无
  184. 入口参数:无
  185. 返 回 值:无
  186. 设    计:zhou feng           日    期:2012-09-10
  187. 修    改:                    日    期:
  188. *********************************************************************/
  189. Coordinate * Read_ADS7846_Filter(void)
  190. {
  191.   static Coordinate  screen;       
  192.         unsigned char t=0,count=0;
  193.         int  databuffer[2][13]={{5,7,9,3,2,6,4,0,3,0,0,0,0},{5,7,9,3,2,6,4,0,3,0,0,0,0}};

  194.   do{               
  195.             DelayNo(200);
  196.                   DelayNo(200);
  197.                                                
  198.       if(!PEN_State)        //触摸按下
  199.                         {
  200.              databuffer[0][count] = SPI_WriteRead(TOUCH_CHX);   //读取X坐标指令
  201.              databuffer[1][count] = SPI_WriteRead(TOUCH_CHY);   //读取Y坐标指令                               
  202.        count++;                                
  203.                         }
  204.           }while(!PEN_State && count<13);  

  205.   screen.x = 0;
  206.   screen.y = 0;
  207.         if(count == 13)
  208.         {  
  209.                 screen.x = Softfilter(&databuffer[0]);    //连续13组X数据滤波处理
  210.                 screen.y = Softfilter(&databuffer[1]);          //连续13组Y数据滤波处理               
  211.     if(screen.x==0xFFF || screen.y==0xFFF)        return 0;       
  212.           else                                    return &screen;
  213.   }  
  214.   return 0;   //没有触摸压下
  215. }         
  216. /*********************************************************************
  217. *
  218. *       GUI_TOUCH_X_ActivateX()
  219. *
  220. * Function decription:
  221. *   Called from GUI, if touch support is enabled.
  222. *   Switches on voltage on X-axis,
  223. *   prepares measurement for Y-axis.
  224. *   Voltage on Y-axis is switched off.
  225. */
  226. //void GUI_TOUCH_X_ActivateX(void)
  227. //{
  228. //}
  229. /*********************************************************************
  230. *
  231. *       GUI_TOUCH_X_ActivateY()
  232. *
  233. * Function decription:
  234. *   Called from GUI, if touch support is enabled.
  235. *   Switches on voltage on Y-axis,
  236. *   prepares measurement for X-axis.
  237. *   Voltage on X-axis is switched off.
  238. */
  239. //void GUI_TOUCH_X_ActivateY(void)
  240. //{
  241. //}
  242. /*********************************************************************
  243. *
  244. *       GUI_TOUCH_X_MeasureX()
  245. *
  246. * Function decription:
  247. *   Called from GUI, if touch support is enabled.
  248. *   Measures voltage of X-axis.
  249. */
  250. //int  GUI_TOUCH_X_MeasureX(void)
  251. //{
  252. // return 0;//_TouchX;
  253. //}

  254. /*********************************************************************
  255. *
  256. *       GUI_TOUCH_X_MeasureY()
  257. *
  258. * Function decription:
  259. *   Called from GUI, if touch support is enabled.
  260. *   Measures voltage of Y-axis.
  261. */
  262. //int  GUI_TOUCH_X_MeasureY(void)
  263. //{
  264. //  return 0;//_TouchY;
  265. //}
  266. /*********************************************************************
  267. * 函数名:int perform_calibration(calibration *cal)
  268. * 参数  :void
  269. * 返回值:void
  270. * 描述  :五点触摸校准算法
  271. *********************************************************************/
  272. int perform_calibration(calibration *cal)
  273. {
  274.   int j;
  275.         float n, x, y, x2, y2, xy, z, zx, zy;
  276.         float det, a, b, c, e, f, i;
  277.         float scaling = 65536.0;

  278. // Get sums for matrix
  279.         n = x = y = x2 = y2 = xy = 0;
  280.         for(j=0;j<5;j++)
  281.         {
  282.          n += 1.0;
  283.          x += (float)cal->x[j];
  284.          y += (float)cal->y[j];
  285.          x2 += (float)(cal->x[j]*cal->x[j]);
  286.          y2 += (float)(cal->y[j]*cal->y[j]);
  287.          xy += (float)(cal->x[j]*cal->y[j]);
  288.         }

  289.   //Get determinant of matrix -- check if determinant is too small
  290.         det = n*(x2*y2 - xy*xy) + x*(xy*y - x*y2) + y*(x*xy - y*x2);
  291.         if(det < 0.1 && det > -0.1)
  292.         {
  293.          //printf("ts_calibrate: determinant is too small -- %f\n\r",det);
  294.          return 0;
  295.         }

  296. // Get elements of inverse matrix
  297.         a = (x2*y2 - xy*xy)/det;
  298.         b = (xy*y - x*y2)/det;
  299.         c = (x*xy - y*x2)/det;
  300.         e = (n*y2 - y*y)/det;
  301.         f = (x*y - n*xy)/det;
  302.         i = (n*x2 - x*x)/det;

  303. // Get sums for x calibration
  304.         z = zx = zy = 0;
  305.         for(j=0;j<5;j++)
  306.         {
  307.          z += (float)cal->xfb[j];
  308.          zx += (float)(cal->xfb[j]*cal->x[j]);
  309.          zy += (float)(cal->xfb[j]*cal->y[j]);
  310.         }

  311. // Now multiply out to get the calibration for framebuffer x coord
  312.         cal->a[2] = (int)((a*z + b*zx + c*zy)*(scaling));
  313.         cal->a[0] = (int)((b*z + e*zx + f*zy)*(scaling));
  314.         cal->a[1] = (int)((c*z + f*zx + i*zy)*(scaling));

  315. //         printf("%f %f %f\n\r",(a*z + b*zx + c*zy),
  316. //                                 (b*z + e*zx + f*zy),
  317. //                                 (c*z + f*zx + i*zy));

  318. // Get sums for y calibration
  319.         z = zx = zy = 0;
  320.         for(j=0;j<5;j++)
  321.         {
  322.          z += (float)cal->yfb[j];
  323.          zx += (float)(cal->yfb[j]*cal->x[j]);
  324.          zy += (float)(cal->yfb[j]*cal->y[j]);
  325.         }

  326. // Now multiply out to get the calibration for framebuffer y coord
  327.         cal->a[5] = (int)((a*z + b*zx + c*zy)*(scaling));
  328.         cal->a[3] = (int)((b*z + e*zx + f*zy)*(scaling));
  329.         cal->a[4] = (int)((c*z + f*zx + i*zy)*(scaling));

  330. //         printf("%f %f %f\n\r",(a*z + b*zx + c*zy),
  331. //                                 (b*z + e*zx + f*zy),
  332. //                                 (c*z + f*zx + i*zy));

  333. // If we got here, we're OK, so assign scaling to a[6] and return
  334.         cal->a[6] = (int)scaling;
  335.         return 1;
  336. }
  337. /********************************************************************/
  338. typedef struct
  339. {
  340. int Min;
  341. int Max;
  342. } tMinMax;
  343. extern tMinMax xyMinMax[2];

  344. extern int CalibrationComplete;
  345. int ax_Phys[2],ay_Phys[2];

  346. /*********************************************************************
  347. * 函数名:void _ExecCalibration( int x_size, int y_size )
  348. * 参数  :void
  349. * 返回值:void
  350. * 描述  :触摸自校准(五点校准)
  351. *********************************************************************/
  352. void _ExecCalibration( int x_size, int y_size )   //x_size=X尺寸  y_size=Y尺寸
  353. {
  354. /* calculate log. Positions */
  355. int ax[5], ay[5];
  356. Coordinate *p;
  357.        
  358.   ax[0] = 20;             ay[0] = 20;          //(20,20)               左上
  359.   ax[1] = x_size -20;     ay[1] = 20;          //(x_size-20,20)        右上
  360.   ax[2] = x_size -20;     ay[2] = y_size-20;   //(x_size-20,y_size-20) 右下
  361.   ax[3] = 20;             ay[3] = y_size-20;   //(20,y_size-20)        左下
  362.   ax[4] = x_size/2;       ay[4] = y_size/2;    //(x_size/2,y_size/2)   中心

  363.   CalibrationComplete = 0;       //标志清0
  364.   GUI_TOUCH_SetDefaultCalibration();  //设置默认的校准参数(GUI)
  365.         /*----------------左上------------------------*/
  366. /* _Calibrate upper left */
  367.   GUI_SetFont(&GUI_Font13_ASCII);

  368.   GUI_SetBkColor(GUI_BLUE);  
  369.   GUI_Clear();
  370.   GUI_SetColor(GUI_WHITE);   GUI_FillCircle(ax[0], ay[0], 10);
  371.   GUI_SetColor(GUI_BLUE);    GUI_FillCircle(ax[0], ay[0], 5);
  372.   GUI_SetColor(GUI_WHITE);
  373.   GUI_DispStringAt("Press here", ax[0]+20, ay[0]);
  374.   do{
  375.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  376.     if (p!=(void*)0)   
  377.                 {
  378.      cal.xfb[0] = 20;  //LCD坐标
  379.      cal.yfb[0] = 20;
  380.      cal.x[0] = p->x;  //TOUCH坐标
  381.      cal.y[0] = p->y;
  382.      break;
  383.     }
  384.     GUI_Delay (10);
  385.   } while (1);
  386.   GUI_SetColor(GUI_RED);    GUI_FillCircle(ax[0], ay[0], 5);
  387.   GUI_SetColor(GUI_WHITE);       
  388.         while(!PEN_State);  /* 等待触摸放开 */       
  389.   GUI_Clear();
  390.   GUI_DispStringAt("OK", ax[0]+20, ay[0]);
  391.        
  392.         /*----------------右上------------------------*/
  393.   GUI_Delay (1000);
  394.   GUI_SetBkColor(GUI_BLUE);  
  395.   GUI_Clear();
  396.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[1], ay[1], 10);
  397.   GUI_SetColor(GUI_BLUE);   GUI_FillCircle(ax[1], ay[1], 5);
  398.   GUI_SetColor(GUI_WHITE);
  399.   GUI_SetTextAlign(GUI_TA_RIGHT);   //文本右对齐
  400.   GUI_DispStringAt("Press here", ax[1]-20, ay[1]);
  401.   do {
  402.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  403.     if (p!=(void*)0)
  404.                 {
  405.      cal.xfb[1] = x_size-20;
  406.      cal.yfb[1] = 20;
  407.      cal.x[1] = p->x ;
  408.      cal.y[1] = p->y;
  409.      break;
  410.     }
  411.     GUI_Delay (10);
  412.   } while (1);
  413.   GUI_SetColor(GUI_RED);   GUI_FillCircle(ax[1], ay[1], 5);
  414.         GUI_SetColor(GUI_WHITE);
  415.         while(!PEN_State);  /* 等待触摸放开 */       
  416.   GUI_Clear();
  417.   GUI_DispStringAt("OK", ax[1]-20, ay[1]);
  418.        
  419.         /*----------------右下------------------------*/
  420.         GUI_Delay (1000);
  421.   GUI_Clear();
  422.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[2], ay[2], 10);
  423.   GUI_SetColor(GUI_BLUE);   GUI_FillCircle(ax[2], ay[2], 5);
  424.   GUI_SetColor(GUI_WHITE);
  425.   GUI_SetTextAlign(GUI_TA_RIGHT);   //文本右对齐
  426.   GUI_DispStringAt("Press here", ax[2]-20, ay[2]);
  427.   do {
  428.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  429.     if (p!=(void*)0)
  430.                 {
  431.      cal.xfb[2] = x_size -20;
  432.      cal.yfb[2] = y_size -20;
  433.      cal.x[2] = p->x;
  434.      cal.y[2] = p->y;
  435.      break;           
  436.     }
  437.     GUI_Delay (10);
  438.   } while (1);
  439.   GUI_SetColor(GUI_RED);   GUI_FillCircle(ax[2], ay[2], 5);       
  440.         GUI_SetColor(GUI_WHITE);
  441.         while(!PEN_State);  /* 等待触摸放开 */       
  442.   GUI_Clear();
  443.   GUI_DispStringAt("OK", ax[2]-20, ay[2]);

  444.         /*----------------左下------------------------*/       
  445.         GUI_Delay (1000);
  446.   GUI_Clear();
  447.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[3], ay[3], 10);
  448.   GUI_SetColor(GUI_BLUE);   GUI_FillCircle(ax[3], ay[3], 5);
  449.   GUI_SetColor(GUI_WHITE);
  450.   //GUI_SetTextAlign(GUI_TA_RIGHT);
  451.   GUI_SetTextAlign(GUI_TA_LEFT);   //文本左对齐
  452.   GUI_DispStringAt("Press here", ax[3]+20, ay[3]);
  453.   do {
  454.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  455.     if (p!=(void*)0)
  456.                 {
  457.      cal.xfb[3] = 20;
  458.      cal.yfb[3] = y_size -20;
  459.      cal.x[3] = p->x ;
  460.      cal.y[3] = p->y ;
  461.      break;
  462.     }
  463.     GUI_Delay (10);
  464.   } while (1);
  465.   GUI_SetColor(GUI_RED);   GUI_FillCircle(ax[3], ay[3], 5);       
  466.         GUI_SetColor(GUI_WHITE);
  467.         while(!PEN_State);  /* 等待触摸放开 */
  468.   GUI_Clear();
  469.   GUI_DispStringAt("OK", ax[3]+20, ay[3]);

  470.         /*----------------中心------------------------*/               
  471.         GUI_Delay (1000);
  472.   GUI_Clear();
  473.   GUI_SetColor(GUI_WHITE);  GUI_FillCircle(ax[4], ay[4], 10);
  474.   GUI_SetColor(GUI_BLUE);   GUI_FillCircle(ax[4], ay[4], 5);
  475.   GUI_SetColor(GUI_WHITE);
  476.   GUI_SetTextAlign(GUI_TA_LEFT);  //文本左对齐
  477.   GUI_DispStringAt("Press here", ax[4]+20, ay[4]);
  478.   do {
  479.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  480.     if (p!=(void*)0)  
  481.                 {
  482.      cal.xfb[4] = x_size/2;
  483.      cal.yfb[4] = y_size/2;
  484.      cal.x[4] = p->x ;
  485.      cal.y[4] = p->y ;
  486.      break;
  487.     }
  488.     GUI_Delay (10);
  489.   } while (1);
  490.   GUI_SetColor(GUI_RED);   GUI_FillCircle(ax[4], ay[4], 5);       
  491.         GUI_SetColor(GUI_WHITE);
  492.         while(!PEN_State);  /* 等待触摸放开 */       
  493.   GUI_Clear();
  494.   GUI_DispStringAt("OK", ax[4]+20, ay[4]);       
  495.         /*-----------------------------------------------------*/       
  496.   /* calculate and display values for configuration file */  
  497.         /*-----------------------------------------------------*/               
  498.   {
  499.           GUI_Delay (1000);               
  500.     GUI_Clear();
  501.     GUI_DispString  ("x0: ");        GUI_DispDec(cal.x[0], 4);           //显示(左上)坐标数
  502.           GUI_DispString  ("  y0: ");        GUI_DispDec(cal.y[0], 4); GUI_DispNextLine();


  503.     GUI_DispString  ("x1: ");        GUI_DispDec(cal.x[1], 4);    //显示(右上)坐标数
  504.     GUI_DispString  ("  y1: ");        GUI_DispDec(cal.y[1], 4);        GUI_DispNextLine();

  505.     GUI_DispString  ("x2: ");        GUI_DispDec(cal.x[2], 4);    //显示(右下)坐标数
  506.     GUI_DispString  ("  y2: ");        GUI_DispDec(cal.y[2], 4);        GUI_DispNextLine();

  507.     GUI_DispString  ("x3: ");        GUI_DispDec(cal.x[3], 4);    //显示(左下)坐标数
  508.     GUI_DispString  ("  y3: ");        GUI_DispDec(cal.y[3], 4);        GUI_DispNextLine();

  509.     GUI_DispString  ("x4: ");        GUI_DispDec(cal.x[4], 4);    //显示(中心)坐标数
  510.     GUI_DispString  ("  y4: ");        GUI_DispDec(cal.y[4], 4);        GUI_DispNextLine();
  511.                
  512.     GUI_DispString  ("Please touch display to continue...");
  513.           /*-------------------------------------*/                       
  514.     GUI_Delay(1000);
  515.     do {
  516.                 p = Read_ADS7846_Filter();    //触摸屏按下扫描
  517.     if (p!=(void*)0)
  518.         break;
  519.       GUI_Delay (10);
  520.     } while (1);
  521.   }
  522.         while(!PEN_State);  /* 等待触摸放开 */
  523.         /*-----------------------------------------------------*/               
  524.         CalibrationComplete = 1;     //标志置1
  525.   perform_calibration(&cal);   //触摸校准算法(得到校准参数)
  526. }

  527. /*********************************************************************
  528. * 函数名:short  Calibrate_X(unsigned  int ad_x,unsigned int ad_y)
  529. * 参数  :void
  530. * 返回值:short
  531. * 描述  :X坐标转化
  532. *********************************************************************/
  533. short  Calibrate_X(unsigned  int ad_x,unsigned int ad_y)
  534. {
  535.   int   temp;    //4byte
  536.         short value;   //2byte
  537.        
  538.   temp  =(int)((ad_x*cal.a[0]+ad_y*cal.a[1]+cal.a[2])/cal.a[6]);
  539.         value =(short)temp;

  540.   return value;
  541. }
  542. /*********************************************************************
  543. * 函数名:short  Calibrate_Y(unsigned  int ad_x,unsigned int ad_y)
  544. * 参数  :void
  545. * 返回值:short
  546. * 描述  :Y坐标转化
  547. *********************************************************************/
  548. short  Calibrate_Y(unsigned  int ad_x,unsigned int ad_y)
  549. {
  550.   int   temp;    //4byte
  551.         short value;   //2byte
  552.        
  553.   temp =(int)((ad_x*cal.a[3]+ad_y*cal.a[4]+cal.a[5])/cal.a[6]);
  554.         value =(short)temp;
  555.        
  556.   return value;
  557. }
  558. /*********************************************************************
  559. * 函数名:void TouchTask( int x_size, int y_size )
  560. * 参数  :void
  561. * 返回值:void
  562. * 描述  :触摸屏扫描(10ms)
  563. *********************************************************************/
  564. void TouchTask( int x_size, int y_size )
  565. {
  566.   static uint16_t xOld;
  567.   static uint16_t yOld;
  568.   static uint8_t  PressedOld;
  569.   short x=0, y=0, xDiff=0, yDiff=0;
  570.   Coordinate* p;

  571.         p = Read_ADS7846_Filter();    //触摸屏按下扫描
  572.   /*****************触摸按下(有效数据)*************************/
  573.   /*** Touch screen is pressed ***/
  574.   if (p!=(void *)0)   
  575.         {
  576.          Pressed_Flag = 1;    //触摸按下
  577.          AD_X[0] = p->x;      //X坐标AD值
  578.          AD_Y[0] = p->y;      //Y坐标AD值
  579.          /*-----------LCD坐标值转换--------------*/       
  580.    x = Calibrate_X(p->x ,p->y );// TBD: Insert function which reads current x value
  581.    y = Calibrate_Y(p->x ,p->y );// TBD: Insert function which reads current y value
  582.          /*----------逻辑坐标容错处理------------*/          
  583.          if(x<0)                   x = 0;
  584.          else if(x>x_size)         x = x_size;
  585.          if(y<0)                   y = 0;
  586.          else if(y>y_size)         y = y_size;               
  587.    /*** The touch has already been pressed ***/
  588.    if(PressedOld == 1)     //触摸(上一次)已经按下
  589.          {
  590.     //Calculate difference between new and old position
  591.      xDiff = (x > xOld) ? (x - xOld) : (xOld - x);  //计算出前后两次按下的X坐标差值
  592.      yDiff = (y > yOld) ? (y - yOld) : (yOld - y);  //计算出前后两次按下的Y坐标差值
  593.     // Store state if new position differs significantly from old position
  594.     if(xDiff + yDiff > 2)  //消抖处理
  595.                 {
  596.      xOld = x;
  597.      yOld = y;
  598.      TP_X[0] = x;
  599.                  TP_Y[0] = y;                       
  600.      GUI_TOUCH_StoreState(x, y);       
  601.     }
  602.    }
  603.    /*** The touch was previously released ***/
  604.    // Store state regardless position
  605.    else       //触摸(上一次)未按下
  606.          {
  607.     //if((x != 0) && (y != 0))
  608.                 //{
  609.      xOld = x;
  610.      yOld = y;
  611.      TP_X[0] = x;
  612.                  TP_Y[0] = y;                               
  613.      PressedOld = 1;
  614.      GUI_TOUCH_StoreState(x, y);
  615.     //}
  616.    }
  617.    /*** Touch screen is not pressed ***/
  618.    // Store state if it was released recently
  619.   }
  620.   /**********************无触摸按下****************************/       
  621.         else if(PEN_State)  /* 触摸中断线高电平 */       
  622.         {
  623.          Pressed_Flag = 0;    //触摸未按下       
  624.    if(PressedOld == 1)
  625.          {
  626.     PressedOld = 0;
  627.     GUI_TOUCH_StoreState(-1, -1);  
  628.    }
  629.   }
  630.   /*****************触摸按下(无效野点)*************************/       
  631.         else
  632.         {
  633.    /* 无效数据,不做处理*/
  634.   }       
  635.   /************************************************************/               
  636.   //GUI_X_Delay(20);
  637. }
  638. /*******************************************************************************************/
  639. #endif  // GUI_SUPPORT_TOUCH

复制代码


/****************************************main.c文件*******************************************/

  1. /*************************************************************************
  2. * Function Name: GLCD_Init
  3. * Parameters: const unsigned long *pPain, const unsigned long * pPallete
  4. *
  5. * Return: none
  6. *
  7. * Description: GLCD controller init
  8. *
  9. *************************************************************************/
  10. void GLCD_Init (void)
  11. {  
  12.         // Assign pins     
  13.         g_pIOCON->P2_9         = 0x06;        // VD3,         R0  //RGB(565)
  14.         g_pIOCON->P2_6         = 0x07;        // VD4,                R1
  15.         g_pIOCON->P2_7         = 0x07;        // VD5,                R2
  16.         g_pIOCON->P4_28        = 0x05;        // VD6,                R3
  17.         g_pIOCON->P4_29 = 0x05;        // VD7,                R4

  18.         g_pIOCON->P1_20        = 0x07;        // VD10,        G0
  19.         g_pIOCON->P1_21        = 0x07;        // VD11,        G1
  20.         g_pIOCON->P1_22        = 0x07;        // VD12,        G2
  21.         g_pIOCON->P1_23        = 0x07;        // VD13,        G3
  22.         g_pIOCON->P1_24        = 0x07;        // VD14,        G4
  23.         g_pIOCON->P1_25        = 0x07;        // VD15,        G5
  24.        
  25.         g_pIOCON->P2_13        = 0x07;        // VD19,        B0
  26.         g_pIOCON->P1_26 = 0x07;        // VD20,        B1
  27.         g_pIOCON->P1_27 = 0x07;        // VD21,        B2
  28.         g_pIOCON->P1_28 = 0x07;        // VD22,        B3
  29.         g_pIOCON->P1_29 = 0x07;        // VD23,        B4
  30.        
  31.         g_pIOCON->P2_2        = 0x07;        // DCLK
  32.         g_pIOCON->P2_0        = 0x07;        // DSIP(power)
  33.         g_pIOCON->P2_5        = 0x07;        // HSYNC
  34.         g_pIOCON->P2_3        = 0x07;        // VSYNC
  35.         g_pIOCON->P2_4        = 0x07;        // DataEn(LCD_ENAB_M)

  36.         g_pIOCON->P2_1        = 0x00;        // Backlight(P21)
  37.        
  38.         // >>> debug >>>

  39.         // <<< debug <<<
  40.        
  41.         /*Back light enable*/
  42.         LPC_GPIO2->DIR = (1<<1);  //P2.1设置为输出
  43.         LPC_GPIO2->SET= (5<<1);   //背光高电平(点亮)

  44.         //Turn on LCD clock
  45.         LPC_SC->PCONP |= 1<<0;
  46.        
  47.         // Disable cursor
  48.         g_pLCD->CRSR_CTRL &=~(1<<0);
  49.        
  50.         // disable GLCD controller       
  51.         g_pLCD->CTRL = 0;       //LCD失能
  52.        
  53.         g_pLCD->CTRL &= ~(0x07 <<1);  //LcdBpp 每像素LCD位 000=1bpp
  54.         // RGB565
  55.         g_pLCD->CTRL |= (6<<1);  //RGB(565) 110=16bpp

  56.        
  57.         // TFT panel
  58.         g_pLCD->CTRL |= (1<<5);    //LcdTFT=1  TFT类型
  59.         // single panel
  60.         g_pLCD->CTRL &= ~(1<<7);   //LcdDual=0 LCD单面板
  61.         // notmal output
  62.         g_pLCD->CTRL &= ~(1<<8);   //RGB格式
  63.         // little endian byte order
  64.         g_pLCD->CTRL &= ~(1<<9);   //小端字节序
  65.         // little endian pix order
  66.         g_pLCD->CTRL &= ~(1<<10);
  67.         // disable power
  68.         g_pLCD->CTRL &= ~(1<<11);  //LCD功率失能
  69.         /*-------------------------------------------*/
  70.         /*-------------------------------------------*/       
  71.         // init pixel clock
  72.         g_pSC->LCD_CFG = PeripheralClock / ((unsigned long) C_GLCD_PIX_CLK);   //LCD刷新率8M左右
  73.         // bypass inrenal clk divider
  74.         g_pLCD->POL |=(1<<26);    //旁路像素时钟分频器逻辑
  75.         // clock source for the LCD block is HCLK
  76.         g_pLCD->POL &= ~(1<<5);   //LCD时钟源为内部CCLK
  77.         // LCDFP pin is active LOW and inactive HIGH
  78.         g_pLCD->POL |= (1<<11);
  79.         // LCDLP pin is active LOW and inactive HIGH
  80.         g_pLCD->POL |= (1<<12);
  81.         // data is driven out into the LCD on the falling edge
  82.         g_pLCD->POL &= ~(1<<13);
  83.         // active high
  84.         g_pLCD->POL &= ~(1<<14);
  85.         g_pLCD->POL &= ~(0x3FF <<16);
  86.         g_pLCD->POL |= (C_GLCD_H_SIZE-1)<<16;  //每线时钟(每行像素PPL=480)
  87.        
  88.         // init Horizontal Timing  水平时序寄存器
  89.         g_pLCD->TIMH = 0; //reset TIMH before set value
  90.         g_pLCD->TIMH |= (C_GLCD_H_BACK_PORCH - 1)<<24;   //水平后沿
  91.         g_pLCD->TIMH |= (C_GLCD_H_FRONT_PORCH - 1)<<16;  //水平前沿
  92.         g_pLCD->TIMH |= (C_GLCD_H_PULSE - 1)<<8;         //水平同步脉冲宽度
  93.         g_pLCD->TIMH |= ((C_GLCD_H_SIZE/16) - 1)<<2;     //每行像素
  94.        
  95.         // init Vertical Timing  垂直时序寄存器
  96.         g_pLCD->TIMV = 0;  //reset TIMV value before setting
  97.         g_pLCD->TIMV |= (C_GLCD_V_BACK_PORCH)<<24;       //垂直后沿
  98.         g_pLCD->TIMV |= (C_GLCD_V_FRONT_PORCH)<<16;      //垂直前沿
  99.         g_pLCD->TIMV |= (C_GLCD_V_PULSE - 1)<<10;        //垂直同步脉冲宽度
  100.         g_pLCD->TIMV |= C_GLCD_V_SIZE - 1;               //每面板线数
  101.         // Frame Base Address doubleword aligned
  102.         g_pLCD->UPBASE = LCD_VRAM_BASE_ADDR & ~7UL ;     //上面板帧基址寄存器 (低三位地址屏蔽) 注:UL = unsigned long(确定当前数值类型)
  103.         g_pLCD->LPBASE = LCD_VRAM_BASE_ADDR & ~7UL ;     //下面板帧基址寄存器 (低三位地址屏蔽) 注:UL = unsigned long(确定当前数值类型)
  104.         /*-------------------------------------------*/
  105.         /*-------------------------------------------*/
  106. }       

  107. /*************************************************************************
  108. * Function Name: GLCD_SetPallet
  109. * Parameters: const unsigned long * pPallete
  110. *
  111. * Return: none
  112. *
  113. * Description: GLCD init colour pallete
  114. *
  115. *************************************************************************/
  116. void GLCD_SetPallet (const unsigned long * pPallete)
  117. {
  118.         unsigned long i;
  119.         unsigned long * pDst = (unsigned long *)g_pLCD->PAL;  //彩色调色板寄存器
  120.         // assert(pPallete);
  121.         for (i = 0; i < 128; i++)  //128个位置
  122.         {
  123.          *pDst++ = *pPallete++;
  124.         }
  125. }

  126. /*************************************************************************
  127. * Function Name: GLCD_Ctrl
  128. * Parameters: Bool bEna
  129. * < Bool = unsigned long >
  130. * Return: none
  131. *
  132. * Description: GLCD enable disabe sequence
  133. *
  134. *************************************************************************/
  135. void GLCD_Ctrl (Bool bEna)
  136. {
  137.         volatile unsigned long i;
  138.   if (bEna)
  139.   {
  140.     /*LCD_CTRL_bit.LcdEn = 1;*/
  141.     g_pLCD->CTRL |= (1<<0);       //LCD使能
  142.     for(i = C_GLCD_PWR_ENA_DIS_DLY; i; i--);
  143.     /*LCD_CTRL_bit.LcdPwr= 1;*/   //enable power
  144.     g_pLCD->CTRL |= (1<<11);
  145.   }
  146.   else
  147.   {
  148.     /*LCD_CTRL_bit.LcdPwr= 0;*/  // disable power
  149.     g_pLCD->CTRL &= ~(1<<11);
  150.     for(i = C_GLCD_PWR_ENA_DIS_DLY; i; i--);
  151.     /*LCD_CTRL_bit.LcdEn = 0;*/
  152.     g_pLCD->CTRL &= ~(1<<0);     //LCD失能
  153.   }
  154. }


  155. /*****************************************************************************/
  156. typedef        struct POINT
  157. {
  158.   uint16_t x;
  159.   uint16_t y;
  160. }Coordinate;
  161. /*****************************************************************************/
  162. Coordinate* ptouch;
  163. GUI_PID_STATE Touch_State;   
  164. int TT_buffer[2][32];
  165. /******************************************************************************
  166. **   Main Function  main()
  167. 主频率为84MHz    EMC频率为84MHz     USB频率为48MHz
  168. ******************************************************************************/
  169. int main (void)
  170. {

  171.   HW_X_Config();        //硬件初始化
  172.   SystemInit();         //系统初始化设置
  173.   SDRAM_Init();         //SDRAM初始化
  174.   GLCD_Init ();         //LCD驱动函数
  175.   GLCD_Ctrl (1);        //LCD使能  (把这条指令加上后TFT工作,但是触摸读取数据就跳变很厉害了)
  176.   Touch_Init(480,272);  //触摸驱动

  177.   while(1)
  178.   {
  179.     ptouch = Read_ADS7846_Filter();    //触摸按键扫描
  180.     if (ptouch!=(void *)0)    //触摸按下
  181.         {               
  182.          TT_buffer[0][i]=ptouch->x;  
  183.          TT_buffer[1][i]=ptouch->y;
  184.         }
  185.         else                     //无触摸按键
  186.         {
  187.          TT_buffer[0][i]=0;  
  188.          TT_buffer[1][i]=0;               
  189.         }
  190.     i++;  if(i>31) i=0;
  191.         delayMs(0,10);
  192.   }
  193. }
  194.   
  195.   
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 16:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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