Control TouchScreen ADS7843

Dependents:   Touch_Example Example_Menu_LCD_TFT

Committer:
Suky
Date:
Fri Feb 04 03:00:35 2011 +0000
Revision:
1:63a925e2a3d2
Parent:
0:5d8d6a976b8b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Suky 0:5d8d6a976b8b 1 /*
Suky 0:5d8d6a976b8b 2 \file Touch.h
Suky 0:5d8d6a976b8b 3 \version: 1.0
Suky 0:5d8d6a976b8b 4
Suky 0:5d8d6a976b8b 5 \brief Este fichero contiene class para control de TouchScreen ADS7843
Suky 0:5d8d6a976b8b 6
Suky 0:5d8d6a976b8b 7 \web www.micros-designs.com.ar
Suky 0:5d8d6a976b8b 8 \date 16/01/11
Suky 0:5d8d6a976b8b 9
Suky 0:5d8d6a976b8b 10 *- Version Log --------------------------------------------------------------*
Suky 0:5d8d6a976b8b 11 * Fecha Autor Comentarios *
Suky 0:5d8d6a976b8b 12 *----------------------------------------------------------------------------*
Suky 0:5d8d6a976b8b 13 * 16/01/11 Suky Original *
Suky 0:5d8d6a976b8b 14 *----------------------------------------------------------------------------*
Suky 0:5d8d6a976b8b 15 ///////////////////////////////////////////////////////////////////////////
Suky 0:5d8d6a976b8b 16 //// ////
Suky 0:5d8d6a976b8b 17 //// ////
Suky 1:63a925e2a3d2 18 //// (C) Copyright 2011 www.micros-designs.com.ar ////
Suky 0:5d8d6a976b8b 19 //// Este código puede ser usado, modificado y distribuido libremente ////
Suky 0:5d8d6a976b8b 20 //// sin eliminar esta cabecera y sin garantía de ningún tipo. ////
Suky 0:5d8d6a976b8b 21 //// ////
Suky 0:5d8d6a976b8b 22 //// ////
Suky 0:5d8d6a976b8b 23 ///////////////////////////////////////////////////////////////////////////
Suky 0:5d8d6a976b8b 24 // **********************************************************************
Suky 0:5d8d6a976b8b 25 // ************************** EXAMPLE ***********************************
Suky 0:5d8d6a976b8b 26 // **********************************************************************
Suky 0:5d8d6a976b8b 27 #include "mbed.h"
Suky 0:5d8d6a976b8b 28 #include "Touch.h"
Suky 0:5d8d6a976b8b 29 // **********************************************************************
Suky 0:5d8d6a976b8b 30 #define TOUCH_X_MIN 30
Suky 0:5d8d6a976b8b 31 #define TOUCH_X_MAX 230
Suky 0:5d8d6a976b8b 32 #define TOUCH_Y_MIN 15
Suky 0:5d8d6a976b8b 33 #define TOUCH_Y_MAX 240
Suky 0:5d8d6a976b8b 34 // **********************************************************************
Suky 0:5d8d6a976b8b 35 DigitalOut Led1(LED1);
Suky 0:5d8d6a976b8b 36 DigitalOut Led2(LED2);
Suky 0:5d8d6a976b8b 37 // **********************************************************************
Suky 0:5d8d6a976b8b 38 TOUCH_DATA Coordenadas;
Suky 0:5d8d6a976b8b 39 volatile bool kbhit_irq=0;
Suky 0:5d8d6a976b8b 40
Suky 0:5d8d6a976b8b 41 TouchScreenADS7843 MyTouch(p9,p10,p11,p12,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ
Suky 0:5d8d6a976b8b 42 // **********************************************************************
Suky 0:5d8d6a976b8b 43 void vISRTouchIRQ(void){
Suky 0:5d8d6a976b8b 44 UINT_COORDxy Temp;
Suky 0:5d8d6a976b8b 45
Suky 0:5d8d6a976b8b 46 MyTouch.vTestTouchPanel(&Coordenadas);
Suky 0:5d8d6a976b8b 47 // Coordenadas dentro del rango de pantalla LCD:
Suky 0:5d8d6a976b8b 48 if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){
Suky 1:63a925e2a3d2 49 // Cambio de coordenada y escala:
Suky 1:63a925e2a3d2 50 Temp=Coordenadas.y;
Suky 1:63a925e2a3d2 51 Coordenadas.y=((float)((255-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN)));
Suky 1:63a925e2a3d2 52 Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN)));
Suky 1:63a925e2a3d2 53 kbhit_irq=1;
Suky 0:5d8d6a976b8b 54 }
Suky 0:5d8d6a976b8b 55 }
Suky 0:5d8d6a976b8b 56 // **********************************************************************
Suky 0:5d8d6a976b8b 57 int main(){
Suky 0:5d8d6a976b8b 58
Suky 0:5d8d6a976b8b 59 //MyTouch.vInitADS7843(USE_12BITS,NULL);
Suky 1:63a925e2a3d2 60 MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ);
Suky 0:5d8d6a976b8b 61
Suky 1:63a925e2a3d2 62 Led1=0;
Suky 1:63a925e2a3d2 63 Led2=0;
Suky 0:5d8d6a976b8b 64
Suky 1:63a925e2a3d2 65 while(1){
Suky 1:63a925e2a3d2 66 Led2=!Led2;
Suky 1:63a925e2a3d2 67 if(kbhit_irq==1){
Suky 1:63a925e2a3d2 68 kbhit_irq=0;
Suky 1:63a925e2a3d2 69 if((Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>250)){
Suky 1:63a925e2a3d2 70 Led1=!Led1;
Suky 1:63a925e2a3d2 71 }
Suky 1:63a925e2a3d2 72 }
Suky 1:63a925e2a3d2 73 wait_ms(300);
Suky 1:63a925e2a3d2 74 }
Suky 0:5d8d6a976b8b 75 }
Suky 0:5d8d6a976b8b 76 // **********************************************************************
Suky 0:5d8d6a976b8b 77 */
Suky 0:5d8d6a976b8b 78 #include "mbed.h"
Suky 0:5d8d6a976b8b 79 // **********************************************************************
Suky 1:63a925e2a3d2 80 #define USE_12BITS 12
Suky 1:63a925e2a3d2 81 #define USE_8BITS 8
Suky 1:63a925e2a3d2 82 #define ENABLE_INTERRUPT 1
Suky 1:63a925e2a3d2 83 #define DISABLE_INTERRUPT 0
Suky 0:5d8d6a976b8b 84 // **********************************************************************
Suky 1:63a925e2a3d2 85 typedef unsigned short UINT_COORDxy;
Suky 0:5d8d6a976b8b 86 typedef struct {
Suky 0:5d8d6a976b8b 87 UINT_COORDxy x;
Suky 0:5d8d6a976b8b 88 UINT_COORDxy y;
Suky 0:5d8d6a976b8b 89 }TOUCH_DATA;
Suky 0:5d8d6a976b8b 90 // **********************************************************************
Suky 0:5d8d6a976b8b 91 class TouchScreenADS7843 {
Suky 0:5d8d6a976b8b 92 public:
Suky 0:5d8d6a976b8b 93 TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ);
Suky 1:63a925e2a3d2 94 void vInitADS7843(unsigned char Bits,void (*fptr)(void));
Suky 1:63a925e2a3d2 95 void vSetResolution(unsigned char Bits);
Suky 1:63a925e2a3d2 96 void vTestTouchPanel(TOUCH_DATA *Data);
Suky 1:63a925e2a3d2 97 void vEnableSetInterrupt(void (*fptr)(void));
Suky 1:63a925e2a3d2 98 void vDisableInterrupt(void);
Suky 1:63a925e2a3d2 99 bool bReadPinIRQ(void);
Suky 0:5d8d6a976b8b 100 protected:
Suky 1:63a925e2a3d2 101 #define __delay_CLK_ADS7843() wait_us(1)
Suky 1:63a925e2a3d2 102 #define ADS7843_READ_X_8 0x98 // IRQ Enable
Suky 1:63a925e2a3d2 103 #define ADS7843_READ_Y_8 0xD8
Suky 1:63a925e2a3d2 104 #define ADS7843_READ_X_12 0x90 // IRQ Enable
Suky 1:63a925e2a3d2 105 #define ADS7843_READ_Y_12 0xD0
Suky 1:63a925e2a3d2 106 DigitalOut _PIN_SDI,_PIN_CS,_PIN_CLK;
Suky 1:63a925e2a3d2 107 DigitalIn _PIN_SDO,_PIN_IRQ;
Suky 0:5d8d6a976b8b 108 InterruptIn ADS7843_Event_Touch;
Suky 0:5d8d6a976b8b 109 unsigned char Resolution;
Suky 0:5d8d6a976b8b 110 virtual UINT_COORDxy ADS7843WriteAndReadData(unsigned char Data);
Suky 0:5d8d6a976b8b 111 };
Suky 0:5d8d6a976b8b 112 // **********************************************************************
Suky 0:5d8d6a976b8b 113 TouchScreenADS7843::TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ)
Suky 0:5d8d6a976b8b 114 : _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) {}
Suky 0:5d8d6a976b8b 115 // **********************************************************************
Suky 0:5d8d6a976b8b 116 void TouchScreenADS7843::vInitADS7843(unsigned char Bits,void (*fptr)(void)) {
Suky 0:5d8d6a976b8b 117
Suky 0:5d8d6a976b8b 118 _PIN_CS=1;
Suky 0:5d8d6a976b8b 119 _PIN_SDI=0;
Suky 0:5d8d6a976b8b 120 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 121 Resolution=Bits;
Suky 0:5d8d6a976b8b 122 if (fptr!=NULL) {
Suky 0:5d8d6a976b8b 123 ADS7843_Event_Touch.fall(fptr);
Suky 0:5d8d6a976b8b 124 }
Suky 0:5d8d6a976b8b 125 }
Suky 0:5d8d6a976b8b 126 // **********************************************************************
Suky 0:5d8d6a976b8b 127 void TouchScreenADS7843::vSetResolution(unsigned char Bits) {
Suky 0:5d8d6a976b8b 128 Resolution=Bits;
Suky 0:5d8d6a976b8b 129 }
Suky 0:5d8d6a976b8b 130 // **********************************************************************
Suky 0:5d8d6a976b8b 131 void TouchScreenADS7843::vEnableSetInterrupt(void (*fptr)(void)) {
Suky 0:5d8d6a976b8b 132 ADS7843_Event_Touch.fall(fptr);
Suky 0:5d8d6a976b8b 133 }
Suky 0:5d8d6a976b8b 134 // **********************************************************************
Suky 0:5d8d6a976b8b 135 void TouchScreenADS7843::vDisableInterrupt(void) {
Suky 0:5d8d6a976b8b 136 ADS7843_Event_Touch.fall(NULL);
Suky 0:5d8d6a976b8b 137 }
Suky 0:5d8d6a976b8b 138 // **********************************************************************
Suky 0:5d8d6a976b8b 139 bool TouchScreenADS7843::bReadPinIRQ(void) {
Suky 0:5d8d6a976b8b 140 return(_PIN_IRQ);
Suky 0:5d8d6a976b8b 141 }
Suky 0:5d8d6a976b8b 142 // **********************************************************************
Suky 0:5d8d6a976b8b 143 UINT_COORDxy TouchScreenADS7843::ADS7843WriteAndReadData(unsigned char Data) {
Suky 0:5d8d6a976b8b 144 unsigned char k;
Suky 0:5d8d6a976b8b 145 UINT_COORDxy Temp;
Suky 0:5d8d6a976b8b 146
Suky 0:5d8d6a976b8b 147 _PIN_CS=0;
Suky 0:5d8d6a976b8b 148 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 149 // En cada flanco ascendente se toma el dato:
Suky 0:5d8d6a976b8b 150 for (k=0;k<8;k++) {
Suky 0:5d8d6a976b8b 151 _PIN_SDI=!!(Data&0x80);
Suky 0:5d8d6a976b8b 152 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 153 _PIN_CLK=1;
Suky 0:5d8d6a976b8b 154 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 155 Data<<=1;
Suky 0:5d8d6a976b8b 156 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 157
Suky 0:5d8d6a976b8b 158 }
Suky 0:5d8d6a976b8b 159 __delay_CLK_ADS7843(); // Esperamos busy:
Suky 0:5d8d6a976b8b 160 _PIN_CLK=1;
Suky 0:5d8d6a976b8b 161 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 162 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 163 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 164 __delay_CLK_ADS7843(); // Esperamos busy:
Suky 0:5d8d6a976b8b 165
Suky 0:5d8d6a976b8b 166 // En flanco descendente leemos data desde el ADS7843:
Suky 0:5d8d6a976b8b 167 _PIN_CLK=1;
Suky 0:5d8d6a976b8b 168 Temp=0;
Suky 0:5d8d6a976b8b 169
Suky 0:5d8d6a976b8b 170 if (Resolution==8) {
Suky 0:5d8d6a976b8b 171 for (k=0;k<8;k++) {
Suky 0:5d8d6a976b8b 172 Temp<<=1;
Suky 0:5d8d6a976b8b 173 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 174 Temp+=_PIN_SDO;
Suky 0:5d8d6a976b8b 175 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 176 _PIN_CLK=1;
Suky 0:5d8d6a976b8b 177 }
Suky 0:5d8d6a976b8b 178 } else {
Suky 0:5d8d6a976b8b 179 for (k=0;k<12;k++) {
Suky 0:5d8d6a976b8b 180 Temp<<=1;
Suky 0:5d8d6a976b8b 181 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 182 Temp+=_PIN_SDO;
Suky 0:5d8d6a976b8b 183 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 184 _PIN_CLK=1;
Suky 0:5d8d6a976b8b 185 }
Suky 0:5d8d6a976b8b 186 }
Suky 0:5d8d6a976b8b 187 __delay_CLK_ADS7843();
Suky 0:5d8d6a976b8b 188 _PIN_CLK=0;
Suky 0:5d8d6a976b8b 189 _PIN_CS=1;
Suky 0:5d8d6a976b8b 190
Suky 0:5d8d6a976b8b 191 return(Temp);
Suky 0:5d8d6a976b8b 192 }
Suky 0:5d8d6a976b8b 193 // **********************************************************************
Suky 0:5d8d6a976b8b 194 void TouchScreenADS7843::vTestTouchPanel(TOUCH_DATA *Data) {
Suky 0:5d8d6a976b8b 195 unsigned short TempX,TempY;
Suky 0:5d8d6a976b8b 196 unsigned char k;
Suky 0:5d8d6a976b8b 197
Suky 0:5d8d6a976b8b 198 wait_ms(1);
Suky 0:5d8d6a976b8b 199
Suky 0:5d8d6a976b8b 200 TempX=0;
Suky 0:5d8d6a976b8b 201 TempY=0;
Suky 0:5d8d6a976b8b 202 for (k=0;k<8;k++) {
Suky 0:5d8d6a976b8b 203 if (Resolution==8) {
Suky 0:5d8d6a976b8b 204 TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_8);
Suky 0:5d8d6a976b8b 205 TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_8);
Suky 0:5d8d6a976b8b 206 } else {
Suky 0:5d8d6a976b8b 207 TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_12);
Suky 0:5d8d6a976b8b 208 TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_12);
Suky 0:5d8d6a976b8b 209 }
Suky 0:5d8d6a976b8b 210 }
Suky 0:5d8d6a976b8b 211
Suky 0:5d8d6a976b8b 212
Suky 0:5d8d6a976b8b 213 Data->x=(TempX>>3);
Suky 0:5d8d6a976b8b 214 Data->y=(TempY>>3);
Suky 0:5d8d6a976b8b 215
Suky 0:5d8d6a976b8b 216 return;
Suky 0:5d8d6a976b8b 217 }
Suky 0:5d8d6a976b8b 218 // **********************************************************************