Control TouchScreen ADS7843

Dependents:   Touch_Example Example_Menu_LCD_TFT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Touch.h Source File

Touch.h

00001 /*
00002    \file Touch.h
00003    \version: 1.0
00004    
00005    \brief Este fichero contiene class para control de TouchScreen ADS7843 
00006    
00007    \web www.micros-designs.com.ar
00008    \date 16/01/11
00009    
00010  *- Version Log --------------------------------------------------------------*
00011  *   Fecha       Autor                Comentarios                             *
00012  *----------------------------------------------------------------------------*
00013  * 16/01/11      Suky        Original                                         *
00014  *----------------------------------------------------------------------------* 
00015 ///////////////////////////////////////////////////////////////////////////
00016 ////                                                                   ////
00017 ////                                                                   ////
00018 ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
00019 //// Este código puede ser usado, modificado y distribuido libremente  ////
00020 //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
00021 ////                                                                   ////
00022 ////                                                                   ////
00023 /////////////////////////////////////////////////////////////////////////// 
00024 // **********************************************************************
00025 // ************************** EXAMPLE ***********************************
00026 // **********************************************************************
00027 #include "mbed.h"
00028 #include "Touch.h"
00029 // **********************************************************************
00030 #define TOUCH_X_MIN 30
00031 #define TOUCH_X_MAX 230
00032 #define TOUCH_Y_MIN 15
00033 #define TOUCH_Y_MAX 240
00034 // **********************************************************************
00035 DigitalOut Led1(LED1);
00036 DigitalOut Led2(LED2);
00037 // **********************************************************************
00038 TOUCH_DATA Coordenadas;
00039 volatile bool kbhit_irq=0;
00040 
00041 TouchScreenADS7843 MyTouch(p9,p10,p11,p12,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ
00042 // **********************************************************************
00043 void vISRTouchIRQ(void){
00044     UINT_COORDxy Temp;
00045 
00046     MyTouch.vTestTouchPanel(&Coordenadas);
00047     // Coordenadas dentro del rango de pantalla LCD:
00048     if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){
00049         // Cambio de coordenada y escala:
00050         Temp=Coordenadas.y;
00051         Coordenadas.y=((float)((255-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN)));
00052         Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN)));
00053         kbhit_irq=1;
00054     }
00055 }
00056 // **********************************************************************
00057 int main(){
00058 
00059     //MyTouch.vInitADS7843(USE_12BITS,NULL);
00060     MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ);
00061 
00062     Led1=0;
00063     Led2=0;
00064 
00065     while(1){
00066         Led2=!Led2;
00067         if(kbhit_irq==1){
00068             kbhit_irq=0;
00069             if((Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>250)){
00070                 Led1=!Led1;
00071             }
00072         }
00073         wait_ms(300);
00074     }
00075 }
00076 // **********************************************************************
00077 */
00078 #include "mbed.h"
00079 // **********************************************************************
00080 #define USE_12BITS            12
00081 #define USE_8BITS            8
00082 #define ENABLE_INTERRUPT    1
00083 #define DISABLE_INTERRUPT    0
00084 // **********************************************************************
00085 typedef unsigned short             UINT_COORDxy;
00086 typedef struct {
00087     UINT_COORDxy    x;
00088     UINT_COORDxy    y;
00089 }TOUCH_DATA;
00090 // **********************************************************************
00091 class TouchScreenADS7843 {
00092 public:
00093     TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ);
00094     void vInitADS7843(unsigned char Bits,void (*fptr)(void));
00095     void vSetResolution(unsigned char Bits);
00096     void vTestTouchPanel(TOUCH_DATA *Data);
00097     void vEnableSetInterrupt(void (*fptr)(void));
00098     void vDisableInterrupt(void);
00099     bool bReadPinIRQ(void);
00100 protected:
00101 #define     __delay_CLK_ADS7843()     wait_us(1)
00102 #define     ADS7843_READ_X_8        0x98 // IRQ Enable     
00103 #define     ADS7843_READ_Y_8        0xD8
00104 #define     ADS7843_READ_X_12       0x90 // IRQ Enable
00105 #define     ADS7843_READ_Y_12       0xD0
00106     DigitalOut     _PIN_SDI,_PIN_CS,_PIN_CLK;
00107     DigitalIn     _PIN_SDO,_PIN_IRQ;
00108     InterruptIn ADS7843_Event_Touch;
00109     unsigned char Resolution;
00110     virtual UINT_COORDxy ADS7843WriteAndReadData(unsigned char Data);
00111 };
00112 // **********************************************************************
00113 TouchScreenADS7843::TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ)
00114         : _PIN_SDO(PIN_SDO),_PIN_SDI(PIN_SDI),_PIN_CS(PIN_CS),_PIN_CLK(PIN_CLK),_PIN_IRQ(PIN_IRQ),ADS7843_Event_Touch(PIN_IRQ) {}
00115 // **********************************************************************
00116 void TouchScreenADS7843::vInitADS7843(unsigned char Bits,void (*fptr)(void)) {
00117 
00118     _PIN_CS=1;
00119     _PIN_SDI=0;
00120     _PIN_CLK=0;
00121     Resolution=Bits;
00122     if (fptr!=NULL) {
00123         ADS7843_Event_Touch.fall(fptr);
00124     }
00125 }
00126 // **********************************************************************
00127 void TouchScreenADS7843::vSetResolution(unsigned char Bits) {
00128     Resolution=Bits;
00129 }
00130 // **********************************************************************
00131 void TouchScreenADS7843::vEnableSetInterrupt(void (*fptr)(void)) {
00132     ADS7843_Event_Touch.fall(fptr);
00133 }
00134 // **********************************************************************
00135 void TouchScreenADS7843::vDisableInterrupt(void) {
00136     ADS7843_Event_Touch.fall(NULL);
00137 }
00138 // **********************************************************************
00139 bool TouchScreenADS7843::bReadPinIRQ(void) {
00140     return(_PIN_IRQ);
00141 }
00142 // **********************************************************************
00143 UINT_COORDxy TouchScreenADS7843::ADS7843WriteAndReadData(unsigned char Data) {
00144     unsigned char k;
00145     UINT_COORDxy Temp;
00146 
00147     _PIN_CS=0;
00148     __delay_CLK_ADS7843();
00149     // En cada flanco ascendente se toma el dato:
00150     for (k=0;k<8;k++) {
00151         _PIN_SDI=!!(Data&0x80);
00152         __delay_CLK_ADS7843();
00153         _PIN_CLK=1;
00154         __delay_CLK_ADS7843();
00155         Data<<=1;
00156         _PIN_CLK=0;
00157 
00158     }
00159     __delay_CLK_ADS7843(); // Esperamos busy:
00160     _PIN_CLK=1;
00161     __delay_CLK_ADS7843();
00162     _PIN_CLK=0;
00163     __delay_CLK_ADS7843();
00164     __delay_CLK_ADS7843(); // Esperamos busy:
00165 
00166     // En flanco descendente leemos data desde el ADS7843:
00167     _PIN_CLK=1;
00168     Temp=0;
00169 
00170     if (Resolution==8) {
00171         for (k=0;k<8;k++) {
00172             Temp<<=1;
00173             _PIN_CLK=0;
00174             Temp+=_PIN_SDO;
00175             __delay_CLK_ADS7843();
00176             _PIN_CLK=1;
00177         }
00178     } else {
00179         for (k=0;k<12;k++) {
00180             Temp<<=1;
00181             _PIN_CLK=0;
00182             Temp+=_PIN_SDO;
00183             __delay_CLK_ADS7843();
00184             _PIN_CLK=1;
00185         }
00186     }
00187     __delay_CLK_ADS7843();
00188     _PIN_CLK=0;
00189     _PIN_CS=1;
00190 
00191     return(Temp);
00192 }
00193 // **********************************************************************
00194 void TouchScreenADS7843::vTestTouchPanel(TOUCH_DATA *Data) {
00195     unsigned short TempX,TempY;
00196     unsigned char k;
00197 
00198     wait_ms(1);
00199 
00200     TempX=0;
00201     TempY=0;
00202     for (k=0;k<8;k++) {
00203         if (Resolution==8) {
00204             TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_8);
00205             TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_8);
00206         } else {
00207             TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_12);
00208             TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_12);
00209         }
00210     }
00211 
00212 
00213     Data->x=(TempX>>3);
00214     Data->y=(TempY>>3);
00215 
00216     return;
00217 }
00218 // **********************************************************************