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

📄 touch.c

📁 已经上传的YF-320240-3.5寸彩屏(可由单片机控制)的测试程序。主CPU为MEGA128
💻 C
字号:
#include <iom128v.h>
#include "touch.h"
#include <macros.h>
#include "display.h"
#include "lcd.h"

#define DELAY_TOUCH 20
struct Touch cursor;

/*
mega128单片机驱动ADS7846/ADS7843芯片
ADS7846/7843芯片 适合用在4线制触摸屏,它通过标准SPI协议和CPU通信,操作简单,精度高,当
触摸屏被按下时(即有触摸事件发生)则ADS7846向CPU发中断请求,CPU接到请求后,应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。如果一次采样不准确。
ADS7846  触摸屏中断 外部中断6(INT6)
     DCLK    PD4  
          DIN     PD5
          READY   PD6
          DOUT  PD7

*/ 
unsigned char touch_count = 0;
unsigned char touch_flag = 1; //显示屏关闭时为0,打开时为1
void Init_Touch(void)
{
    DDRD |= 0x70;
	T_CS_1;
	DDRD &=~0x80;
	PIND &= ~0x60;
	EIFR |= 0x40;
	//EICRB = 0x02;
	//DDRE &= ~0x40;
	//PORTE |= 0x40;
	Touch_Int_ON;
	//WriteCharTo7843(0x98);
     
}
void start(void)
{
    DCLK_0;
	T_CS_1;
    DIN_1;
    DCLK_1;
	T_CS_0;
}
void delay(unsigned char i)
{
    while(i--);
}
void Delayx10ms(unsigned int count)
     {  unsigned int i,j,k;
        for(i=0;i<count;i++)
           for (j=0;j<1950;j++)
               for (k=0;k<10;k++)
               ;
     }
void WriteCharTo7843(unsigned char num) //SPI写数据
{
unsigned char count=0;
DCLK_0;
delay(DELAY_TOUCH);
for(count=0;count<8;count++)
{
    if(num&0x80)
	{
	   DIN_1;
	}
	else
	{  DIN_0;
	}
    num<<=1;
	delay(DELAY_TOUCH);
    DCLK_1;
	delay(DELAY_TOUCH); //上升沿有效
    DCLK_0;
	delay(DELAY_TOUCH);
	
}
DIN_0;
}


unsigned int ReadFromCharFrom7843(void) //SPI 读数据
{
unsigned char count=0;
unsigned int Num=0;
for(count=0;count<8;count++)
{
   Num<<=1;
   DCLK_0; 
   delay(DELAY_TOUCH); //下降沿有效
   DCLK_1; 
   delay(DELAY_TOUCH);
   if(DOUT) Num++;
}
return(Num);
}
#pragma interrupt_handler Touch:8
void Touch(void)//外部中断0 用来接受键盘发来的数据
{
  unsigned long temp = 0;
  unsigned int min=0xffff,max=0;
  unsigned char i;
  BEEPON;
  cursor.old_x = cursor.x;
  cursor.old_y = cursor.y;
  delay(100);
  start();
  //T_CS_0;
  delay(20);
 WriteCharTo7843(0x98); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
  delay(20);
  DCLK_1;
  delay(DELAY_TOUCH);
  DCLK_0;
  delay(DELAY_TOUCH);
  cursor.y= ReadFromCharFrom7843();
  
  WriteCharTo7843(0xD8);
  DCLK_1; 
  delay(DELAY_TOUCH);
  DCLK_0; 
  delay(DELAY_TOUCH);
  cursor.x = ReadFromCharFrom7843();
  
  
  
  temp = 0;
  Delayx10ms(8);
  if(cursor.x>=15)
{
  temp = cursor.x-15;
}  
else
{
    temp = 0;
}
cursor.x = temp*320/224;
if(cursor.x>320)
{
    cursor.x = 320;
}
if(cursor.y>= 15)
{
   temp = cursor.y-15;
}   
else
{
   temp = 0;
}
cursor.y = temp*240/221;
if(cursor.y > 240)
{
    cursor.y = 240;
}
cursor.flag = 1;
BEEPOFF;
  EIFR |= 0x40;
  T_CS_1;
 /* T_CS_0;
  cursor.old_x = cursor.x;
  cursor.old_y = cursor.y;
  //Delayx10ms(7);
  delay(10);
  //WriteCharTo7843(0x98); //送控制字 10010000 即用差分方式读X坐标 详细请见有关资料

  //delay(20);
  
  //cursor.y=ReadFromCharFrom7843();
  for(i=0;i<5;i++)
  {  
     WriteCharTo7843(0x98);
     DCLK_1;
     delay(DELAY_TOUCH);
     DCLK_0;
     delay(DELAY_TOUCH);
      cursor.y= ReadFromCharFrom7843();
	  temp += cursor.y;
	  if(cursor.y > max) max = cursor.y;
	  if(cursor.y < min) min = cursor.y;
  }
  cursor.y = (temp - max - min)/3 ;
  temp = 0;
  max = 0;
  min = 0xffff;
 // WriteCharTo7843(0xD8); //送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
  
  for(i=0;i<5;i++)
  {   
      WriteCharTo7843(0xD8);
      DCLK_1; 
      delay(DELAY_TOUCH);
      DCLK_0; 
      delay(DELAY_TOUCH);
	  cursor.x = ReadFromCharFrom7843();
      temp += cursor.x;
	  if(cursor.x > max) max = cursor.x;
	  if(cursor.x < min) min = cursor.x;
  }
  cursor.x = (temp - max - min)/3 ;
  temp = 0;
  //Delayx10ms(8);
  //BEEPOFF;
  Delayx10ms(8);

if(cursor.x>=15)
{
  temp = cursor.x-15;
}  
else
{
    temp = 0;
}
cursor.x = temp*320/224;
if(cursor.x>320)
{
    cursor.x = 320;
}
if(cursor.y>= 15)
{
   temp = cursor.y-15;
}   
else
{
   temp = 0;
}
cursor.y = temp*240/221;
if(cursor.y > 240)
{
    cursor.y = 240;
}
cursor.flag = 1;
BEEPOFF;
touch_count++;
if(touch_flag == 0)
{
    touch_flag = 1;
	CMD &= 0xFD; //打开显示器 
	TCCR1B = 0x05; //启动定时器1
}
EIFR |= 0x40;
T_CS_1;*/
}

⌨️ 快捷键说明

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