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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

xpt2046.h和.c頭文件 電阻觸摸屏驅動下載

  [復制鏈接]
跳轉到指定樓層
樓主

附件兩個代碼為xpt2046.c和xpt2046.h,是常用的電阻觸摸屏驅動
所有資料51hei提供下載:
xpt2046.zip (4.65 KB, 下載次數: 197)


單片機源程序如下:
  1. #include "xpt2046.h"
  2. #include "ili93xx.h"
  3. #include "stdlib.h"
  4. #include "math.h"

  5. Pen_Holder Pen_Point;//定義筆實體

  6. void delay_us(u32 us)
  7. {
  8.     u32 time=100*us/7;   
  9.     while(--time);   
  10. }


  11. //SPI寫數據
  12. //向7846/7843/XPT2046/UH7843/UH7846寫入1byte數據   
  13. void ADS_Write_Byte(u8 num)   
  14. {  
  15.         u8 count=0;   
  16.         for(count=0;count<8;count++)  
  17.         {           
  18.                 if(num&0x80)
  19.                         Set_TOUCH_TDIN
  20.                 else
  21.                         Clr_TOUCH_TDIN;   
  22.                 num<<=1;   
  23.                 Clr_TOUCH_TCLK;//上升沿有效                    
  24.                 Set_TOUCH_TCLK;      
  25.         }                             
  26. }                  

  27. //SPI讀數據
  28. //從7846/7843/XPT2046/UH7843/UH7846讀取adc值          
  29. u16 ADS_Read_AD(u8 CMD)          
  30. {          
  31.         u8 count=0;           
  32.         u16 Num=0;
  33.        
  34.         Clr_TOUCH_TCLK;//先拉低時鐘          
  35.         Clr_TOUCH_TCS; //選中ADS7843         
  36.         ADS_Write_Byte(CMD);//發送命令字
  37.         delay_us(6);//ADS7846的轉換時間最長為6us
  38.         Set_TOUCH_TCLK;//給1個時鐘,清除BUSY               
  39.         Clr_TOUCH_TCLK;          
  40.        
  41.         for(count=0;count<16;count++)  
  42.         {                                   
  43.                 Num<<=1;          
  44.                 Clr_TOUCH_TCLK;//下降沿有效                        
  45.                 Set_TOUCH_TCLK;
  46.                 if(TOUCH_DOUT)
  47.                 Num++;                  
  48.         }         
  49.        
  50.         Num>>=4;   //只有高12位有效.
  51.         Set_TOUCH_TCS;//釋放ADS7843         
  52.         return(Num);   
  53. }


  54. //讀取一個坐標值
  55. //連續讀取READ_TIMES次數據,對這些數據升序排列,
  56. //然后去掉最低和最高LOST_VAL個數,取平均值
  57. #define READ_TIMES 15 //讀取次數
  58. #define LOST_VAL 5          //丟棄值
  59. u16 ADS_Read_XY(u8 xy)
  60. {
  61.         u16 i, j;
  62.         u16 buf[READ_TIMES];
  63.         u16 sum=0;
  64.         u16 temp;
  65.        
  66.         for(i=0;i<READ_TIMES;i++)
  67.         {                                 
  68.                 buf[i]=ADS_Read_AD(xy);            
  69.         }                                    
  70.         for(i=0;i<READ_TIMES-1; i++)//排序
  71.         {
  72.                 for(j=i+1;j<READ_TIMES;j++)
  73.                 {
  74.                         if(buf[i]>buf[j])//升序排列
  75.                         {
  76.                                 temp=buf[i];
  77.                                 buf[i]=buf[j];
  78.                                 buf[j]=temp;
  79.                         }
  80.                 }
  81.         }          
  82.         sum=0;
  83.         for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
  84.         temp=sum/(READ_TIMES-2*LOST_VAL);
  85.         return temp;   
  86. }


  87. //帶濾波的坐標讀取
  88. //最小值不能少于100.
  89. u8 Read_ADS(u16 *x,u16 *y)
  90. {
  91.         u16 xtemp,ytemp;                                                    
  92.         xtemp=ADS_Read_XY(CMD_RDX);
  93.         ytemp=ADS_Read_XY(CMD_RDY);                                                                                                            
  94.         if(xtemp<100||ytemp<100)return 0;//讀數失敗
  95.         *x=xtemp;
  96.         *y=ytemp;
  97.         return 1;//讀數成功
  98. }       


  99. //2次讀取ADS7846,連續讀取2次有效的AD值,且這兩次的偏差不能超過
  100. //50,滿足條件,則認為讀數正確,否則讀數錯誤.          
  101. //該函數能大大提高準確度
  102. #define ERR_RANGE 50 //誤差范圍
  103. u8 Read_ADS2(u16 *x,u16 *y)
  104. {
  105.         u16 x1,y1;
  106.         u16 x2,y2;
  107.         u8 flag;   
  108.     flag=Read_ADS(&x1,&y1);   
  109.     if(flag==0)return(0);
  110.     flag=Read_ADS(&x2,&y2);          
  111.     if(flag==0)return(0);   
  112.     if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))//前后兩次采樣在+-50內
  113.     &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))
  114.     {
  115.         *x=(x1+x2)/2;
  116.         *y=(y1+y2)/2;
  117.         return 1;
  118.     }else{
  119.                 return 0;          
  120.         }       
  121. }


  122. //讀取一次坐標值       
  123. //僅僅讀取一次,知道PEN松開才返回!                                          
  124. u8 Read_TP_Once(void)
  125. {
  126.         u8 t=0;            
  127.         Pen_Int_Set(0);//關閉中斷
  128.         Pen_Point.Key_Sta=Key_Up;
  129.         Read_ADS2(&Pen_Point.X,&Pen_Point.Y);
  130.         while(TOUCH_PEN==0&&t<=250)
  131.         {
  132.                 t++;
  133.                 delay_us(10000);
  134.         };
  135.         Pen_Int_Set(1);//開啟中斷                 
  136.         if(t>=250)
  137.                 return 0;//按下2.5s 認為無效
  138.         else
  139.                 return 1;       
  140. }


  141. /**************************************與LCD部分有關的函數****************************************/

  142. //畫一個觸摸點
  143. //用來校準用的
  144. void Drow_Touch_Point(u8 x,u16 y)
  145. {
  146.         LCD_DrawLine(x-12,y,x+13,y);//橫線
  147.         LCD_DrawLine(x,y-12,x,y+13);//豎線
  148.         LCD_DrawPoint(x+1,y+1);
  149.         LCD_DrawPoint(x-1,y+1);
  150.         LCD_DrawPoint(x+1,y-1);
  151.         LCD_DrawPoint(x-1,y-1);
  152.         Draw_Circle(x,y,6);//畫中心圈
  153. }          
  154. //畫一個大點
  155. //2*2的點                          
  156. void Draw_Big_Point(u8 x,u16 y)
  157. {            
  158.         LCD_DrawPoint(x,y);//中心點
  159.         LCD_DrawPoint(x+1,y);
  160.         LCD_DrawPoint(x,y+1);
  161.         LCD_DrawPoint(x+1,y+1);                          
  162. }

  163. /***************************************************************************************************/


  164. //轉換結果
  165. //根據觸摸屏的校準參數來決定轉換后的結果,保存在X0,Y0中
  166. void Convert_Pos(void)
  167. {                           
  168.         if(Read_ADS2(&Pen_Point.X,&Pen_Point.Y))
  169.         {
  170.                 Pen_Point.X0=Pen_Point.xfac*Pen_Point.X+Pen_Point.xoff;
  171.                 Pen_Point.Y0=Pen_Point.yfac*Pen_Point.Y+Pen_Point.yoff;  
  172.         }
  173. }          



  174. //PEN中斷設置
  175. //啟用一個外部中斷當觸摸屏被按下后出發外部中斷
  176. //外部中斷函數:
  177. //        檢測PEN腳的一個下降沿
  178. //        void EXTI1_IRQHandler(void)
  179. //        {                                             
  180. //                Pen_Point.Key_Sta=Key_Down;//按鍵按下
  181. //            EXTI_ClearFlag(EXTI_Line1);//清除LINE1上的中斷標志位                                            
  182. //        }          
  183. void Pen_Int_Set(u8 en)
  184. {
  185.         EXTI_InitTypeDef EXTI_InitStructure;

  186.         if(en)
  187.         {                         
  188.                 EXTI_InitStructure.EXTI_Line = EXTI_Line1;        //外部線路EXIT1
  189.                 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //設外外部中斷模式:EXTI線路為中斷請求
  190.                 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //外部中斷觸發沿選擇:設置輸入線路下降沿為中斷請求
  191.                 EXTI_InitStructure.EXTI_LineCmd = ENABLE;                //使能外部中斷新狀態
  192.                 EXTI_Init(&EXTI_InitStructure);                //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器       

  193.         }else{        

  194.                 EXTI_InitStructure.EXTI_Line = EXTI_Line1;        //外部線路EXIT1
  195.                 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //設外外部中斷模式:EXTI線路為中斷請求
  196.                 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //外部中斷觸發沿選擇:設置輸入線路下降沿為中斷請求
  197.                 EXTI_InitStructure.EXTI_LineCmd = DISABLE;                //關閉外部中斷新狀態
  198.                 EXTI_Init(&EXTI_InitStructure);                //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器          

  199.         }
  200.                
  201. }          


  202. //觸摸屏校準代碼
  203. //得到四個校準參數
  204. void Touch_Adjust(void)
  205. {                                                                 
  206.         u16 pos_temp[4][2];//坐標緩存值
  207.         u8  cnt=0;       
  208.         u16 d1,d2;
  209.         u32 tem1,tem2;
  210.         float fac;           
  211.         cnt=0;                               
  212.         POINT_COLOR=BLUE;
  213.         BACK_COLOR =WHITE;
  214.         LCD_Clear(WHITE);//清屏   
  215.         POINT_COLOR=RED;//紅色
  216.         LCD_Clear(WHITE);//清屏
  217.         Drow_Touch_Point(20,20);//畫點1
  218.         Pen_Point.Key_Sta=Key_Up;//消除觸發信號
  219.         Pen_Point.xfac=0;//xfac用來標記是否校準過,所以校準之前必須清掉!以免錯誤         
  220.         while(1)
  221.         {
  222.                 if(Pen_Point.Key_Sta==Key_Down)//按鍵按下了
  223.                 {
  224.                         if(Read_TP_Once())//得到單次按鍵值
  225.                         {                                                                    
  226.                                 pos_temp[cnt][0]=Pen_Point.X;
  227.                                 pos_temp[cnt][1]=Pen_Point.Y;
  228.                                 cnt++;
  229.                         }                         
  230.                         switch(cnt)
  231.                         {                          
  232.                                 case 1:
  233.                                         LCD_Clear(WHITE);//清屏
  234.                                         Drow_Touch_Point(220,20);//畫點2
  235.                                         break;
  236.                                 case 2:
  237.                                         LCD_Clear(WHITE);//清屏
  238.                                         Drow_Touch_Point(20,300);//畫點3
  239.                                         break;
  240.                                 case 3:
  241.                                         LCD_Clear(WHITE);//清屏
  242.                                         Drow_Touch_Point(220,300);//畫點4
  243.                                         break;
  244.                                 case 4:         //全部四個點已經得到
  245.                                 //對邊相等
  246.                                         tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
  247.                                         tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
  248.                                         tem1*=tem1;
  249.                                         tem2*=tem2;
  250.                                         d1=sqrt(tem1+tem2);//得到1,2的距離
  251.                                        
  252.                                         tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
  253.                                         tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
  254.                                         tem1*=tem1;
  255.                                         tem2*=tem2;
  256.                                         d2=sqrt(tem1+tem2);//得到3,4的距離
  257.                                         fac=(float)d1/d2;
  258.                                         if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格
  259.                                         {
  260.                                                 cnt=0;
  261.                                                 LCD_Clear(WHITE);//清屏
  262.                                                 Drow_Touch_Point(20,20);
  263.                                                 continue;
  264.                                         }
  265.                                         tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
  266.                                         tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
  267.                                         tem1*=tem1;
  268.                                         tem2*=tem2;
  269.                                         d1=sqrt(tem1+tem2);//得到1,3的距離
  270.                                        
  271.                                         tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
  272.                                         tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
  273.                                         tem1*=tem1;
  274.                                         tem2*=tem2;
  275.                                         d2=sqrt(tem1+tem2);//得到2,4的距離
  276.                                         fac=(float)d1/d2;
  277.                                         if(fac<0.95||fac>1.05)//不合格
  278.                                         {
  279.                                                 cnt=0;
  280.                                                 LCD_Clear(WHITE);//清屏
  281.                                                 Drow_Touch_Point(20,20);
  282.                                                 continue;
  283.                                         }//正確了
  284.                                                                   
  285.                                         //對角線相等
  286.                                         tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
  287.                                         tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
  288.                                         tem1*=tem1;
  289.                                         tem2*=tem2;
  290.                                         d1=sqrt(tem1+tem2);//得到1,4的距離
  291.        
  292.                                         tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
  293.                                         tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
  294.                                         tem1*=tem1;
  295.                                         tem2*=tem2;
  296.                                         d2=sqrt(tem1+tem2);//得到2,3的距離
  297.                                         fac=(float)d1/d2;
  298.                                         if(fac<0.95||fac>1.05)//不合格
  299. ……………………

  300. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



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

使用道具 舉報

沙發
ID:20672 發表于 2018-8-14 10:51 | 只看該作者
謝謝分享~~~
回復

使用道具 舉報

板凳
ID:428798 發表于 2018-11-18 18:20 | 只看該作者
謝謝分享~~~~
回復

使用道具 舉報

地板
ID:65961 發表于 2019-3-6 09:49 | 只看該作者

謝謝分享~~~~
回復

使用道具 舉報

5#
ID:65961 發表于 2019-3-7 09:57 | 只看該作者
謝謝分享~~~~但要5黑幣呀
回復

使用道具 舉報

6#
ID:323481 發表于 2019-4-26 22:12 | 只看該作者
謝謝分享~~~~
回復

使用道具 舉報

7#
ID:282542 發表于 2019-10-10 20:46 | 只看該作者
謝謝
回復

使用道具 舉報

8#
ID:641168 發表于 2019-11-13 14:43 | 只看該作者
謝謝分享~
回復

使用道具 舉報

9#
ID:282431 發表于 2019-11-13 15:38 | 只看該作者
觸摸屏驅動好資料,謝謝分享
回復

使用道具 舉報

10#
ID:653605 發表于 2019-12-1 16:33 | 只看該作者
謝謝分享~~~
回復

使用道具 舉報

11#
ID:834304 發表于 2020-10-25 14:23 | 只看該作者
謝謝樓主分享~先留言,黑幣夠了來下載一下
回復

使用道具 舉報

12#
ID:705471 發表于 2020-12-5 10:22 | 只看該作者
芯片比較早了,但基礎知識多了解才能扎實,謝謝。
回復

使用道具 舉報

13#
ID:854455 發表于 2020-12-15 15:36 | 只看該作者
雖然芯片比較老了,但好多行業還是會用到我想多了解一下基礎知道。謝謝樓主了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线视频观看 | 亚洲综合色站 | 一级黄色毛片 | 99久久国产免费 | 久草视频在线播放 | 欧美午夜精品久久久久久浪潮 | 337p日本欧洲亚洲大胆 | 婷婷桃色网 | 国产精品久久久久一区二区三区 | 青娱乐国产| 国产成人精品午夜视频免费 | 精品国产免费人成在线观看 | 国产午夜精品视频 | 国产视频91在线 | 亚洲精品欧洲 | 日日干日日 | 国产精品久久久久久婷婷天堂 | 色就干 | 国产精品久久久久久吹潮 | 99国产精品99久久久久久 | 午夜免费观看 | 精品视频一区二区三区 | 欧洲视频一区二区 | 91不卡| 日韩成人在线播放 | 狠狠爱综合| 午夜一区| 欧美成人第一页 | 免费毛片网站在线观看 | 久久久久久亚洲精品 | 91国在线视频| 特黄色毛片| 91看片视频 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 精品国产1区2区3区 在线国产视频 | 岛国在线免费观看 | 国产精品一二三区 | 国产视频久久 | 999免费网站 | 久久男人 | 欧美xxxx黑人又粗又长 |