搜索
bottom↓
回复: 17

在ucgui 上使用 tslib 做触摸屏校正的方法

[复制链接]

出0入0汤圆

发表于 2014-6-25 10:44:28 | 显示全部楼层 |阅读模式
前段时间看了百为的tslib的一个例子,成功应用与 ucgui 上。

校正过程:

  1. static BOOL perform_calibration(CALIBRATION_t *cal)
  2. {
  3.     int j;
  4.     float n, x, y, x2, y2, xy, z, zx, zy;
  5.     float det, a, b, c, e, f, i;
  6.     float scaling = 65536.0;

  7.     // Get sums for matrix
  8.     n = x = y = x2 = y2 = xy = 0;

  9.     for (j = 0; j < 5; j++)
  10.     {
  11.         n  += 1.0;
  12.         x  += (float)cal->x[j];
  13.         y  += (float)cal->y[j];
  14.         x2 += (float)(cal->x[j] * cal->x[j]);
  15.         y2 += (float)(cal->y[j] * cal->y[j]);
  16.         xy += (float)(cal->x[j] * cal->y[j]);
  17.     }

  18.     // Get determinant of matrix -- check if determinant is too small
  19.     det = n * (x2 * y2 - xy * xy) + x * (xy * y - x * y2) + y * (x * xy - y * x2);

  20.     if (det < 0.1 && det > -0.1)
  21.     {
  22.         return (FALSE);
  23.     }

  24.     // Get elements of inverse matrix
  25.     a = (x2 * y2 - xy * xy) / det;
  26.     b = (xy * y - x * y2) / det;
  27.     c = (x * xy - y * x2) / det;
  28.     e = (n * y2 - y * y) / det;
  29.     f = (x * y - n * xy) / det;
  30.     i = (n * x2 - x * x) / det;

  31.     // Get sums for x calibration
  32.     z = zx = zy = 0;

  33.     for (j = 0; j < 5; j++)
  34.     {
  35.         z  += (float)cal->xfb[j];
  36.         zx += (float)(cal->xfb[j] * cal->x[j]);
  37.         zy += (float)(cal->xfb[j] * cal->y[j]);
  38.     }

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

  43.     // Get sums for y calibration
  44.     z = zx = zy = 0;

  45.     for (j = 0; j < 5; j++)
  46.     {
  47.         z  += (float)cal->yfb[j];
  48.         zx += (float)(cal->yfb[j] * cal->x[j]);
  49.         zy += (float)(cal->yfb[j] * cal->y[j]);
  50.     }

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

  55.     // If we got here, we're OK, so assign scaling to a[6] and return
  56.     cal->a[6] = (int)scaling;

  57.     return (TRUE);
  58. }

  59. /*
  60.     功能:读取触摸屏读坐标,该坐标未做转换,不能直接使用

  61.     返回:0=无效坐标
  62.           1=有效坐标

  63.     说明:本函数连续采样2次,2次采样结果+-5范围内才算有效
  64. */
  65. static BOOL TOUCH_MeasureXY(int *x, int *y)
  66. {
  67.     int x1, y1;
  68.     int x2, y2;
  69.     int i;

  70.     x1 = TOUCH_X_MeasureX();
  71.     y1 = TOUCH_X_MeasureY();

  72.     for (i = 0; i < 1000; i++);

  73.     x2 = TOUCH_X_MeasureX();
  74.     y2 = TOUCH_X_MeasureY();

  75.     if (ABS(x1 - x2) < 50 && ABS(y1 - y2) < 50)
  76.     {
  77.         *x = (x1 + x2) / 2;
  78.         *y = (y1 + y2) / 2;

  79.         return TRUE;
  80.     }
  81.     else
  82.     {
  83.         return FALSE;
  84.     }
  85. }

  86. static BOOL check_touch_pressed(int xPhys,
  87.                                 int yPhys)
  88. {
  89.     if ((xPhys < MIN_AD_X) ||
  90.         (xPhys > MAX_AD_X) ||
  91.         (yPhys < MIN_AD_Y) ||
  92.         (yPhys > MAX_AD_Y))
  93.     {
  94.         return (FALSE);
  95.     }

  96.     return (TRUE);
  97. }

  98. static void get_sample(CALIBRATION_t *cal,
  99.                        int index,
  100.                        int x,
  101.                        int y,
  102.                        BOOL isRight)
  103. {
  104.     int xPhys, yPhys;

  105.     GUI_SetColor(GUI_WHITE);
  106.     GUI_FillCircle(x, y, 10);

  107.     GUI_SetColor(GUI_RED);
  108.     GUI_FillCircle(x, y, 5);

  109.     GUI_SetColor(GUI_WHITE);

  110.     if (isRight)
  111.         GUI_DispStringAt(MSG_PRESS_HERE, x - 80, y - 8);
  112.     else
  113.         GUI_DispStringAt(MSG_PRESS_HERE, x + 20, y - 8);

  114.     // Wait touch to release
  115.     while (1)
  116.     {
  117.         if (TOUCH_MeasureXY(&xPhys, &yPhys))
  118.         {
  119.             if (!check_touch_pressed(xPhys, yPhys))
  120.                 break;
  121.         }

  122.         OSTimeDlyHMSM(0, 0, 0, 100);
  123.     }

  124.     // Wait touch pressed
  125.     while(1)
  126.     {
  127.         if (TOUCH_MeasureXY(&xPhys, &yPhys))
  128.         {
  129.             if (check_touch_pressed(xPhys, yPhys))
  130.             {
  131.                 if (TOUCH_MeasureXY(&cal->x[index], &cal->y[index]))
  132.                     break;
  133.             }
  134.         }

  135.         OSTimeDlyHMSM(0, 0, 0, 100);
  136.     };

  137.     /* Tell user to release */
  138.     GUI_Clear();

  139.     if (isRight)
  140.         GUI_DispStringAt(MSG_COMPLETE, x - 80, y - 8);
  141.     else
  142.         GUI_DispStringAt(MSG_COMPLETE, x + 20,  y - 8);

  143.     cal->xfb[index] = x;
  144.     cal->yfb[index] = y;
  145. }

  146. /*********************************************************************
  147. *
  148. *       _ExecCalibration
  149. *
  150. **********************************************************************
  151. */
  152. BOOL ExecCalibration(CALIBRATION_t *cal)
  153. {
  154.     BOOL result;
  155.     GUI_RECT rect;

  156.     int xPhys;
  157.     int yPhys;
  158.        
  159.     /* _Calibrate upper left */
  160.     GUI_SetBkColor(GUI_RED);
  161.     GUI_Clear();
  162.     GUI_SetFont(&GUI_FontHZ_SimSun_16);

  163.     // Top Left
  164.     get_sample(cal, 0, 50,             50,             FALSE);

  165.     // Top Right
  166.     get_sample(cal, 1, LCD_XSIZE - 50, 50,             TRUE);

  167.     // Bottom Right
  168.     get_sample(cal, 2, LCD_XSIZE - 50, LCD_YSIZE - 50, TRUE);

  169.     // Bottom Left
  170.     get_sample(cal, 3, 50,             LCD_YSIZE - 50, FALSE);

  171.     // Center
  172.     get_sample(cal, 4, LCD_XSIZE / 2,  LCD_YSIZE / 2,  FALSE);

  173.     rect.x0 = 0;
  174.     rect.x1 = LCD_XSIZE;
  175.     rect.y0 = 50;
  176.     rect.y1 = rect.y0 + 20;

  177.     GUI_Clear();

  178.     result = perform_calibration(cal);

  179.     if (result)
  180.         GUI_DispStringInRect(MSG_CALIBRATION_SUCCESSFUL,
  181.                              &rect, GUI_TA_CENTER | GUI_TA_VCENTER);
  182.     else
  183.         GUI_DispStringInRect(MSG_CALIBRATION_SUCCESSFUL,
  184.                              &rect, GUI_TA_CENTER | GUI_TA_VCENTER);

  185.     rect.y0 = 80;
  186.     rect.y1 = rect.y0 + 20;

  187.     GUI_DispNextLine();

  188.     GUI_DispStringInRect(MSG_PRESS_TOUCH_TO_CONTINUE,
  189.                          &rect, GUI_TA_CENTER | GUI_TA_VCENTER);

  190.     OSTimeDlyHMSM(0, 0, 0, 200);

  191.     // Wait the touch to continue
  192.     while (1)
  193.     {
  194.         if (TOUCH_MeasureXY(&xPhys, &yPhys))
  195.         {
  196.             if (check_touch_pressed(xPhys, yPhys))
  197.                 break;
  198.         }

  199.         OSTimeDlyHMSM(0, 0, 0, 10);
  200.     }

  201.     return (result);
  202. }

