[资料分享] ADS7843驱动程序--ARM单片机

[复制链接]
 楼主| xyz549040622 发表于 2019-12-21 15:50 | 显示全部楼层 |阅读模式
  1. 1.*  文件名:ads7843.c  
  2. 2.*  硬件连接:  
  3. 3.*  DCK========>SCK0------P0.4   
  4. 4.*  DOUT(从机)===>MISO0-----P0.5  
  5. 5.*  DIN(从机)========>MOSI0-----P0.6  
  6. 6.*  /CS========>SPI0_CS------P1.25  
  7. 7.***********************************************************************/   
  8. 8.   
  9. 9.   
  10. 10.#include "config.h"   
  11. 11.#include "stdio.h"   
  12.    
  13.    
  14. 12.extern  void  LCD_PutString(uint16 CSRPOS, char *str);   
  15. 13.   
  16. 14.#define   SPI0_CS          (1<<25)  //P1.25口为ADS7843片选信号   
  17. 15.   
  18. 16.#define   DCLK             (1<<4)   //P0.4口为clk口//输出口   
  19. 17.   
  20. 18.   
  21. 19.#define   DOUT             (1<<5)   //P0.5口为DOUT口//输入口   
  22. 20.   
  23. 21.#define   DIN              (1<<6)   //P0.6口为DIN口 //输出口   
  24. 22.   
  25. 23./***********************************************************************  
  26. 24.* 名称:Delay()  
  27. 25.* 功能:延时  
  28. 26.* 入口参数:无  
  29. 27.* 出口参数:无  
  30. 28.***********************************************************************/   
  31. 29.void Delay()   
  32. 30.   
  33. 31.{      
  34. 32.    __asm   
  35. 33.            {   
  36. 34.             nop   
  37. 35.             nop   
  38. 36.             nop   
  39. 37.             nop   
  40. 38.             nop   
  41. 39.             nop   
  42. 40.            }   
  43. 41.               
  44. 42.}         
  45. 43.   
  46. 44.   
  47. 45./***********************************************************************  
  48. 46.* 名称:SPIstart()  
  49. 47.* 功能:SPI开始  
  50. 48.* 入口参数:无  
  51. 49.* 出口参数:无  
  52. 50.***********************************************************************/   
  53. 51.   
  54. 52.void SPIstart() //SPI开始   
  55. 53.{   
  56. 54.   
  57. 55.IO0CLR=DCLK;   
  58. 56.   
  59. 57.IO1SET=SPI0_CS;   
  60. 58.   
  61. 59.IO0SET=DIN;   
  62. 60.   
  63. 61.IO0SET=DCLK;   
  64. 62.   
  65. 63.IO1CLR=SPI0_CS;   
  66. 64.   
  67. 65.}   
  68. 66.   
  69. 67.   
  70. 68./***********************************************************************  
  71. 69.* 名称:WriteTo7843()  
  72. 70.* 功能:写入ads7843控制字  
  73. 71.* 入口参数:dat  
  74. 72.* 出口参数:无  
  75. 73.***********************************************************************/   
  76. 74.   
  77. 75.   
  78. 76.   
  79. 77.void WriteTo7843(uint8 dat)   
  80. 78.{   
  81. 79.       uint8 count;   
  82. 80.    for(count=0;count<8;count++)   
  83. 81.    {   
  84. 82.       IO0CLR=DCLK;                //CLK低   
  85. 83.     if(dat&0x80)   
  86. 84.     {   
  87. 85.        IO0SET=DIN;}     
  88. 86.      else      
  89. 87.        {   
  90. 88.        IO0CLR=DIN;}   
  91. 89.       Delay();      
  92. 90.     IO0SET=DCLK;   //CLK高     //上升沿有效 ___|---   
  93. 91.      Delay();   
  94. 92.      dat<<=1;   
  95. 93.    }   
  96. 94.      
  97. 95.}   
  98. 96.  /***********************************************************************  
  99. 97.* 名称:ReadFrom7843()  
  100. 98.* 功能:读出12bit的AD值  
  101. 99.* 入口参数:无  
  102. 100.* 出口参数:data  
  103. 101.***********************************************************************/   
  104. 102.   
  105. 103.uint16 data;   
  106. 104.  uint16 ReadFrom7843()   
  107. 105.{   
  108. 106.    uint8  count;      
  109. 107.    uint16 data=0;   
  110. 108. for(count=0;count<12;count++)   
  111. 109.    {   
  112. 110.   data<<=1;   
  113. 111.  IO0SET=DCLK;    //CLK高    //下降沿有效  ---|____   
  114. 112.   Delay();   
  115. 113.  IO0CLR=DCLK;                //CLK低   
  116. 114.  Delay();   
  117. 115. if(IO0PIN&0x00000020)   
  118. 116.   data=data|0x0001;//P0.5口为DOUT口   
  119. 117.    else   
  120. 118.           
  121. 119.         data=data&0xfffe;   
  122. 120.      }   
  123. 121.  return(data);   
  124. 122.   
  125. 123.}   
  126. 124.   
  127. 125./***********************************************************************  
  128. 126.* 名称:TouchScreen()  
  129. 127.* 功能:触摸屏驱动  
  130. 128.* 入口参数:无  
  131. 129.* 出口参数:无  
  132. 130.* 注释:为了完成一次电极电压切换和A/D转换,需要先通过串口往ADS7843发送控制字  
  133. 131.*       转换完成后再通过串口读出电压转换值。放到外部中断中。  
  134. 132.***********************************************************************/   
  135. 133.uint16 X,Y;   
  136. 134.void TouchScreen()        
  137. 135.   
  138. 136.{   
  139. 137.   
  140. 138.uint16 i,j;   
  141. 139.   
  142. 140.for(i=0;i<1000;i++)   
  143. 141.  {for(j=0;j<50;j++);}      //延时去抖动   
  144. 142.   
  145. 143.IO1CLR=SPI0_CS;               //片选信号低   
  146. 144.  //WriteTo7843(0xa4); //IN3,12bit   
  147. 145.WriteTo7843(0x94);//送控制字 10010100 即用非差分方式读X坐标   
  148. 146.    IO0CLR=DCLK;                //CLK低   
  149. 147.    Delay();   
  150. 148.    Delay();   
  151. 149.    Delay();   
  152. 150.    Delay();   
  153. 151.    Delay();   
  154. 152.    Delay();   
  155. 153.    Delay();   
  156. 154.    Delay();   
  157. 155.    Delay();   
  158. 156.    Delay();   
  159. 157.    IO0SET=DCLK;                //CLK高   
  160. 158.    Delay();   
  161. 159.   
  162. 160.      
  163. 161.X=ReadFrom7843();   
  164. 162.   
  165. 163.   
  166. 164.   
  167. 165.   
  168. 166.WriteTo7843(0xe4); //IN4,12bit   
  169. 167.   
  170. 168.   
  171. 169.   
  172. 170.   
  173. 171.WriteTo7843(0xd4); ////送控制字 11010100 即用非差分方式读Y坐标   
  174. 172.   
  175. 173.   
  176. 174.   
  177. 175.    IO0CLR=DCLK;                //CLK低   
  178. 176.    Delay();   
  179. 177.    Delay();   
  180. 178.    Delay();   
  181. 179.    Delay();   
  182. 180.    Delay();   
  183. 181.    Delay();   
  184. 182.    Delay();   
  185. 183.    Delay();   
  186. 184.    Delay();   
  187. 185.    Delay();;   
  188. 186.      
  189. 187.    IO0SET=DCLK;                //CLK高   
  190. 188.    Delay();   
  191. 189.      
  192. 190.      
  193. 191.Y=ReadFrom7843();   
  194. 192.   
  195. 193.   
  196. 194.   
  197. 195.IO1SET=SPI0_CS;             //片选信号高   
  198. 196.   
  199. 197.   
  200. 198.   
  201. 199.   
  202. 200. X>>=2;   
  203. 201. X&=0x03ff;   
  204. 202.                             //完成AD采集后的数据处理,12bit的数据处理成8bit(高8bit),提高采集的抗干扰性   
  205. 203. Y>>=4;   
  206. 204. Y&=0x00ff;   
  207. 205.   
  208. 206.   
  209. 207.   
  210. 208. Delay();   
  211. 209.   
  212. 210.   
  213. 211.   
  214. 212.}   
  215. 213.   
  216. 214.   
  217. 215./***********************************************************************  
  218. 216.* 名称:EINT0_IRQ()  
  219. 217.* 功能:外部中断0服务子程序,响应触摸屏按键  
  220. 218.* 入口参数:无  
  221. 219.* 出口参数:无  
  222. 220.***********************************************************************/   
  223. 221.volatile uint8 IntFlag=0;   
  224. 222.volatile uint8 IntFlag2=0;   
  225. 223.   
  226. 224.   
  227. 225.void __irq IRQ_Eint0(void)   
  228. 226.   
  229. 227.{   
  230. 228.   
  231. 229.uint16  MidX[3],MidY[3],temp;   
  232. 230.uint8   i;   
  233. 231.for(i=0;i<3;i++)   
  234. 232.   
  235. 233.    {   
  236. 234.        TouchScreen();   
  237. 235.        MidX[i]=X;   
  238. 236.        MidY[i]=Y;     
  239. 237.    }   
  240. 238.   
  241. 239.   
  242. 240./////中值滤波,取平均   
  243. 241.   
  244. 242.if(MidX[0]>MidX[1])   
  245. 243.         {temp=MidX[0];MidX[0]=MidX[1];MidX[1]=temp;}            
  246. 244.if(MidX[0]>MidX[2])              
  247. 245.         {temp=MidX[0];MidX[0]=MidX[2];MidX[2]=temp;}//最小值为MidX[0]   
  248. 246.if(MidX[1]>MidX[2])              
  249. 247.         {temp=MidX[1];MidX[1]=MidX[2];MidX[2]=temp;}//MidX[1]不是最大            
  250. 248.   
  251. 249.   
  252. 250.   
  253. 251.X=MidX[1];   
  254. 252.   
  255. 253.   
  256. 254.if(MidY[0]>MidY[1])   
  257. 255.         {temp=MidY[0];MidY[0]=MidY[1];MidY[1]=temp;}            
  258. 256.if(MidY[0]>MidY[2])              
  259. 257.         {temp=MidY[0];MidY[0]=MidY[2];MidY[2]=temp;}//最小值为MidY[0]   
  260. 258.if(MidY[1]>MidY[2])              
  261. 259.         {temp=MidY[1];MidY[1]=MidY[2];MidY[2]=temp;}//MidY[1]不是最大            
  262. 260.   
  263. 261.   
  264. 262.   
  265. 263.Y=MidY[1];   
  266. 264.   
  267. 265.   
  268. 266.   
  269. 267.   
  270. 268.EXTINT=0x01;       //清除外部中断0标志位   
  271. 269.VICVectAddr=0x00;  //执行VICVectAddr写操作,通知VIC中断处理结束   
  272. 270.   
  273. 271.IntFlag=1;   
  274. 272.IntFlag2=1;   
  275. 273.   
  276. 274.   
  277. 275.      
  278. 276.}   
  279. 277.
  280. 278.* 名称:ExtINT_Initial()  
  281. 279.* 功能:初始化外部中断0  
  282. 280.* 入口参数:无  
  283. 281.* 出口参数:无  
  284. 282.***********************************************************************/   
  285. 283.void ExtINT_Initial(void)   
  286. 284.   
  287. 285.{      
  288. 286.      
  289. 287.//-------------------------------   
  290. 288.//设置EINT0为低电平中断//下降沿中断   
  291. 289.//-------------------------------   
  292. 290.PINSEL1=0x01;                        //设定P0.16连接外部中断0   
  293. 291.///EXTMODE=0x00;                         //EXTMODE0=0,外部中断0电平触发   
  294. 292.///EXTPOLAR=0x00;                        //EXTPOLAR0=0,低电平触发   
  295. 293.   
  296. 294.EXTMODE=0x01;                        //EXTMODE0=1,外部中断0边沿触发   
  297. 295.EXTPOLAR=0x00;                       //EXTPOLAR0=0,下降沿触发   
  298. 296.   
  299. 297.//-------------------------------           
  300. 298.   
  301. 299.IRQEnable();                         // 使能IRQ中断   
  302. 300.      
  303. 301.VICIntSelect=0x00000000;            //设置所有中断分配为IRQ中断   
  304. 302.VICVectCntl0=0x20|0x0e;             //分配外部中断0到向量中断0   
  305. 303.VICVectAddr0=(uint32)IRQ_Eint0;     //设置中断服务程序的地址   
  306. 304.EXTINT=0x01;                        //清除EINT0中断标志   
  307. 305.VICIntEnable=1<<0x0e;             //使能EINT0中断   
  308. 306.   
  309. 307.}   


您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部