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

📄 ads7843.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
字号:
#include "..\APP\includes.h"


// A/D 通道选择命令字和工作寄存器
#define	CHX 	0x90 	//通道X+的选择控制字	
#define	CHY 	0xd0	//通道Y+的选择控制字 

//#define	CHX 	0xd0 	//通道X+的选择控制字	
//#define	CHY 	0x90	//通道Y+的选择控制字 

MATRIX  Matrix;//为了避免重复校准,可以保存该校准值

//====================================================================================
static void Delayus( int k)
{
 int j;
    
    for(j=k;j > 0;j--);    
}

//====================================================================================
void TP_Init(void)
{
  //PB10, PD9, PD10   CS,SI,CLK
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		 //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9|GPIO_Pin_10 ;  
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  //PENIRQ, SO	
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  //start_touch();
}

void start_touch()   
{ 	  
	TP_DCLK_L();   
	TP_CS_H(); 	 
	TP_DIN_H();  
	TP_DCLK_H();   
	TP_CS_L(); 	 
}

//====================================================================================
static void WR_CMD (u8 cmd) 
{
 //u8 buf;
 	
}


//====================================================================================
static u16 RD_AD(void) 
{
  u16 buf=0;
 u8 i;
    
    TP_DIN_L(); //TP_DIN(0);
    TP_DCLK_H(); //TP_DCLK(1);
    for(i=0; i<12; i++) 
    {	buf <<= 1;
        
        TP_DCLK_H(); //TP_DCLK(0);         
        Delayus(5);
        TP_DCLK_L(); //TP_DCLK(1);
        
        if(TP_DOUT)	buf |= 1;
        
        Delayus(5);
        
    }
    TP_CS_H(); //TP_CS(1);
    //buf>>=4;//只有12位有效
    //buf&=0x0fff;
    return(buf); 
}





#define ReadLoop 13 //必须>2
#define LOSS_DATA 5 //前后丢掉数据个数
u16 Read_XY(u8 xy) 
{ 
 u16 i, j;
 u16 buf[ReadLoop];
 uint32 sum;
 u16 val;
    
    for(i=0; i<ReadLoop; i++)
    {
       WR_CMD(xy);
       //while(TP_BUSY);
       Delayus(5);
       buf[i]=RD_AD();
       
       //sum += buf[i];
    }
    
    //排序
    for(i=0; i<ReadLoop-1; i++)
    {
       for(j=i+1; j<ReadLoop; j++)
       {
          if(buf[i]>buf[j])
          {
             val=buf[i];
             buf[i]=buf[j];
             buf[j]=val;
          }
       }
    }
    
    sum=0;
    for(i=LOSS_DATA; i<ReadLoop-1-LOSS_DATA; i++)
       sum += buf[i];
    val=sum/(ReadLoop-2*LOSS_DATA);
    
    return (val);    
}

//====================================================================================
uint8 TP_GetAdXY(u16 *x, u16 *y) 
{
 //u16 adx,ady;
    
    *y=Read_XY(CHX);
    *x=Read_XY(CHY);
    //*x=adx;
    //*y=ady;
    if(*x<100 || *y<100)
       return(0);
    else
       return(1);
}

/*
功能:读取触摸屏读坐标,该坐标未做转换,不能直接使用

返回:0=无效坐标
      1=有效坐标

说明:本函数连续采样2次,2次采样结果+-5范围内才算有效
*/
uint8 TP_GetAdXY2(u16 *x, u16 *y, uint32 delay) 
{u16 x1,y1;
 u16 x2,y2;
 u8 flag;
 
    flag=TP_GetAdXY(&x1, &y1);
    
    if(flag==0)
       return(0);
    
//    if(delay>=OS_TIME)
//       os_dly_wait(delay/OS_TIME);//300ms后再采样1次
    
    //do{
       flag=TP_GetAdXY(&x2, &y2);
    //}while(flag);
    
    if(flag==0)
       return(0);
    
    if( ( (x2<=x1 && x1<x2+50) || (x1<=x2 && x2<x1+50) )//前后两次采样在+-5内
     && ( (y2<=y1 && y1<y2+50) || (y1<=y2 && y2<y1+50) ) )
    {
        *x=(x1+x2)/2;
        *y=(y1+y2)/2;
        return(1);
    }
    else
       return(0);
}

///*
//功能:读取触摸屏在LCD的坐标,该坐标已经转换为可用的视图坐标
//返回:0=不在显示区域
//      1=在显示区域
//*/
//uint8 TP_GetLCDXY(u16 *x, u16 *y) 
//{POINT   displayPoint;
// POINT   TouchSample;
// uint16 xt,yt;	
// uint8 flag;
// 
//    flag=TP_GetAdXY2(&xt, &yt, 0);
//    if(flag)
//    {
//       TouchSample.x=xt/4; TouchSample.y=yt/4;
//       getDisplayPoint( &displayPoint, &TouchSample, &Matrix );
//       
//       if(IsDisplayArea(&displayPoint)) //判断是否在显示区域
//       {
//          flag=1;
//          *x=displayPoint.x;
//          *y=displayPoint.y;
//       }
//       else
//          flag=0;
//    }
//    
//    return(flag);
//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -