Control TouchScreen ADS7843
Fork of TouchADS7843 by
Touch.h@1:63a925e2a3d2, 2011-02-04 (annotated)
- Committer:
- Suky
- Date:
- Fri Feb 04 03:00:35 2011 +0000
- Revision:
- 1:63a925e2a3d2
- Parent:
- 0:5d8d6a976b8b
- Child:
- 2:32aa42301c90
Who changed what in which revision?
User | Revision | Line number | New 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 | // ********************************************************************** |