复制代码


因为ucgui 内部使用的是简单的两点校正法,所以我们自己定义 GUI_TOUCH_Exec() 函数。

  1. /*********************************************************************
  2. *
  3. *       _StoreUnstable
  4. */
  5. static void _StoreUnstable(int x, int y)
  6. {
  7.     static int _xLast = -1;
  8.     static int _yLast = -1;
  9.     int xOut, yOut;

  10.     if ((x != -1) &&
  11.         (y != -1) &&
  12.         (_xLast != -1) &&
  13.         (_yLast != -1))
  14.     {
  15.         xOut = _xLast;
  16.         yOut = _yLast;
  17.     }
  18.     else
  19.     {
  20.         xOut = -1;
  21.         yOut = -1;
  22.     }

  23.     _xLast = x;
  24.     _yLast = y;

  25.     GUI_TOUCH_StoreUnstable(xOut, yOut);
  26. }


  27. /*********************************************************************
  28. *
  29. *       My_GUI_TOUCH_Exec
  30. */
  31. void My_GUI_TOUCH_Exec()
  32. {
  33.     int xPhys, yPhys;
  34.     int x, y;

  35.     if (TOUCH_MeasureXY(&xPhys, &yPhys))
  36.     {
  37.         /* Convert values into logical values */
  38.         x = (int)((mCurrentSettings.cal.a[0] + mCurrentSettings.cal.a[1] * xPhys +
  39.                    mCurrentSettings.cal.a[2] * yPhys) / mCurrentSettings.cal.a[6]);

  40.         y = (int)((mCurrentSettings.cal.a[3] + mCurrentSettings.cal.a[4] * xPhys +
  41.                    mCurrentSettings.cal.a[5] * yPhys) / mCurrentSettings.cal.a[6]);

  42.         if ((x < 0) || (x > LCD_XSIZE) || (y < 0) || (y > LCD_YSIZE))
  43.         {
  44.             _StoreUnstable(-1, -1);
  45.         }
  46.         else
  47.         {
  48.             _StoreUnstable(x, y);
  49.         }
  50.     }
  51. }
