背景图片
STM32 XPT2048触摸数据存外部flash芯片程序 - 啊和的博客

STM32 XPT2048触摸数据存外部flash芯片程序 - 啊和的博客 STM32 XPT2048触摸数据存外部flash芯片程序 - 啊和的博客

STM32 XPT2048触摸数据存外部flash芯片程序

  1. #include "touch.h" 
  2. #include "ili93xx.h"
  3. #include "delay.h"
  4. #include "stdlib.h"
  5. #include "math.h"
  6. #include "flash.h"     
  7. #include "stm32f10x.h"                  // Device header
  8.   
  9. //********************************************************************************
  10. //V2.0修改说明
  11. //增加对电容触摸屏的支持(需要添加:ctiic.c和ott2001a.c两个文件)
  12. //////////////////////////////////////////////////////////////////////////////////
  13.  
  14. _m_tp_dev tp_dev=
  15. {
  16. TP_Init,
  17. TP_Scan,
  18. TP_Adjust,
  19. 0,
  20. 0, 
  21. 0,
  22. 0,
  23. 0,
  24. 0,     
  25. 0,
  26. 0,     
  27. };
  28. //默认为touchtype=0的数据.
  29. u8 CMD_RDX=0XD0;
  30. u8 CMD_RDY=0X90;
  31.             
  32. //SPI写数据
  33. //向触摸屏IC写入1byte数据    
  34. //num:要写入的数据
  35. void TP_Write_Byte(u8 num)    
  36. {  
  37. u8 count=0;   
  38. for(count=0;count<8;count++)  
  39. {    
  40. if(num&0x80)TDIN=1;  
  41. else TDIN=0;   
  42. num<<=1;    
  43. TCLK=0;   
  44. TCLK=1; //上升沿有效         
  45. }       
  46. }   
  47. //SPI读数据 
  48. //从触摸屏IC读取adc值
  49. //CMD:指令
  50. //返回值:读到的数据    
  51. u16 TP_Read_AD(u8 CMD)   
  52. {   
  53. u8 count=0;    
  54. u16 Num=0; 
  55. TCLK=0; //先拉低时钟   
  56. TDIN=0;  //拉低数据线
  57. TCS=0;  //选中触摸屏IC
  58. TP_Write_Byte(CMD);//发送命令字
  59. delay_us(6);//ADS7846的转换时间最长为6us
  60. TCLK=0;            
  61. delay_us(1);        
  62. TCLK=1; //给1个时钟,清除BUSY          
  63. TCLK=0;            
  64. for(count=0;count<16;count++)//读出16位数据,只有高12位有效 
  65. {    
  66. Num<<=1;   
  67. TCLK=0; //下降沿有效           
  68. TCLK=1;
  69. if(DOUT)Num++;   
  70. }  
  71. Num>>=4;    //只有高12位有效.
  72. TCS=1; //释放片选  
  73. return(Num);   
  74. }
  75. //读取一个坐标值(x或者y)
  76. //连续读取READ_TIMES次数据,对这些数据升序排列,
  77. //然后去掉最低和最高LOST_VAL个数,取平均值 
  78. //xy:指令(CMD_RDX/CMD_RDY)
  79. //返回值:读到的数据
  80. #define READ_TIMES 5  //读取次数
  81. #define LOST_VAL 1    //丢弃值
  82. u16 TP_Read_XOY(u8 xy)
  83. {
  84. u16 i, j;
  85. u16 buf[READ_TIMES];
  86. u16 sum=0;
  87. u16 temp;
  88. for(i=0;i<READ_TIMES;i++)buf[i]=TP_Read_AD(xy);       
  89. for(i=0;i<READ_TIMES-1; i++)//排序
  90. {
  91. for(j=i+1;j<READ_TIMES;j++)
  92. {
  93. if(buf[i]>buf[j])//升序排列
  94. {
  95. temp=buf[i];
  96. buf[i]=buf[j];
  97. buf[j]=temp;
  98. }
  99. }
  100. }   
  101. sum=0;
  102. for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
  103. temp=sum/(READ_TIMES-2*LOST_VAL);
  104. return temp;   
  105. } 
  106. //读取x,y坐标
  107. //最小值不能少于100.
  108. //x,y:读取到的坐标值
  109. //返回值:0,失败;1,成功。
  110. u8 TP_Read_XY(u16 *x,u16 *y)
  111. {
  112. u16 xtemp,ytemp;       
  113. xtemp=TP_Read_XOY(CMD_RDX);
  114. ytemp=TP_Read_XOY(CMD_RDY);       
  115. //if(xtemp<100||ytemp<100)return 0;//读数失败
  116. *x=xtemp;
  117. *y=ytemp;
  118. return 1;//读数成功
  119. }
  120. //连续2次读取触摸屏IC,且这两次的偏差不能超过
  121. //ERR_RANGE,满足条件,则认为读数正确,否则读数错误.    
  122. //该函数能大大提高准确度
  123. //x,y:读取到的坐标值
  124. //返回值:0,失败;1,成功。
  125. #define ERR_RANGE 50 //误差范围 
  126. u8 TP_Read_XY2(u16 *x,u16 *y) 
  127. {
  128. u16 x1,y1;
  129.   u16 x2,y2;
  130.   u8 flag;    
  131.     flag=TP_Read_XY(&x1,&y1);   
  132.     if(flag==0)return(0);
  133.     flag=TP_Read_XY(&x2,&y2);    
  134.     if(flag==0)return(0);   
  135.     if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))//前后两次采样在+-50内
  136.     &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))
  137.     {
  138.         *x=(x1+x2)/2;
  139.         *y=(y1+y2)/2;
  140.         return 1;
  141.     }else return 0;   
  142. }  
  143. //////////////////////////////////////////////////////////////////////////////////   
  144. //与LCD部分有关的函数  
  145. //画一个触摸点
  146. //用来校准用的
  147. //x,y:坐标
  148. //color:颜色
  149. void TP_Drow_Touch_Point(u16 x,u16 y,u16 color)
  150. {
  151. POINT_COLOR=color;
  152. LCD_DrawLine(x-12,y,x+13,y);//横线
  153. LCD_DrawLine(x,y-12,x,y+13);//竖线
  154. LCD_DrawPoint(x+1,y+1);
  155. LCD_DrawPoint(x-1,y+1);
  156. LCD_DrawPoint(x+1,y-1);
  157. LCD_DrawPoint(x-1,y-1);
  158. Draw_Circle(x,y,6);//画中心圈
  159. }   
  160. //画一个大点(2*2的点)    
  161. //x,y:坐标
  162. //color:颜色
  163. void TP_Draw_Big_Point(u16 x,u16 y,u16 color)
  164. {     
  165. POINT_COLOR=color;
  166. LCD_DrawPoint(x,y);//中心点 
  167. LCD_DrawPoint(x+1,y);
  168. LCD_DrawPoint(x,y+1);
  169. LCD_DrawPoint(x+1,y+1);     
  170. }   
  171. //////////////////////////////////////////////////////////////////////////////////   
  172. //触摸按键扫描
  173. //tp:0,屏幕坐标;1,物理坐标(校准等特殊场合用)
  174. //返回值:当前触屏状态.
  175. //0,触屏无触摸;1,触屏有触摸
  176. u8 TP_Scan(u8 tp)
  177. {    
  178. if(PEN==0)//有按键按下
  179. {
  180. if(tp)TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]);//读取物理坐标
  181. else if(TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]))//读取屏幕坐标
  182. {
  183.   tp_dev.x[0]=tp_dev.xfac*tp_dev.x[0]+tp_dev.xoff;//将结果转换为屏幕坐标
  184. tp_dev.y[0]=tp_dev.yfac*tp_dev.y[0]+tp_dev.yoff;  
  185.   } 
  186. if((tp_dev.sta&TP_PRES_DOWN)==0)//之前没有被按下
  187. {  
  188. tp_dev.sta=TP_PRES_DOWN|TP_CATH_PRES;//按键按下  
  189. tp_dev.x[4]=tp_dev.x[0];//记录第一次按下时的坐标
  190. tp_dev.y[4]=tp_dev.y[0];        
  191. }    
  192. }else
  193. {
  194. if(tp_dev.sta&TP_PRES_DOWN)//之前是被按下的
  195. {
  196. tp_dev.sta&=~(1<<7);//标记按键松开
  197. }else//之前就没有被按下
  198. {
  199. tp_dev.x[4]=0;
  200. tp_dev.y[4]=0;
  201. tp_dev.x[0]=0xffff;
  202. tp_dev.y[0]=0xffff;
  203. }     
  204. }
  205. return tp_dev.sta&TP_PRES_DOWN;//返回当前的触屏状态
  206. }   
  207. //////////////////////////////////////////////////////////////////////////  
  208. //保存在EEPROM里面的地址区间基址,占用13个字节(RANGE:SAVE_ADDR_BASE~SAVE_ADDR_BASE+12)
  209. #define SAVE_ADDR_BASE 0x7FFFD0  //FLASH芯片最后几个字节
  210. //保存校准参数
  211.  
  212. void TP_Save_Adjdata(void)
  213. {
  214. s32 temp;  
  215. //保存校正结果!
  216.  
  217. temp=tp_dev.xfac*100000000;//保存x校正因素      
  218.      SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE,4);
  219. temp=tp_dev.yfac*100000000;//保存y校正因素    
  220. SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE+4,4);
  221. //保存x偏移量
  222. temp=tp_dev.xoff;
  223. SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE+8,2);
  224. //保存y偏移量
  225. temp=tp_dev.yoff;
  226. SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE+10,2);
  227. //保存触屏类型
  228. temp=tp_dev.touchtype;
  229. SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE+12,2);
  230. temp=0X0A;//标记校准过了
  231.     SPI_Flash_Write((u8*)&temp,SAVE_ADDR_BASE+14,1);
  232. }
  233. //得到保存在EEPROM里面的校准值
  234. //返回值:1,成功获取数据
  235. //        0,获取失败,要重新校准
  236.  
  237. u8 TP_Get_Adjdata(void)
  238. {   
  239. s32 tempfac;
  240. tempfac=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE+14,1);//读取标记字,看是否校准过! 
  241. if(tempfac==0X0A)//触摸屏已经校准过了    
  242. {      
  243. tempfac=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE,4);    
  244. tp_dev.xfac=(float)tempfac/100000000;//得到x校准参数
  245. tempfac=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE+4,4);           
  246. tp_dev.yfac=(float)tempfac/100000000;//得到y校准参数
  247.     //得到x偏移量
  248. tp_dev.xoff=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE+8,2);       
  249.       //得到y偏移量
  250. tp_dev.yoff=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE+10,2);     
  251.   tp_dev.touchtype=SPI_Flash_Read_For_Tp(SAVE_ADDR_BASE+12,1);//读取触屏类型标记
  252. if(tp_dev.touchtype)//X,Y方向与屏幕相反
  253. {
  254. CMD_RDX=0X90;
  255. CMD_RDY=0XD0;  
  256. }else    //X,Y方向与屏幕相同
  257. {
  258. CMD_RDX=0XD0;
  259. CMD_RDY=0X90;  
  260. }  
  261. return 1;  
  262. }
  263. return 0;
  264. }  
  265. //提示字符串
  266. const u8* TP_REMIND_MSG_TBL=(u8*)"Please use the stylus click the cross on the screen.The cross will always move until the screen adjustment is completed.";
  267.     
  268. //提示校准结果(各个参数)
  269. void TP_Adj_Info_Show(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 x3,u16 y3,u16 fac)
  270. {   
  271. POINT_COLOR=RED;
  272. LCD_ShowString(40,160,lcddev.width,lcddev.height,16,(u8*)"x1:");
  273.   LCD_ShowString(40+80,160,lcddev.width,lcddev.height,16,(u8*)"y1:");
  274.   LCD_ShowString(40,180,lcddev.width,lcddev.height,16,(u8*)"x2:");
  275.   LCD_ShowString(40+80,180,lcddev.width,lcddev.height,16,(u8*)"y2:");
  276. LCD_ShowString(40,200,lcddev.width,lcddev.height,16,(u8*)"x3:");
  277.   LCD_ShowString(40+80,200,lcddev.width,lcddev.height,16,(u8*)"y3:");
  278. LCD_ShowString(40,220,lcddev.width,lcddev.height,16,(u8*)"x4:");
  279.   LCD_ShowString(40+80,220,lcddev.width,lcddev.height,16,(u8*)"y4:");  
  280.   LCD_ShowString(40,240,lcddev.width,lcddev.height,16,(u8*)"fac is:");     
  281. LCD_ShowNum(40+24,160,x0,4,16); //显示数值
  282. LCD_ShowNum(40+24+80,160,y0,4,16); //显示数值
  283. LCD_ShowNum(40+24,180,x1,4,16); //显示数值
  284. LCD_ShowNum(40+24+80,180,y1,4,16); //显示数值
  285. LCD_ShowNum(40+24,200,x2,4,16); //显示数值
  286. LCD_ShowNum(40+24+80,200,y2,4,16); //显示数值
  287. LCD_ShowNum(40+24,220,x3,4,16); //显示数值
  288. LCD_ShowNum(40+24+80,220,y3,4,16); //显示数值
  289.   LCD_ShowNum(40+56,lcddev.width,fac,3,16);  //显示数值,该数值必须在95~105范围之内.
  290.  
  291. }
  292.  
  293. //触摸屏校准代码
  294. //得到四个校准参数
  295. void TP_Adjust(void)
  296. {  
  297. u16 pos_temp[4][2];//坐标缓存值
  298. u8  cnt=0;
  299. u16 d1,d2;
  300. u32 tem1,tem2;
  301. float fac; 
  302. u16 outtime=0;
  303.   cnt=0;
  304. POINT_COLOR=BLUE;
  305. BACK_COLOR =WHITE;
  306. LCD_Clear(WHITE);//清屏   
  307. POINT_COLOR=RED;//红色 
  308. LCD_Clear(WHITE);//清屏     
  309. POINT_COLOR=BLACK;
  310. LCD_ShowString(40,40,160,100,16,(u8*)TP_REMIND_MSG_TBL);//显示提示信息
  311. TP_Drow_Touch_Point(20,20,RED);//画点1 
  312. tp_dev.sta=0;//消除触发信号 
  313. tp_dev.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误  
  314. while(1)//如果连续10秒钟没有按下,则自动退出
  315. {
  316. tp_dev.scan(1);//扫描物理坐标
  317. if((tp_dev.sta&0xc0)==TP_CATH_PRES)//按键按下了一次(此时按键松开了.)
  318. {
  319. outtime=0;
  320. tp_dev.sta&=~(1<<6);//标记按键已经被处理过了.
  321.        
  322. pos_temp[cnt][0]=tp_dev.x[0];
  323. pos_temp[cnt][1]=tp_dev.y[0];
  324. cnt++;   
  325. switch(cnt)
  326. {    
  327. case 1:  
  328. TP_Drow_Touch_Point(20,20,WHITE); //清除点1 
  329. TP_Drow_Touch_Point(lcddev.width-20,20,RED); //画点2
  330. break;
  331. case 2:
  332.   TP_Drow_Touch_Point(lcddev.width-20,20,WHITE); //清除点2
  333. TP_Drow_Touch_Point(20,lcddev.height-20,RED); //画点3
  334. break;
  335. case 3:
  336.   TP_Drow_Touch_Point(20,lcddev.height-20,WHITE); //清除点3
  337.   TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,RED); //画点4
  338. break;
  339. case 4:  //全部四个点已经得到
  340.          //对边相等
  341. tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
  342. tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
  343. tem1*=tem1;
  344. tem2*=tem2;
  345. d1=sqrt(tem1+tem2);//得到1,2的距离
  346. tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
  347. tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
  348. tem1*=tem1;
  349. tem2*=tem2;
  350. d2=sqrt(tem1+tem2);//得到3,4的距离
  351. fac=(float)d1/d2;
  352. if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格
  353. {
  354. cnt=0;
  355.        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4
  356.       TP_Drow_Touch_Point(20,20,RED); //画点1
  357.   TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据   
  358.   continue;
  359. }
  360. tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
  361. tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
  362. tem1*=tem1;
  363. tem2*=tem2;
  364. d1=sqrt(tem1+tem2);//得到1,3的距离
  365. tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
  366. tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
  367. tem1*=tem1;
  368. tem2*=tem2;
  369. d2=sqrt(tem1+tem2);//得到2,4的距离
  370. fac=(float)d1/d2;
  371. if(fac<0.95||fac>1.05)//不合格
  372. {
  373. cnt=0;
  374.        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4
  375.       TP_Drow_Touch_Point(20,20,RED); //画点1
  376.   TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据   
  377. continue;
  378. }//正确了
  379.    
  380. //对角线相等
  381. tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
  382. tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
  383. tem1*=tem1;
  384. tem2*=tem2;
  385. d1=sqrt(tem1+tem2);//得到1,4的距离
  386. tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
  387. tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
  388. tem1*=tem1;
  389. tem2*=tem2;
  390. d2=sqrt(tem1+tem2);//得到2,3的距离
  391. fac=(float)d1/d2;
  392. if(fac<0.95||fac>1.05)//不合格
  393. {
  394. cnt=0;
  395.        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4
  396.       TP_Drow_Touch_Point(20,20,RED); //画点1
  397.   TP_Adj_Info_Show(pos_temp[0][0],pos_temp[0][1],pos_temp[1][0],pos_temp[1][1],pos_temp[2][0],pos_temp[2][1],pos_temp[3][0],pos_temp[3][1],fac*100);//显示数据   
  398. continue;
  399. }//正确了
  400. //计算结果
  401. tp_dev.xfac=(float)(lcddev.width-40)/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac  
  402. tp_dev.xoff=(lcddev.width-tp_dev.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff
  403.   
  404. tp_dev.yfac=(float)(lcddev.height-40)/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
  405. tp_dev.yoff=(lcddev.height-tp_dev.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  
  406. if((abs(tp_dev.xfac)>2)||(abs(tp_dev.yfac)>2))//触屏和预设的相反了.
  407. {
  408. cnt=0;
  409.        TP_Drow_Touch_Point(lcddev.width-20,lcddev.height-20,WHITE); //清除点4
  410.       TP_Drow_Touch_Point(20,20,RED); //画点1
  411. LCD_ShowString(40,26,lcddev.width,lcddev.height,16,(u8*)"TP Need readjust!");
  412. tp_dev.touchtype=!tp_dev.touchtype;//修改触屏类型.
  413. if(tp_dev.touchtype)//X,Y方向与屏幕相反
  414. {
  415. CMD_RDX=0X90;
  416. CMD_RDY=0XD0;  
  417. }else    //X,Y方向与屏幕相同
  418. {
  419. CMD_RDX=0XD0;
  420. CMD_RDY=0X90;  
  421. }     
  422. continue;
  423. }
  424. POINT_COLOR=BLUE;
  425. LCD_Clear(WHITE);//清屏
  426. LCD_ShowString(35,110,lcddev.width,lcddev.height,16,(u8*)"Touch Screen Adjust OK!");//校正完成
  427. //delay_ms(1000);
  428. TP_Save_Adjdata();  
  429.   LCD_Clear(WHITE);//清屏   
  430. return;//校正完成  
  431. }
  432. }
  433. delay_ms(10);
  434. outtime++;
  435. if(outtime>1000)
  436. {
  437. TP_Get_Adjdata();
  438. break;
  439.   } 
  440.   }
  441. }  
  442. //触摸屏初始化       
  443. //返回值:0,没有进行校准
  444. //       1,进行过校准
  445. u8 TP_Init(void)
  446. {
  447. if(lcddev.id==0X5510) //电容触摸屏
  448. {
  449. OTT2001A_Init();
  450. tp_dev.scan=CTP_Scan; //扫描函数指向电容触摸屏扫描
  451. tp_dev.touchtype|=0X80; //电容屏 
  452. tp_dev.touchtype|=lcddev.dir&0X01;//横屏还是竖屏 
  453. return 0;
  454. }else
  455. {
  456.  GPIO_InitTypeDef  GPIO_InitStructure;
  457.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  458.          GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  459.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);  
  460. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5;  
  461.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //
  462.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  463.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  464.   GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5);//
  465. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;  
  466.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  467.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  468.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  469.   GPIO_SetBits(GPIOA,GPIO_Pin_15);//
  470.  
  471.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_7;
  472.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  473.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  474.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  475. TP_Read_XY(&tp_dev.x[0],&tp_dev.y[0]);//第一次读取初始化  
  476. //AT24CXX_Init();//初始化24CXX
  477. if(TP_Get_Adjdata())return 0;//已经校准
  478. else    //未校准?
  479. {      
  480. LCD_Clear(WHITE);//清屏
  481. TP_Adjust();  //屏幕校准 
  482. TP_Save_Adjdata();  
  483. }
  484. TP_Get_Adjdata();
  485. }
  486. return 1;   
  487. }


评论 0

挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论