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

📄 ads7843.c

📁 UCOSII在STM32平台的移植
💻 C
字号:
#include "..\APP\includes.h"



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

//====================================================================================
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 void WR_CMD (u8 cmd) 
{
 //u8 buf;
 u8 i;
    
    TP_CS_H(); //TP_CS(1);
    TP_DIN_L(); //TP_DIN(0);
    TP_DCLK_L(); //TP_DCLK(0);
    TP_CS_L(); //TP_CS(0);
    for(i=0;i<8;i++) 
    {
        //buf=(cmd>>(7-i))&0x1;
        //TP_DIN(buf);
        if( isBit8(cmd, 7-i) )
           TP_DIN_H();
        else
           TP_DIN_L();
        Delayus(5);
        TP_DCLK_H(); //TP_DCLK(1);
        Delayus(5);
        TP_DCLK_L(); //TP_DCLK(0);
    }
}
*/

//====================================================================================
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);
    
    //Delayus(100);
    
    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次取平均值
*/
u16 Read_XY(u8 xy) 
{ 
 u16 i, j;
 u16 buf[ReadLoop];
 uint32 sum;
 u16 val;
    
    SPI_SetSpeed(SPI_SPEED_LOW);
    
    //连续采集X坐标,Y坐标数据
    for(i=0; i<ReadLoop; i++)
    {
       
       //while(TP_BUSY);
       //Delayus(5);
       buf[i]=RD_AD(xy);
       
       Delayus(5);
    }
    
    SPI_SetSpeed(SPI_SPEED_HIGH);
    
    //对采集数据排序
    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-LOSS_DATA; i++)
    {
       sum += buf[i];
    }
    
    //取平均值
    val=sum/(ReadLoop-2*LOSS_DATA);
    
    return (val);    
}


/*
功能:采集TP坐标数据
输出:
  x:x坐标
  y:y坐标
返回:
  0=无效数据,1=有效数据
*/
uint8 TP_GetAdXY(u16 *x, u16 *y) 
{
 //u16 adx,ady;
    
    *y=Read_XY(CHX);
    *x=Read_XY(CHY);
    
    
    //一般情况,X,Y都比0大,具体你根据实际情况定,小于一定范围的可以认为是无效数据
    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 + -