打印
[资料分享]

ADS7843驱动程序--ARM单片机

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


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2810

主题

19297

帖子

104

粉丝