复制代码


替换掉原来的 GUI_TOUCH_Exec 变成 My_GUI_TOUCH_Exec 即可。

出0入0汤圆

发表于 2014-6-26 23:55:54 | 显示全部楼层
不错,顶下,这个估计很多人会用到

出0入0汤圆

发表于 2014-6-27 13:38:06 来自手机 | 显示全部楼层
谢谢了,正需要

出0入0汤圆

发表于 2014-6-27 13:53:32 来自手机 | 显示全部楼层
问生保存的数据是哪些,谢谢

出0入0汤圆

发表于 2014-6-27 14:54:07 来自手机 | 显示全部楼层
谢谢楼主,收下了

出0入0汤圆

 楼主| 发表于 2014-6-27 16:28:05 | 显示全部楼层
本帖最后由 truecai 于 2014-6-27 16:29 编辑

保存的数据的结构体定义没有贴出来,

typedef struct {
    int x[5];
    int y[5];
    int xfb[5];
    int yfb[5];
    int a[7];
} CALIBRATION_t;

这个数据可以放在EEPROM 中,和其他的配置放在一块,加入CRC, 如果有发现CRC错误(一般都是在新的板子上出现),就提示用户做校正。

我们可以增加一个强制清除配置的方法,就是开机的时候如果用户点击屏幕的右下角,时间超过2秒钟,就会恢复默认配置,重做屏幕校正。

出0入0汤圆

 楼主| 发表于 2014-6-27 16:31:59 | 显示全部楼层
ersha4877 发表于 2014-6-27 13:53
问生保存的数据是哪些,谢谢


使用的数据的结构体定义没有贴出来,

typedef struct {
    int x[5];
    int y[5];
    int xfb[5];
    int yfb[5];
    int a[7];
} CALIBRATION_t;

使用的数据就是 int a[7] 这几个数据。

这个数据可以放在EEPROM 中,和其他的配置放在一块,加入CRC, 如果有发现CRC错误(一般都是在新的板子上出现),就提示用户做校正。

我们可以增加一个强制清除配置的方法,就是开机的时候如果用户点击屏幕的右下角,时间超过2秒钟,就会恢复默认配置,重做屏幕校正。

出0入0汤圆

发表于 2014-6-27 17:41:25 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2014-6-28 18:23:21 | 显示全部楼层
truecai 发表于 2014-6-27 16:31
使用的数据的结构体定义没有贴出来,

