⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ads7843.c

📁 STM32 单片机例程
💻 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 + -