久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7168|回復: 4
打印 上一主題 下一主題
收起左側

電阻觸摸屏的校準程序V1.0版--灼灼其華

[復制鏈接]
跳轉到指定樓層
樓主
ID:90014 發表于 2015-9-14 18:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 jialinx 于 2015-9-14 18:51 編輯
  1. /* 頭文件 touch.h */

  2. #ifndef TOUCH_H
  3. #define TOUCH_H

  4. /* 添加驅動文件 */
  5. //#include "Diver.h"

  6. typedef unsigned short int uint16_t ;

  7. typedef unsigned char uint8_t;

  8. typedef short int int16_t;

  9. /* 觸摸屏必要數據結構體 */
  10. typedef struct
  11. {
  12.     /* 得到觸摸屏X通道AD數據的方法 */
  13.     uint16_t (* const Get_XChannel)(void);

  14.     /* 得到觸摸屏Y通道AD數據的方法 */
  15.     uint16_t (* const Get_YChannel)(void);

  16.     /* 延時函數 */
  17.     void (*Delay_ms)(uint16_t);

  18.     /* 查看觸摸屏是否被按下  返回0表示未按下 否則被按下 */
  19.     uint8_t (*Get_StatusFlag)(void);

  20.     void (*Clear_PendingBit)(void);

  21.     /* 在液晶屏上顯示十字號函數 */
  22.     void (*DispH)(uint16_t x ,uint16_t y);

  23.     /* 液晶屏的X=觸摸屏的X*TP_Xk+TP_Xoffset Y坐標也同理*/
  24.     float Xk;

  25.     float Yk;

  26.     float Xoffset;

  27.     float Yoffset;

  28. }Tuch_TypeDef;

  29. /* 坐標結構體 */
  30. typedef struct
  31. {
  32.     uint16_t TP_X;

  33.     uint16_t TP_Y;

  34. }Touch_CoorDinate;


  35. #define Calibration_x1  50
  36. #define Calibration_y1  50

  37. #define Calibration_x2  50
  38. #define Calibration_y2  190

  39. #define Calibration_x3  270
  40. #define Calibration_y3  190

  41. #define Calibration_x4  270
  42. #define Calibration_y4  50


  43. /* 得到液晶屏的坐標 返回值0 坐標靠譜 否則不靠譜 */
  44. uint8_t Touch_GetCoordinate(Touch_CoorDinate *TP_COOR);

  45. /* 觸摸屏校準 返回0 校準成功  否則失敗 */
  46. uint8_t TP_Calibration(void);



  47. #endif // TOUCH_H_INCLUDED
復制代碼



  1. /* 源文件 touch.c */

  2. /*
  3.     名稱:電阻觸摸屏的校準程序V1.0版
  4.     作者:灼灼其華

  5.     移植的時候只要給 Touch_Structure 這個變量賦初值 就可以了

  6.     Get_XChannel        得到X通道的數據的方法

  7.     Get_YChannel        得到Y通道數據的方法

  8.     Delay_ms            毫秒級延時函數

  9.     Get_StatusFlag      檢測觸摸屏被按下的方法 0 沒有按下  1 已結按下了

  10.     Clear_PendingBit    清除觸摸屏按下標志的方法

  11.     DispH               在液晶屏上顯示十字號的方法

  12.     移植之前要先實現這幾個簡單的函數/方法
  13. */

  14. #include "touch.h"

  15. #define N   10
  16. /* 保存點擊一次觸摸屏 采集的數據 */
  17. static uint16_t TP_Coordinate[2][10];

  18. /* 給Touch_Structure 變量賦初值 */
  19. static Tuch_TypeDef     Touch_Structure;


  20. #define R   50
  21. /* 觸摸屏數據濾波 */
  22. uint16_t TP_Data_Processing(uint16_t *pData,uint8_t Length)
  23. {
  24.     uint8_t i,j,Cnt=0,Max=0;

  25.     uint16_t Number,cc;

  26.     for(i=0;i<Length;i++)
  27.     {
  28.         for(j=0;j<Length;j++)
  29.         {
  30.             if(i==j)
  31.                 continue;

  32.             if(pData[i]>pData[j])
  33.                 cc=pData[i]-pData[j];
  34.             else
  35.                 cc=pData[j]-pData[i];

  36.             if(cc<R)
  37.             {
  38.                 Cnt++;
  39.             }
  40.         }

  41.         if(Cnt>Max)
  42.         {
  43.             Max=Cnt;
  44.             Number=pData[i];
  45.         }
  46.         Cnt=0;
  47.     }

  48.     return Number;
  49. }

  50. /* 求二階行列式的值 */
  51. int16_t Get_Determinant_2(int16_t a11,int16_t a12,int16_t a21,int16_t a22)
  52. {
  53.     return (a11*a22-a21*a12);
  54. }

  55. /* 解二元一次方程 前兩列保存的是系數 */
  56. uint8_t Solve_Equations_2(int16_t(*ptr)[3],float *k,float *off)
  57. {
  58.     int16_t D,D1,D2;

  59.     D=Get_Determinant_2(ptr[0][0],ptr[0][1],ptr[1][0],ptr[1][1]);

  60.     if(D==0)
  61.         return 1;

  62.     D1=Get_Determinant_2(ptr[0][2],ptr[0][1],ptr[1][2],ptr[1][1]);

  63.     D2=Get_Determinant_2(ptr[0][0],ptr[0][2],ptr[1][0],ptr[1][2]);

  64.     *k=D1/(float)D;

  65.     *off=D2/(float)D;

  66.     return 0;
  67. }

  68. /* 求絕對值 */
  69. uint16_t Get_ABS(uint16_t x,uint16_t y)
  70. {
  71.     if(x>y)
  72.         return x-y;
  73.     else
  74.         return y-x;
  75. }


  76. // 允許的誤差 */
  77. #define CCMAX   50

  78. /* 得到觸摸屏的坐標 并且濾波 返回0 表示坐標靠譜   否則是不靠譜的 */
  79. uint8_t TP_GetCoorDinate(Touch_CoorDinate *TP_COOR)
  80. {
  81.     uint8_t bit;

  82.     uint16_t TP_XCoor_1,TP_YCoor_1;
  83.     uint16_t TP_XCoor_2,TP_YCoor_2;
  84.     /* 第一次采集數據 */
  85.     for(bit=0;bit<N;bit++)
  86.     {
  87.         /* 采集10次 X 數據 */
  88.         TP_Coordinate[0][bit]=Touch_Structure.Get_XChannel();

  89.         /* 采集10次 Y 數據 */
  90.         TP_Coordinate[1][bit]=Touch_Structure.Get_YChannel();
  91.     }

  92.     TP_XCoor_1=TP_Data_Processing(TP_Coordinate[0],N);

  93.     TP_YCoor_1=TP_Data_Processing(TP_Coordinate[1],N);

  94.     /* 第二次采集數據 */
  95.     for(bit=0;bit<N;bit++)
  96.     {
  97.         /* 采集10次 X 數據 */
  98.         TP_Coordinate[0][bit]=Touch_Structure.Get_XChannel();

  99.         /* 采集10次 Y 數據 */
  100.         TP_Coordinate[1][bit]=Touch_Structure.Get_YChannel();
  101.     }

  102.     TP_XCoor_2=TP_Data_Processing(TP_Coordinate[0],N);

  103.     TP_YCoor_2=TP_Data_Processing(TP_Coordinate[1],N);

  104.     /* 兩次采集的數據之差不能超過CCMAX 否則認為數據不靠譜 */

  105.     if( Get_ABS(TP_XCoor_1 , TP_XCoor_2) >CCMAX )
  106.         return 1;

  107.     if( Get_ABS(TP_YCoor_1 , TP_YCoor_2) >CCMAX )
  108.         return 1;

  109.     /* 取兩次采集數據的平均值 */
  110.     TP_COOR->TP_X=(TP_XCoor_1>>1)+(TP_XCoor_2>>1);

  111.     TP_COOR->TP_Y=(TP_YCoor_1>>1)+(TP_YCoor_2>>1);
  112. }

  113. /* 校準誤差 */
  114. #define CCMA        100

  115. /* 觸摸屏校準 */
  116. uint8_t TP_Calibration(void)
  117. {
  118.         Touch_CoorDinate TP_COOR[4];

  119.     int16_t arr[2][3];

  120.     uint16_t CC,CC1,CC2;

  121.     /* 校準第一個點 */
  122.     Touch_Structure.Delay_ms(500);

  123.     Touch_Structure.DispH(Calibration_x1,Calibration_y1);

  124.     Touch_Structure.Clear_PendingBit();

  125.     while(1)
  126.     {
  127.         if(Touch_Structure.Get_StatusFlag())
  128.         {
  129.             Touch_Structure.Clear_PendingBit();

  130.             if(TP_GetCoorDinate(TP_COOR))
  131.             {
  132.                 /* 顯示重新點擊 */
  133.             }
  134.             else
  135.                 break;
  136.         }
  137.     }


  138.     /* 校準第二個點 */
  139.     Touch_Structure.Delay_ms(500);

  140.     Touch_Structure.DispH(Calibration_x2,Calibration_y2);

  141.     Touch_Structure.Clear_PendingBit();

  142.     while(1)
  143.     {
  144.         if(Touch_Structure.Get_StatusFlag())
  145.         {
  146.             Touch_Structure.Clear_PendingBit();

  147.             if(TP_GetCoorDinate(TP_COOR+1))
  148.             {
  149.                 /* 顯示重新點擊 */
  150.             }
  151.             else
  152.                 break;
  153.         }
  154.     }


  155.     /* 校準第三個點 */
  156.     Touch_Structure.Delay_ms(500);

  157.     Touch_Structure.DispH(Calibration_x3,Calibration_y3);

  158.     Touch_Structure.Clear_PendingBit();

  159.     while(1)
  160.     {
  161.         if(Touch_Structure.Get_StatusFlag())
  162.         {
  163.             Touch_Structure.Clear_PendingBit();

  164.             if(TP_GetCoorDinate(TP_COOR+2))
  165.             {
  166.                 /* 顯示重新點擊 */
  167.             }
  168.             else
  169.                 break;
  170.         }
  171.     }


  172.      /* 校準第四個點 */
  173.     Touch_Structure.Delay_ms(500);

  174.     Touch_Structure.DispH(Calibration_x4,Calibration_y4);

  175.     Touch_Structure.Clear_PendingBit();

  176.     while(1)
  177.     {
  178.         if(Touch_Structure.Get_StatusFlag())
  179.         {
  180.             Touch_Structure.Clear_PendingBit();

  181.             if(TP_GetCoorDinate(TP_COOR+3))
  182.             {
  183.                 /* 顯示重新點擊 */
  184.             }
  185.             else
  186.                 break;
  187.         }
  188.     }

  189.     /* 檢查數據是否準確 */

  190.     CC1=Get_ABS(TP_COOR[0].TP_X , TP_COOR[3].TP_X);

  191.     CC2=Get_ABS(TP_COOR[2].TP_X , TP_COOR[1].TP_X);

  192.     CC=Get_ABS(CC1,CC2);

  193.     if(CC>CCMA)
  194.         return 1;

  195.     CC1=Get_ABS(TP_COOR[0].TP_Y , TP_COOR[1].TP_Y);

  196.     CC2=Get_ABS(TP_COOR[2].TP_Y , TP_COOR[3].TP_Y);

  197.     CC=Get_ABS(CC1,CC2);

  198.     if(CC>CCMA)
  199.         return 1;

  200.     /* 解方程求 TP_Xk TP_Yk TP_Xoffset TP_Yoffset */
  201.     /* 觸摸屏坐標*K+offset =液晶屏坐標 */
  202.     arr[0][0]=TP_COOR[0].TP_X; arr[0][1]=1; arr[0][2]=Calibration_x1;

  203.     arr[1][0]=TP_COOR[2].TP_X; arr[1][1]=1; arr[1][2]=Calibration_x3;

  204.     if(Solve_Equations_2(arr , &Touch_Structure.Xk , &Touch_Structure.Xoffset))
  205.     {
  206.         /* 顯示方程無解 數據錯誤 */

  207.         return 1;
  208.     }

  209.     arr[0][0]=TP_COOR[1].TP_Y; arr[0][1]=1; arr[0][2]=Calibration_y2;

  210.     arr[1][0]=TP_COOR[3].TP_Y; arr[1][1]=1; arr[1][2]=Calibration_y4;

  211.     if(Solve_Equations_2(arr , &Touch_Structure.Yk , &Touch_Structure.Yoffset))
  212.     {
  213.         /* 顯示方程無解 數據錯誤 */

  214.         return 1;
  215.     }

  216.         return 0;
  217. }

  218. /* 得到液晶屏的坐標 返回值0 坐標靠譜 否則不靠譜 */
  219. uint8_t Touch_GetCoordinate(Touch_CoorDinate *TP_COOR)
  220. {
  221.     if(TP_GetCoorDinate(TP_COOR))
  222.         return 1;

  223.     /* 數據一般不會得到極值 */
  224.     /*
  225.     if(TP_COOR->TP_X==0||TP_COOR->TP_X==4095 ||TP_COOR->TP_Y==0 ||TP_COOR->TP_Y==4095)
  226.         return 1;
  227.     */

  228.     TP_COOR->TP_X=TP_COOR->TP_X*Touch_Structure.Xk+Touch_Structure.Xoffset;

  229.     TP_COOR->TP_Y=TP_COOR->TP_Y*Touch_Structure.Yk+Touch_Structure.Yoffset;

  230.     return 0;
  231. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:83422 發表于 2015-9-15 13:13 | 只看該作者
挺不錯的呀。。。
回復

使用道具 舉報

板凳
ID:64765 發表于 2017-5-16 20:13 | 只看該作者
好資料,下載學習,謝謝分享。
回復

使用道具 舉報

地板
ID:64765 發表于 2017-5-16 20:29 | 只看該作者
學習了,謝謝分享。
回復

使用道具 舉報

5#
ID:201854 發表于 2017-5-17 16:46 | 只看該作者
謝謝分享。!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频1区2区 | 国产欧美一区二区三区在线看 | 本地毛片 | 亚洲免费在线 | av免费在线观看网站 | 国产91在线视频 | 天天干免费视频 | 成人福利视频网站 | 亚洲精品久久久久久久久久久 | 一区二区日韩 | 精品日韩一区二区三区 | 午夜一区 | 久久99国产精品 | 国产视频线观看永久免费 | 在线成人免费视频 | 国内毛片毛片毛片毛片 | 成人日韩 | 2018天天干天天操 | 亚洲在线日韩 | 欧美不卡一区二区三区 | 91久操网 | 啪啪av| 黄色一级电影在线观看 | 午夜免费在线观看 | h在线| 人人射人人 | 国产精品高潮呻吟久久av黑人 | 国产精品久久久久久久久久免费看 | 欧美一区二区三区在线观看 | 国产精品久久久久久吹潮日韩动画 | 91精品国产综合久久久动漫日韩 | 亚洲二区视频 | 精品亚洲一区二区三区 | 一区二区三区视频 | 看亚洲a级一级毛片 | 青青艹在线视频 | 日本黄色一级视频 | 欧美精品一区二区免费 | 国产精品久久久久久久久久 | 国产一区2区 | 免费毛片网站在线观看 |