typedef struct {


不好意思问声这个 mCurrentSettings.cal.a[0] 是怎么定义的啊,谢谢怎么感觉多了个 .CAL 啊

出0入0汤圆

发表于 2014-6-28 21:16:04 | 显示全部楼层
我们在RTGUI里面也用了tslib的算法,并对算法进行了优化,效果非常好。RTGUI里面的touch驱动直接给采集的adc值就行,使用非常简单。

出0入0汤圆

发表于 2014-6-28 22:44:28 | 显示全部楼层
truecai 发表于 2014-6-27 16:31
使用的数据的结构体定义没有贴出来,

typedef struct {

不好意思啊,我用了下,怎么a[7]DE  数据 是 00 00 00 00 00 00 80 00 00 00 00 00 00 00  ,这么个啊,是否可以给个工程文件啊,谢谢

#include "Simulate_I2C.h"
#include"stm32f10x.h"

#include "GUI.h"
#include "GUI_X.h"
#include "tsc2046.h"

//Ìæ»»µô GUI_TOUCH_Exec±äΪ My_GUI_TOUCH_Exec

#define LCD_XSIZE          (320)       /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE          (240)       /* Y-resolution of LCD, Logical coor. */

#define MIN_AD_X  0
#define MAX_AD_X  4096
#define MIN_AD_Y  0
#define MAX_AD_Y  4096

#define ABS(v) ((v>0) ? v : -v)

typedef struct {
    int x[5];
    int y[5];
    int xfb[5];
    int yfb[5];
    int a[7];
} CALIBRATION_t;

CALIBRATION_t  mCurrentSettings;

extern  unsigned char TOUCH_Calibrate_ok;
//--------------------------------------------------------
static BOOL perform_calibration(CALIBRATION_t *cal)

{

    int j;

    float n, x, y, x2, y2, xy, z, zx, zy;

    float det, a, b, c, e, f, i;

    float scaling = 65536.0;

    // Get sums for matrix

    n = x = y = x2 = y2 = xy = 0;

    for (j = 0; j < 5; j++)

    {

        n  += 1.0;

        x  += (float)cal->x[j];

        y  += (float)cal->y[j];

        x2 += (float)(cal->x[j] * cal->x[j]);

        y2 += (float)(cal->y[j] * cal->y[j]);

        xy += (float)(cal->x[j] * cal->y[j]);

    }



    // Get determinant of matrix -- check if determinant is too small

    det = n * (x2 * y2 - xy * xy) + x * (xy * y - x * y2) + y * (x * xy - y * x2);

    if (det < 0.1 && det > -0.1)

    {

       return (FALSE);

    }

   // Get elements of inverse matrix

    a = (x2 * y2 - xy * xy) / det;

    b = (xy * y - x * y2) / det;

    c = (x * xy - y * x2) / det;

    e = (n * y2 - y * y) / det;

    f = (x * y - n * xy) / det;

    i = (n * x2 - x * x) / det;

    // Get sums for x calibration

    z = zx = zy = 0;

    for (j = 0; j < 5; j++)

    {

        z  += (float)cal->xfb[j];

        zx += (float)(cal->xfb[j] * cal->x[j]);

        zy += (float)(cal->xfb[j] * cal->y[j]);

    }

   // Now multiply out to get the calibration for framebuffer x coord

    cal->a[0] = (int)((a * z + b * zx + c * zy) * (scaling));

    cal->a[1] = (int)((b * z + e * zx + f * zy) * (scaling));

    cal->a[2] = (int)((c * z + f * zx + i * zy) * (scaling));

   // Get sums for y calibration

    z = zx = zy = 0;

    for (j = 0; j < 5; j++)

    {

        z  += (float)cal->yfb[j];

        zx += (float)(cal->yfb[j] * cal->x[j]);

        zy += (float)(cal->yfb[j] * cal->y[j]);

    }

    // Now multiply out to get the calibration for framebuffer y coord

    cal->a[3] = (int)((a * z + b * zx + c * zy) * (scaling));

    cal->a[4] = (int)((b * z + e * zx + f * zy) * (scaling));

    cal->a[5] = (int)((c * z + f * zx + i * zy) * (scaling));

    // If we got here, we're OK, so assign scaling to a[6] and return

    cal->a[6] = (int)scaling;

    return (TRUE);

}

//-----------------------------------------------------
//¶ÁÈ¡´¥ÃþÆÁ×ø±ê£¬Î´×ö×ø±êת»»£¬²»ÄÜÖ±½ÓʹÓÃ
//Á¬Ðø¶Á2´Î£¬½á¹û+-5ÒÔÄÚÓÐЧ
static BOOL TOUCH_MeasureXY(int *x, int *y)

{

    int x1, y1;

    int x2, y2;

    int i;

    x1 = TOUCH_X_MeasureX();

    y1 = TOUCH_X_MeasureY();

    for (i = 0; i < 1000; i++);

    x2 = TOUCH_X_MeasureX();

    y2 = TOUCH_X_MeasureY();

    if (ABS(x1 - x2) < 50 && ABS(y1 - y2) < 50)

   {

        *x = (x1 + x2) / 2;

        *y = (y1 + y2) / 2;

        return TRUE;
    }
   else

    {

        return FALSE;

    }

}


static BOOL check_touch_pressed(int xPhys,

                                int yPhys)

{

    if ((xPhys < MIN_AD_X) ||

        (xPhys > MAX_AD_X) ||

        (yPhys < MIN_AD_Y) ||

        (yPhys > MAX_AD_Y))

    {

        return (FALSE);

    }



    return (TRUE);

}



static void get_sample(CALIBRATION_t *cal,

                       int index,

                       int x,

                       int y,

                       BOOL isRight)

{

    int xPhys, yPhys;

    GUI_SetColor(GUI_WHITE);

    GUI_FillCircle(x, y, 10);



    GUI_SetColor(GUI_RED);

    GUI_FillCircle(x, y, 5);

    GUI_SetColor(GUI_WHITE);

    if (isRight)

        GUI_DispStringAt("MSG_PRESS_HERE", x - 80, y - 8);

    else

       GUI_DispStringAt("MSG_PRESS_HERE", x + 20, y - 8);



    // Wait touch to release

    while (1)

    {

        if (TOUCH_MeasureXY(&xPhys, &yPhys))

        {

            if (!check_touch_pressed(xPhys, yPhys))

                break;

       }


//        OSTimeDlyHMSM(0, 0, 0, 100);

    }

    // Wait touch pressed

    while(1)

    {

        if (TOUCH_MeasureXY(&xPhys, &yPhys))

        {

            if (check_touch_pressed(xPhys, yPhys))

            {

                if (TOUCH_MeasureXY(&cal->x[index], &cal->y[index]))

                    break;

            }

        }



//        OSTimeDlyHMSM(0, 0, 0, 100);

    };



    // Tell user to release

    GUI_Clear();

    if (isRight)

        GUI_DispStringAt("MSG_COMPLETE", x - 80, y - 8);

    else

        GUI_DispStringAt("MSG_COMPLETE", x + 20,  y - 8);

       cal->xfb[index] = x;

       cal->yfb[index] = y;

}



//*********************************************************************



//      _ExecCalibration



//**********************************************************************

//

BOOL ExecCalibration(CALIBRATION_t *cal)

{

    BOOL result;

    GUI_RECT rect;

          int xPhys;

    int yPhys;

        
    GUI_Init();
    //_Calibrate upper left

    GUI_SetBkColor(GUI_RED);

    GUI_Clear();

//    GUI_SetFont(&GUI_FontHZ_SimSun_16);

    // Top Left

    get_sample(cal, 0, 50,             50,             FALSE);

    // Top Right

    get_sample(cal, 1, LCD_XSIZE - 50, 50,             TRUE);

    // Bottom Right

    get_sample(cal, 2, LCD_XSIZE - 50, LCD_YSIZE - 50, TRUE);

    // Bottom Left

    get_sample(cal, 3, 50,             LCD_YSIZE - 50, FALSE);

    // Center

    get_sample(cal, 4, LCD_XSIZE / 2,  LCD_YSIZE / 2,  FALSE);

    rect.x0 = 0;

    rect.x1 = LCD_XSIZE;

    rect.y0 = 50;

    rect.y1 = rect.y0 + 20;

    GUI_Clear();

    result = perform_calibration(cal);

    if (result)

    GUI_DispStringInRect("MSG_CALIBRATION_SUCCESSFUL",

                             &rect, GUI_TA_CENTER | GUI_TA_VCENTER);

    else

           GUI_DispStringInRect("MSG_CALIBRATION_SUCCESSFUL",

                             &rect, GUI_TA_CENTER | GUI_TA_VCENTER);

    rect.y0 = 80;

    rect.y1 = rect.y0 + 20;

    GUI_DispNextLine();

    GUI_DispStringInRect("MSG_PRESS_TOUCH_TO_CONTINUE",

                         &rect, GUI_TA_CENTER | GUI_TA_VCENTER);



//    OSTimeDlyHMSM(0, 0, 0, 200);

    // Wait the touch to continue

    while (1)

    {

        if (TOUCH_MeasureXY(&xPhys, &yPhys))

        {

            if (check_touch_pressed(xPhys, yPhys))

                break;

        }


//        OSTimeDlyHMSM(0, 0, 0, 10);

    }

    return (result);

}


//--------------------------------------------------------

//

//       _StoreUnstable

//--------------------------------------------------------

static void _StoreUnstable1(int x, int y)

{

    static int _xLast = -1;

    static int _yLast = -1;

    int xOut, yOut;

    if ((x != -1) &&

        (y != -1) &&

        (_xLast != -1) &&

        (_yLast != -1))

    {

        xOut = _xLast;

        yOut = _yLast;

    }

    else

    {

        xOut = -1;

        yOut = -1;

   }



    _xLast = x;

    _yLast = y;



    GUI_TOUCH_StoreUnstable(xOut, yOut);

}





//---------------------------------------------------------------------

//       My_GUI_TOUCH_Exec

//
//---------------------------------------------------------------------
void My_GUI_TOUCH_Exec1()

{

    int xPhys, yPhys;

    int x, y;

    if (TOUCH_MeasureXY(&xPhys, &yPhys))

    {

        // Convert values into logical values

       x = (int)((mCurrentSettings.a[0] + mCurrentSettings.a[1] * xPhys +

                   mCurrentSettings.a[2] * yPhys) / mCurrentSettings.a[6]);

        y = (int)((mCurrentSettings.a[3] + mCurrentSettings.a[4] * xPhys +

                   mCurrentSettings.a[5] * yPhys) / mCurrentSettings.a[6]);



        if ((x < 0) || (x > LCD_XSIZE) || (y < 0) || (y > LCD_YSIZE))

        {

            _StoreUnstable1(-1, -1);

        }

        else

        {

            _StoreUnstable1(x, y);

        }

    }

}


void MainTask3(void)
{
        unsigned char i;
        if(ExecCalibration(&mCurrentSettings)==1)
        {
          USART_SendData(USART1, (unsigned char)(0xaa));
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                for(i=0;i<7;i++)
                 {
                         USART_SendData(USART1, (unsigned char)(mCurrentSettings.a>>8));
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                         USART_SendData(USART1, (unsigned char)(mCurrentSettings.a));
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                 }
               
                TOUCH_Calibrate_ok=1;
        }
       
}
//-----------------------------------------------------------------------









出0入0汤圆

发表于 2014-6-29 12:46:06 | 显示全部楼层
不错,顶                                

出0入0汤圆

 楼主| 发表于 2014-7-1 08:45:04 | 显示全部楼层
ersha4877 发表于 2014-6-28 22:44
不好意思啊,我用了下,怎么a[7]DE  数据 是 00 00 00 00 00 00 80 00 00 00 00 00 00 00  ,这么个啊,是否 ...

不好意思,这几天比较忙,没有登录阿莫。

看起来大致代码没有问题,但是一下的信息错误:

#define MIN_AD_X  0
#define MAX_AD_X  4096
#define MIN_AD_Y  0
#define MAX_AD_Y  4096

这个信息和你的触摸屏相关,点击在屏幕上4个脚的AD最大,最小值。为什么需要用这个的原因是如何判断是否有屏幕被点击,你的这个数值不正确(就算是触摸屏没有按下,数值的范围也是这个以内)。

如果你有一些硬件的IO口可以判断是否有触摸屏是否按下,可以不用这个办法。

出0入0汤圆

发表于 2014-7-1 18:24:57 | 显示全部楼层
谢谢回复,正在处里CAL-A[0]~~~CAL-A[6] 数据长度问题,百为说 cal->a[6] = (int)scaling;  数据类型转换后是32位 ,得看看了,转换成 unsigned ing 就变成 0了.

出0入0汤圆

发表于 2014-7-28 16:02:53 | 显示全部楼层

出0入0汤圆

发表于 2015-5-4 14:25:19 | 显示全部楼层
替换掉原来的 GUI_TOUCH_Exec 变成 My_GUI_TOUCH_Exec 即可。这句是如何理解的?

出0入0汤圆

发表于 2015-5-12 07:09:40 | 显示全部楼层
mark,mark

出0入10汤圆

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

本版积分规则

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

GMT+8, 2024-5-4 15:01

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

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