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.}
|