Control TouchScreen ADS7843
Dependents: Touch_Example Example_Menu_LCD_TFT
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 // **********************************************************************
Generated on Wed Jul 13 2022 01:59:42 by 1.7.2