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