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

📄 touch.c

📁 基于ADS7843的触摸屏模块开发,所用的单片机时MEGA128
💻 C
字号:
#include <iom128.h>
#include <stdio.h>
#include <macros.h>
#include "touch.h"
#include "lcd.h"
#define DELAY_TOUCH 200
struct Touch cursor;
unsigned int x=0;
unsigned char y=0;

/*
mega128单片机驱动ADS7846/ADS7843芯片
ADS7846/7843芯片 适合用在4线制触摸屏,它通过标准SPI协议和CPU通信,操作简单,精度高当
触摸屏被按下时(即有触摸事件发生)则ADS7846向CPU发中断请求,CPU接到请求后,
应延时一下再响应其请求,目的是为了消除抖动使得采样更准确。如果一次采样不准确。
ADS7846  触摸屏中断 外部中断6(INT6)
     DCLK    PE7
          TCS     PB0  
          DIN     PB1
          DOUT  PB2
*/ 
void Init_Touch(void)
{
	PORTB |= 0x01; //TCS片选信号置高
	DDRE |= 0x80;
	DDRB |=0x03;
	  //DCLK TCS DIN 为输出;
	DDRB &=~0x04;  //DOUT为输入;
	PORTB &=~ 0x01;
}
/**********************************************************************
延时程序
**********************************************************************/
void delay(unsigned int i)

{
   while(i--);
}
//======================================================================
void Delay(unsigned char n)
{
   unsigned char i;
   unsigned int j;
   for(i=0;i<n;i++)
   {
      for (j=0;j<65535;j++)
	  {};
   }
}


//==================================================================
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;
   unsigned char i;
   unsigned int m=0,n=0;
   
   CLI();//关中断
  // Clear_Lcd(YELLOW);
   //DDRE |= 0x20;//BELL位输出
   //PORTE &=~ 0x20;//BELL输出为低,蜂鸣器响
   //x=cursor.x;
  // y=cursor.y;
  // cursor.old_x = cursor.x;
  // cursor.old_y = cursor.y;
   PORTB &=~0x01; //TCS片选信号为低
   delay(DELAY_TOUCH);
   WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读Y坐标 详细请见有关资料
   delay(DELAY_TOUCH);
   DCLK_1;
   delay(DELAY_TOUCH);
   DCLK_0;
   delay(DELAY_TOUCH);
   cursor.y=ReadFromCharFrom7843();
   WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读X坐标 详细请见有关资料
   DCLK_1; 
   delay(DELAY_TOUCH);
   DCLK_0; 
   delay(DELAY_TOUCH);
   cursor.x=ReadFromCharFrom7843();
   y=cursor.y;
   x=cursor.x;
   PORTB |= 0x01; //TCS片选信号置高
   delay(DELAY_TOUCH);

   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;
   
   //PORTE |= 0x20;//BELL输出为高,蜂鸣器关

for(i=0;i<6;i++)
{
   delay(65535);
 }
   EIFR |= 0x40;
   SEI();//开中断
 }
 /***********************************************************************
 触摸屏校准程序
 ************************************************************************/
 void touch_calibration(void)
 {
    //unsigned char i,j;
	
	Dis_Rect(200,200,4,4,BLACK);
	if(cursor.flag==1)
	{
	   if((cursor.x>=200)&&(cursor.x<=204)&&(cursor.y>=200)&&(cursor.y<=204))
	      {Display(40,40,"OK",BIG,BLACK,WHITE);}
   
	}
 }
 /****************************************************************************
 *******************************************************************************/

⌨️ 快捷键说明

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