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

📄 touch.c

📁 制袋机程序.rar
💻 C
字号:
/***************************************
* 文件名:TOUCH.c
* 描述:
* 最后修改时间:2010.4.7
****************************************/

#include "includes.h"

#define XZERO 160
#define YZERO 263
#define XFULL 3919
#define YFULL 3764

static uint xdata temp_x[10];
static uint xdata temp_y[10];


//====================================================================================
//函数名称:uint average(uint* a,uchar len)
//函数功能:数据处理程序,采集len次的数据,去掉最大值,去掉最小值,然后求平均
//入口参数:数组首地址
//出口参数:平均值
//====================================================================================
uint average(uint * a,uchar len)
{
  uint max,min,i,ave=0;
  ulong sum=0;
  max=a[0];
  min=a[0];
  for(i=0;i<len;i++)
  {
    if(max<a[i])
      max=a[i];
    if(min>a[i])
      min=a[i];
      sum+=a[i];
  }
  ave=(sum-min-max)/(len-2);
  return ave;
}

bool TOUCH_IsReleased()
{
  PENIRQ = 1;
  if(PENIRQ)
    return true;
  else
    return false;
}

void Update_TouchPoint()
{
  uint temp;
  temp = average(temp_x, 10);
  g_Status.x  = (uint)((float)temp *0.21075 - 31.296);
  temp = average(temp_y, 10);
  g_Status.y  = (uint)((float)temp*0.17346 - 59.41);
}

//====================================================================================
//函数名称:void ADS7843_start(void)
//函数功能:ADS7843启动
//入口参数:无
//出口参数:无
//====================================================================================
void ADS7843_start(void)
{
  DCLK=0;
  CS=1;
  DIN=1;
  DCLK=1;
  CS=0;
}

//====================================================================================
//函数名称:void ADS7843_wr(uchar dat)
//函数功能:写ADS7843
//入口参数:dat 写入的数据
//出口参数:无
//====================================================================================
void ADS7843_wr(uchar dat)
{
  bit temp;
  uchar i;
  DCLK=0;
  for(i=0;i<8;i++)
  {
    DCLK=0;
    temp=(bit)((dat) & 0x80);     //DCLK低电平时准备数据
    dat=dat<<1;
    DIN=temp;
    delay_us(2);//_nop_();
    DCLK=1;
    delay_us(2);//_nop_();
  }
  DCLK=0;
}

//====================================================================================
//函数名称:uint ADS7843_rd(void)
//函数功能:读ADS7843
//入口参数:无
//出口参数:读回的坐标值
//====================================================================================
uint ADS7843_rd(void)
{
  uchar i;
  uint dat=0;
  for(i=0;i<16;i++)
  {
    DCLK=1;
    delay_us(3);//下降沿有效
    DCLK=0;
    delay_us(3);
    DOUT=1;
    if(DOUT)
      dat++;
    if(i<15)
      dat<<=1;
    //delay_us(2);
  }
  dat=(dat&0xFFF0)>>4;
  return dat;
}
//====================================================================================

void TOUCH_INIT()
{
  INT0=1;//INT1输出高电平
  IE0=0;//中断标志位清零
  IT0=1;//下降沿触发
  EX0=1;//INT1打开

  ADS7843_start();
  ADS7843_wr(0x94);//送控制字 10010000 即用差分方式读X坐标
  delay_us(200);
  ADS7843_rd(); //读X轴坐标
}

//====================================================================================
//函数名称:void intr0_ISR()
//函数功能:外中断0中断服务函数
//入口参数:无
//出口参数:无
//====================================================================================

void intr0_ISR() interrupt 0
{
  uchar i;
  EA=0;//关中断
  delay_ms(10);   //中断后延时以消除抖动,使得采样数据更准确
  PENIRQ = 1;

  for(i = 0; i < 10; i++)
  {
    if(PENIRQ)
      break;
    ADS7843_start();
    delay_us(10);
    ADS7843_wr(0x94);//送控制字 10010000 即用差分方式读X坐标
    delay_us(10);
    temp_y[i] = ADS7843_rd(); //读X轴坐标
    ADS7843_wr(0xD4); //送控制字 11010000 即用差分方式读Y坐标
    delay_us(10);
    temp_x[i] = ADS7843_rd();    //读Y轴坐标
    CS=1;
    delay_us(5);
  }

  if(i >= 10)
    g_Status.bTouchPressed = true;

  EA=1;      //开中断
}


⌨️ 快捷键说明

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