触摸屏驱动

#include <stm32f10x_map.h>
#include "touch.h"
#include "lcd.h"
#include "delay.h"
#include "stdlib.h"
#include "math.h"
#include "24cxx.h"    
// 
//触摸屏驱动(支持ADS7843/7846/UH7843/7846/XPT2046/TSC2046等)代码          
//

_m_tp_dev tp_dev=
{
 TP_Init,
 TP_Scan,
 TP_Adjust,
 0,
 0,
  0,
 0,
 0,
 0,
 0,
 0,       
 0,
 0,       
};     
//默认为touchtype=0的数据.
u8 CMD_RDX=0XD0;
u8 CMD_RDY=0X90;
                 
//SPI写数据
//向触摸屏IC写入1byte数据   
//num:要写入的数据
void TP_Write_Byte(u8 num)   

 u8 count=0;  
 for(count=0;count<8;count++) 
 {   
  if(num&0x80)TDIN=1; 
  else TDIN=0;  
  num<<=1;   
  TCLK=0;  
  TCLK=1;  //上升沿有效        
 }         
}   
//SPI读数据
//从触摸屏IC读取adc值
//CMD:指令
//返回值:读到的数据   
u16 TP_Read_AD(u8 CMD)  
{  
 u8 count=0;   
 u16 Num=0;
 TCLK=0;  //先拉低时钟  
 TDIN=0;  //拉低数据线
 TCS=0;   //选中触摸屏IC
 TP_Write_Byte(CMD);//发送命令字
 delay_us(6);//ADS7846的转换时间最长为6us
 TCLK=0;           
 delay_us(1);       
 TCLK=1;  //给1个时钟,清除BUSY         
 TCLK=0;           
 for(count=0;count<16;count++)//读出16位数据,只有高12位有效
 {      
  Num<<=1;  
  TCLK=0; //下降沿有效          
  TCLK=1;
  if(DOUT)Num++;   
 }   
 Num>>=4;    //只有高12位有效.
 TCS=1;  //释放片选 
 return(Num);  
}
//读取一个坐标值(x或者y)
//连续读取READ_TIMES次数据,对这些数据升序排列,
//然后去掉最低和最高LOST_VAL个数,取平均值
//xy:指令(CMD_RDX/CMD_RDY)
//返回值:读到的数据
#define READ_TIMES 5  //读取次数
#define LOST_VAL 1    //丢弃值
u16 TP_Read_XOY(u8 xy)
{
 u16 i, j;
 u16 buf[READ_TIMES];
 u16 sum=0;
 u16 temp;
 for(i=0;i<READ_TIMES;i++)buf[i]=TP_Read_AD(xy);        
 for(i=0;i<READ_TIMES-1; i++)//排序
 {
  for(j=i+1;j<READ_TIMES;j++)
  {
   if(buf[i]>buf[j])//升序排列
   {
    temp=buf[i];
    buf[i]=buf[j];
    buf[j]=temp;
   }
  }
 }  
 sum=0;
 for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
 temp=sum/(READ_TIMES-2*LOST_VAL);
 return temp;  
}
//读取x,y坐标
//最小值不能少于100.
//x,y:读取到的坐标值
//返回值:0,失败;1,成功。
u8 TP_Read_XY(u16 *x,u16 *y)
{
 u16 xtemp,ytemp;         
 xtemp=TP_Read_XOY(CMD_RDX);
 ytemp=TP_Read_XOY(CMD_RDY);                 
 //if(xtemp<100||ytemp<100)return 0;//读数失败
 *x=xtemp;
 *y=ytemp;
 return 1;//读数成功
}
//连续2次读取触摸屏IC,且这两次的偏差不能超过
//ERR_RANGE,满足条件,则认为读数正确,否则读数错误.   
//该函数能大大提高准确度
//x,y:读取到的坐标值
//返回值:0,失败;1,成功。
#define E

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值