📄 touch.c
字号:
/***************************************
* 文件名:TOUCH.c
* 描述:
* 最后修改时间:2010.4.7
****************************************/
#include "includes.h"
#define XZERO 160
#define YZERO 263
#define XFULL 3919
#define YFULL 3764
static uint xdata temp_x[10];
static uint xdata temp_y[10];
//====================================================================================
//函数名称:uint average(uint* a,uchar len)
//函数功能:数据处理程序,采集len次的数据,去掉最大值,去掉最小值,然后求平均
//入口参数:数组首地址
//出口参数:平均值
//====================================================================================
uint average(uint * a,uchar len)
{
uint max,min,i,ave=0;
ulong sum=0;
max=a[0];
min=a[0];
for(i=0;i<len;i++)
{
if(max<a[i])
max=a[i];
if(min>a[i])
min=a[i];
sum+=a[i];
}
ave=(sum-min-max)/(len-2);
return ave;
}
bool TOUCH_IsReleased()
{
PENIRQ = 1;
if(PENIRQ)
return true;
else
return false;
}
void Update_TouchPoint()
{
uint temp;
temp = average(temp_x, 10);
g_Status.x = (uint)((float)temp *0.21075 - 31.296);
temp = average(temp_y, 10);
g_Status.y = (uint)((float)temp*0.17346 - 59.41);
}
//====================================================================================
//函数名称:void ADS7843_start(void)
//函数功能:ADS7843启动
//入口参数:无
//出口参数:无
//====================================================================================
void ADS7843_start(void)
{
DCLK=0;
CS=1;
DIN=1;
DCLK=1;
CS=0;
}
//====================================================================================
//函数名称:void ADS7843_wr(uchar dat)
//函数功能:写ADS7843
//入口参数:dat 写入的数据
//出口参数:无
//====================================================================================
void ADS7843_wr(uchar dat)
{
bit temp;
uchar i;
DCLK=0;
for(i=0;i<8;i++)
{
DCLK=0;
temp=(bit)((dat) & 0x80); //DCLK低电平时准备数据
dat=dat<<1;
DIN=temp;
delay_us(2);//_nop_();
DCLK=1;
delay_us(2);//_nop_();
}
DCLK=0;
}
//====================================================================================
//函数名称:uint ADS7843_rd(void)
//函数功能:读ADS7843
//入口参数:无
//出口参数:读回的坐标值
//====================================================================================
uint ADS7843_rd(void)
{
uchar i;
uint dat=0;
for(i=0;i<16;i++)
{
DCLK=1;
delay_us(3);//下降沿有效
DCLK=0;
delay_us(3);
DOUT=1;
if(DOUT)
dat++;
if(i<15)
dat<<=1;
//delay_us(2);
}
dat=(dat&0xFFF0)>>4;
return dat;
}
//====================================================================================
void TOUCH_INIT()
{
INT0=1;//INT1输出高电平
IE0=0;//中断标志位清零
IT0=1;//下降沿触发
EX0=1;//INT1打开
ADS7843_start();
ADS7843_wr(0x94);//送控制字 10010000 即用差分方式读X坐标
delay_us(200);
ADS7843_rd(); //读X轴坐标
}
//====================================================================================
//函数名称:void intr0_ISR()
//函数功能:外中断0中断服务函数
//入口参数:无
//出口参数:无
//====================================================================================
void intr0_ISR() interrupt 0
{
uchar i;
EA=0;//关中断
delay_ms(10); //中断后延时以消除抖动,使得采样数据更准确
PENIRQ = 1;
for(i = 0; i < 10; i++)
{
if(PENIRQ)
break;
ADS7843_start();
delay_us(10);
ADS7843_wr(0x94);//送控制字 10010000 即用差分方式读X坐标
delay_us(10);
temp_y[i] = ADS7843_rd(); //读X轴坐标
ADS7843_wr(0xD4); //送控制字 11010000 即用差分方式读Y坐标
delay_us(10);
temp_x[i] = ADS7843_rd(); //读Y轴坐标
CS=1;
delay_us(5);
}
if(i >= 10)
g_Status.bTouchPressed = true;
EA=1; //开中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -