📄 ads7843.c
字号:
#include "..\main\include.h"
// A/D 通道选择命令字和工作寄存器
#define CHX 0x90 //通道X+的选择控制字
#define CHY 0xd0 //通道Y+的选择控制字
//#define CHX 0xd0 //通道X+的选择控制字
//#define CHY 0x90 //通道Y+的选择控制字
//====================================================================================
static void Delayus( int k)
{
int j;
for(j=k; j > 0; j--);
}
//====================================================================================
void TP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD, GPIO_Pin_13);
}
//====================================================================================
static u16 RD_AD(u8 cmd)
{
u8 temp;
u16 buf=0;
//buf=GPIOD->IDR;
//if(isBit16(buf, 9)==1)
// return(0);
TP_CS_L(); //TP_CS(0);
SPI_SetSpeed(SPI_SPEED_LOW);
//os_dly_wait(1);//300ms后再采样1次
Delayus(50);
SPI_Send_Byte(cmd);
temp=SPI_Send_Byte(0xff);
buf = temp;
buf <<= 8;
temp = SPI_Send_Byte(0xff);
SPI_SetSpeed(SPI_SPEED_HIGH);
TP_CS_H(); //TP_CS(1);
buf += temp;
buf>>=4;//只有12位有效
//buf&=0x0fff;
return(buf);
}
//定义采样参数 ReadLoop采集次数, LOSS_DATA丢掉最大值,最小值个数
#define ReadLoop 13 //连续采集次数必须>3
#define LOSS_DATA 5 //丢掉最大最小数据个数
/*
功能:采集TP坐标数据
输出:
xValue X坐标采集到的值, yValue Y坐标采集到的值
返回:
0=无效数据,1=有效数据
说明:采集13次,然后排序,保留中间3次取平均值
*/
u8 Read_XY(u16 *xValue, u16 *yValue)
{
u16 i, j;
u16 bufX[ReadLoop];
u16 bufY[ReadLoop];
uint32 sumX;
uint32 sumY;
u16 val;
//连续采集X坐标,Y坐标数据
for(i=0; i<ReadLoop; i++)
{
//如果采集还没完,触摸已经抬起,那么放弃该次采集
if(TP_IRQ)
return(0);
//while(TP_BUSY);
//Delayus(5);
bufX[i]=RD_AD(CHY);
//while(TP_BUSY);
//Delayus(5);
bufY[i]=RD_AD(CHX);
Delayus(5);
}
//对采集数据排序
for(i=0; i<ReadLoop-1; i++)
{
for(j=i+1; j<ReadLoop; j++)
{
if(bufX[i]>bufX[j])
{
val=bufX[i];
bufX[i]=bufX[j];
bufX[j]=val;
}
if(bufY[i]>bufY[j])
{
val=bufY[i];
bufY[i]=bufY[j];
bufY[j]=val;
}
}
}
//丢掉最大最小数据后求和
sumX=0;sumY=0;
for(i=LOSS_DATA; i<ReadLoop-LOSS_DATA; i++)
{
sumX += bufX[i];
sumY += bufY[i];
}
//取平均值
*xValue=sumX/(ReadLoop-2*LOSS_DATA);
*yValue=sumY/(ReadLoop-2*LOSS_DATA);
return (1);
}
/*
功能:采集TP坐标数据
输出:
x:x坐标
y:y坐标
返回:
0=无效数据,1=有效数据
*/
uint8 TP_GetAdXY(u16 *x, u16 *y)
{
u8 flag;
if(TP_IRQ)
return(0);
flag=Read_XY(x, y);
if(flag==0)
return(0);
//一般情况,X,Y都比0大,具体你根据实际情况定,小于一定范围的可以认为是无效数据
if(*x<100 || *y<100)
return(0);
else
return(1);
}
extern void Delay(unsigned long time);
/*
功能:本函数连续采样2次,间隔时间由delay参数确定,2次采样结果+-50范围内才算有效
2次是指连续采集到2个处理后的有效数据,本例实际是采集2*13=26次数据
输出:
x:x坐标
y:y坐标
输入:
delay:采样间隔时间,单位ms
返回:
0=无效数据,1=有效数据
*/
uint8 TP_GetAdXY2(u16 *x, u16 *y, uint32 delay)
{u16 x1,y1;
u16 x2,y2;
u8 flag;
//u16 adx,ady;
flag=TP_GetAdXY(&x1, &y1);
if(flag==0)
return(0);
//os_dly_wait(delay/OS_TIME);//300ms后再采样1次
Delay(delay);
flag=TP_GetAdXY(&x2, &y2);
if(flag==0)
return(0);
//两次采样结果必须保持在一定范围内,该数值根据你实际情况定
if( ( (x2<=x1 && x1<x2+50) || (x1<=x2 && x2<x1+50) )//前后两次采样在+-50内
&& ( (y2<=y1 && y1<y2+50) || (y1<=y2 && y2<y1+50) ) )
{
*x=(x1+x2)/2;
*y=(y1+y2)/2;
return(1);
}
else
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -