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

📄 toch.h

📁 Touch Source Code for CodevisionAVR
💻 H
字号:
#include "Include\Function.h"

int TXs;
int TXe;
int TYs;
int TYe;

#define TXsADD 10
#define TXeADD 14
#define TYsADD 18
#define TYeADD 22
#define TU_Cal 26

int Toch_X=0,
      Toch_Y=0;

unsigned char Bx,By;

int CheckTochAre(int,int,int,int);

#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 1
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x00

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
/*
#####################################################################
*/
void ADCInit()
{
 // ADC initialization
// ADC Clock frequency: 921.600 kHz
// ADC Voltage Reference: AREF pin
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCB;

 // Global enable interrupts
 #asm("sei")
}
/*
#####################################################################
*/
void ReadXPos(int TAV)
{
 unsigned long Avrage=0;
 int i=0;
 
 DDRA=0x05;
 PORTA=0x04;

 delay_ms(10);
 for(i=0 ;i<TAV ;i++)
 {
  Avrage+=adc_data[1];
 }
 Toch_X=Avrage/TAV ;
}
/*
#####################################################################
*/
void ReadYPos(int TAV)
{
 unsigned long Avrage=0;
 int i=0;
 
  DDRA=0x0A;
 PORTA=0x08;
 
 delay_ms(10);
 for(i=0 ;i<TAV ;i++)
 {
  Avrage+=adc_data[0];
 }
 Toch_Y=Avrage/TAV ;
}
/*
#####################################################################
*/

int CheckTochAre(int x,int y,int x1,int y1)
{
ReadXPos(1000);
ReadYPos(1000);
 if( Toch_X >= x)
 {
  if( Toch_X <= x1)
  {
   if(Toch_Y >= y)
   {
    if(Toch_Y <= y1)
    {
     Buzzer=0;
     delay_ms(20);
     Buzzer=1;
     Toch_Y=0;
     Toch_X=0;
     return (1);
    }
   }
  }
 }
 return(0);
}

/*
#####################################################################
*/
void Touch_Scan(void)
{
while(1)
{
      char XP[6];
      char YP[6];
      
      ReadYPos(100);
      ReadXPos(100);
      
      itoa(Toch_X,XP);
      itoa(Toch_Y,YP);
      clearLCD();
      LCDprintf3(0,7,XP);
      LCDprintf3(64,7,YP);
      delay_ms(200);
}
}
/*
#####################################################################
*/
void Touch_Test(void)
{
      LCD_RST();
      on();
      clearLCD();
      LCDprintf2(0,0,"Toc1  Toc2  Toc3  Toc4");
      LCDprintf2(0,1,"Toc5  Toc6  Toc7  Toc8");
      LCDprintf2(0,2,"Toc9  To10  To11  To12");
      LCDprintf2(0,3,"To13  To14  To15  To16");
      LCDprintf2(0,4,"To17  To18  To19  To20");
      LCDprintf2(0,5,"To21  To22  To23  To24");
      LCDprintf2(0,6,"To25  To26  To27  To28");
      Touch_Scan();
}
/*
#####################################################################
*/ 

char Touch_Calibration(void)
{
      int Xpo,Ypo,Xpo1,Ypo1,Xpo2,Ypo2,Xpo3,Ypo3,
                   TSX1,TSY1,TEX1,TEY1,TSX2,TSY2,TEX2,TEY2;
      long int TSX,TSY,TEX,TEY;
      
      unsigned char Tel=10;
      unsigned int DELAY1=100;
      unsigned int DELAY2=500;
      int Area;
      
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo=Toch_X;
      Ypo=Toch_Y;
      clearLCD(); 
      delay_ms(DELAY1);
      LCDprintf2(0,7,"[1]"),LCDprintf2(0,3,"Touch[1]for 1 Seconds");
      LOOP1:
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo1=Toch_X;
      Ypo1=Toch_Y;
      if((Xpo1>=Xpo-Tel && Xpo1<=Xpo+Tel) && (Ypo1>=Ypo-Tel && Ypo1<=Ypo+Tel)) goto LOOP1;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo2=Toch_X;
      Ypo2=Toch_Y;
      if(!((Xpo2>=Xpo1-Tel && Xpo1<=Xpo1+Tel) && (Ypo1>=Ypo1-Tel && Ypo1<=Ypo1+Tel))) goto LOOP1;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo3=Toch_X;
      Ypo3=Toch_Y;
      if(!((Xpo3>=Xpo2-Tel && Xpo3<=Xpo2+Tel) && (Ypo3>=Ypo2-Tel && Ypo3<=Ypo2+Tel))) goto LOOP1;
      TSX1=Xpo3;
      TSY1=Ypo3;
//------------------------------------------------------
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo=Toch_X;
      Ypo=Toch_Y;
      clearLCD(); 
      delay_ms(DELAY1);
      LCDprintf2(109,7,"[2]");
      LCDprintf2(0,3,"Touch[2]for 1 Seconds");
      LOOP2:
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo1=Toch_X;
      Ypo1=Toch_Y;
      if((Xpo1>=Xpo-Tel && Xpo1<=Xpo+Tel) && (Ypo1>=Ypo-Tel && Ypo1<=Ypo+Tel)) goto LOOP2;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo2=Toch_X;
      Ypo2=Toch_Y;
      if(!((Xpo2>=Xpo1-Tel && Xpo1<=Xpo1+Tel) && (Ypo1>=Ypo1-Tel && Ypo1<=Ypo1+Tel))) goto LOOP2;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo3=Toch_X;
      Ypo3=Toch_Y;
      if(!((Xpo3>=Xpo2-Tel && Xpo3<=Xpo2+Tel) && (Ypo3>=Ypo2-Tel && Ypo3<=Ypo2+Tel))) goto LOOP2;
      TEX1=Xpo3;
      TSY2=Ypo3;
//------------------------------------------------------
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo=Toch_X;
      Ypo=Toch_Y;
      clearLCD(); 
      delay_ms(DELAY1);
      LCDprintf2(0,0,"[3]");
      LCDprintf2(0,3,"Touch[3]for 1 Seconds");
      LOOP3:
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo1=Toch_X;
      Ypo1=Toch_Y;
      if((Xpo1>=Xpo-Tel && Xpo1<=Xpo+Tel) && (Ypo1>=Ypo-Tel && Ypo1<=Ypo+Tel)) goto LOOP3;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo2=Toch_X;
      Ypo2=Toch_Y;
      if(!((Xpo2>=Xpo1-Tel && Xpo1<=Xpo1+Tel) && (Ypo1>=Ypo1-Tel && Ypo1<=Ypo1+Tel))) goto LOOP3;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo3=Toch_X;
      Ypo3=Toch_Y;
      if(!((Xpo3>=Xpo2-Tel && Xpo3<=Xpo2+Tel) && (Ypo3>=Ypo2-Tel && Ypo3<=Ypo2+Tel))) goto LOOP3;
      TSX2=Xpo3;
      TEY1=Ypo3;
//------------------------------------------------------
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo=Toch_X;
      Ypo=Toch_Y;
      clearLCD(); 
      delay_ms(DELAY1);
      LCDprintf2(109,0,"[4]");
      LCDprintf2(0,3,"Touch[4]for 1 Seconds");
      LOOP4:
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo1=Toch_X;
      Ypo1=Toch_Y;
      if((Xpo1>=Xpo-Tel && Xpo1<=Xpo+Tel) && (Ypo1>=Ypo-Tel && Ypo1<=Ypo+Tel)) goto LOOP4;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo2=Toch_X;
      Ypo2=Toch_Y;
      if(!((Xpo2>=Xpo1-Tel && Xpo1<=Xpo1+Tel) && (Ypo1>=Ypo1-Tel && Ypo1<=Ypo1+Tel))) goto LOOP4;
      delay_ms(DELAY2);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      Xpo3=Toch_X;
      Ypo3=Toch_Y;
      if(!((Xpo3>=Xpo2-Tel && Xpo3<=Xpo2+Tel) && (Ypo3>=Ypo2-Tel && Ypo3<=Ypo2+Tel))) goto LOOP4;
      TEX2=Xpo3;
      TEY2=Ypo3;
//------------------------------------------------------
      TSX=(TSX1+TSX2)/2;
      TEX=(TEX1+TEX2)/2;
      TSY=(TSY1+TSY2)/2;
      TEY=(TEY1+TEY2)/2;
      TXs=(unsigned int)TSX;
      TXe=(unsigned int)TEX;
      TYs=(unsigned int)TSY;
      TYe=(unsigned int)TEY;
//------------------------------------------------------
      Write_EEProm(TXsADD,TXs);
      Write_EEProm(TXeADD,TXe);
      Write_EEProm(TYsADD,TYs);
      Write_EEProm(TYeADD,TYe);
      Write_EEProm(TU_Cal,10);
//------------------------------------------------------            
      clearLCD();
      LCDprintf2(0,0,"Touch Calibration");
      LCDprintf2(0,1,"successfully");
      LCDprintf2(0,2,"completed");
      LCDprintf2(0,4,"Touch Next");
      LCDprintf2(100,7,"Next");      
      L1: 
      Area=CheckTochAre(500,50,1100,200);
      if(Area!=1) goto L1;
      else return 1;
} 
//------------------------------------------------------ END
/*
#####################################################################
*/
char Button(void)
{
      unsigned int tel=10;
      unsigned int DELAY=20;
      unsigned int TX,TY,XS,YS,XE,YE,X,Y,X1,Y1,X2,Y2,x,y;
      float Dx,Dy,xx,yy;
      unsigned char BUTTON[8][8]={{11,12,13,14,15,16,17,18},
                                 {21,22,23,24,25,26,27,28},
                                 {31,32,33,34,35,36,37,38},
                                 {41,42,43,44,45,46,47,48},
                                 {51,52,53,54,55,56,57,58},
                                 {61,62,63,64,65,66,67,68},
                                 {71,72,73,74,75,76,77,78},
                                 {81,82,83,84,85,86,87,88}};
//--------------------------------------------------------------       
      TXs=Read_EEProm(TXsADD);
      TXe=Read_EEProm(TXeADD);
      TYs=Read_EEProm(TYsADD);
      TYe=Read_EEProm(TYeADD);
//--------------------------------------------------------------
      XS=TXs,YS=TYs,XE=TXe,YE=TYe,TX=XE-XS,TY=YE-YS;
      Dx=(float)TX/8;
      Dy=(float)TY/8;
      
      LOOP:
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      X=Toch_X;
      Y=Toch_Y;
      if(X<XS || Y<YS) goto LOOP;
      delay_ms(DELAY);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      X1=Toch_X;
      Y1=Toch_Y;
      if(!(( X1>=X-tel && X1<=X+tel ) && ( Y1>=Y-tel && Y1<=Y+tel))) goto LOOP;
      delay_ms(DELAY);
      Toch_X=0;
      Toch_Y=0;
      ReadXPos(1000);
      ReadYPos(1000);
      X2=Toch_X;
      Y2=Toch_Y;
      if(!(( X2>=X1-tel && X2<=X1+tel ) && ( Y2>=Y1-tel && Y2<=Y1+tel))) goto LOOP;
      if(X2>=XE) Bx=7;
      else
      {
            x=X2-XS;
            xx=x/Dx;
            Bx=floor(xx);
      }
      if(Y2>=YE) By=7;
      else
      {
            y=Y2-YS;
            yy=y/Dy;
            By=floor(yy);
      }
      return BUTTON[By][Bx];      
}
/*
#####################################################################
*/
void Touch_Test2(void)
{
      unsigned char BATTON;
      unsigned char XX;
      unsigned char YY;
      clearLCD();
      line(0,0,127,0);
      line(0,8,127,8);
      line(0,16,127,16);
      line(0,24,127,24);
      line(0,32,127,32);
      line(0,40,127,40);
      line(0,48,127,48);
      line(0,56,127,56);                         
      line(0,63,127,63);
      
      line(0,0,0,63);
      line(16,0,16,63);
      line(32,0,32,63);
      line(48,0,48,63);
      line(64,0,64,63);
      line(80,0,80,63);
      line(96,0,96,63);
      line(112,0,112,63);      
      line(127,0,127,63);
while(1)
{      
      BATTON=Button();
BUZZER(1);
      switch(Bx)
      {
            case 0:
                  XX=1;
                  break;                 
            case 1:
                  XX=17;
                  break;                 
            case 2:
                  XX=33;
                  break;                 
            case 3:
                  XX=49;
                  break;                 
            case 4:
                  XX=65;
                  break;                 
            case 5:
                  XX=81;
                  break;                 
            case 6:
                  XX=97;
                  break;                 
            case 7:
                  XX=113;
                  break;
       }
      switch(By)
      {
            case 0:
                  YY=7;
                  break;                 
            case 1:
                  YY=6;
                  break;                 
            case 2:
                  YY=5;
                  break;                 
            case 3:
                  YY=4;
                  break;                 
            case 4:
                  YY=3;
                  break;                 
            case 5:
                  YY=2;
                  break;                 
            case 6:
                  YY=1;
                  break;                 
            case 7:
                  YY=0;
                  break;                 
       }
       LCDprintf2(XX,YY,"OK");
BUZZER(1);
       delay_ms(10);
}
}                        

⌨️ 快捷键说明

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