Control TouchScreen ADS7843
Dependents: Touch_Example Example_Menu_LCD_TFT
Diff: Touch.h
- Revision:
- 0:5d8d6a976b8b
- Child:
- 1:63a925e2a3d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Touch.h Sun Jan 16 14:08:38 2011 +0000 @@ -0,0 +1,218 @@ +/* + \file Touch.h + \version: 1.0 + + \brief Este fichero contiene class para control de TouchScreen ADS7843 + + \web www.micros-designs.com.ar + \date 16/01/11 + + *- Version Log --------------------------------------------------------------* + * Fecha Autor Comentarios * + *----------------------------------------------------------------------------* + * 16/01/11 Suky Original * + *----------------------------------------------------------------------------* +/////////////////////////////////////////////////////////////////////////// +//// //// +//// //// +//// (C) Copyright 201 www.micros-designs.com.ar //// +//// Este código puede ser usado, modificado y distribuido libremente //// +//// sin eliminar esta cabecera y sin garantía de ningún tipo. //// +//// //// +//// //// +/////////////////////////////////////////////////////////////////////////// +// ********************************************************************** +// ************************** EXAMPLE *********************************** +// ********************************************************************** +#include "mbed.h" +#include "Touch.h" +// ********************************************************************** +#define TOUCH_X_MIN 30 +#define TOUCH_X_MAX 230 +#define TOUCH_Y_MIN 15 +#define TOUCH_Y_MAX 240 +// ********************************************************************** +DigitalOut Led1(LED1); +DigitalOut Led2(LED2); +// ********************************************************************** +TOUCH_DATA Coordenadas; +volatile bool kbhit_irq=0; + +TouchScreenADS7843 MyTouch(p9,p10,p11,p12,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ +// ********************************************************************** +void vISRTouchIRQ(void){ + UINT_COORDxy Temp; + + MyTouch.vTestTouchPanel(&Coordenadas); + // Coordenadas dentro del rango de pantalla LCD: + if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){ + // Cambio de coordenada y escala: + Temp=Coordenadas.y; + Coordenadas.y=((float)((255-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN))); + Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN))); + kbhit_irq=1; + } +} +// ********************************************************************** +int main(){ + + //MyTouch.vInitADS7843(USE_12BITS,NULL); + MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ); + + Led1=0; + Led2=0; + + while(1){ + Led2=!Led2; + if(kbhit_irq==1){ + kbhit_irq=0; + if((Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>250)){ + Led1=!Led1; + } + } + wait_ms(300); + } +} +// ********************************************************************** +*/ +#include "mbed.h" +// ********************************************************************** +#define USE_12BITS 12 +#define USE_8BITS 8 +#define ENABLE_INTERRUPT 1 +#define DISABLE_INTERRUPT 0 +// ********************************************************************** +typedef unsigned short UINT_COORDxy; +typedef struct { + UINT_COORDxy x; + UINT_COORDxy y; +}TOUCH_DATA; +// ********************************************************************** +class TouchScreenADS7843 { +public: + TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ); + virtual void vInitADS7843(unsigned char Bits,void (*fptr)(void)); + virtual void vSetResolution(unsigned char Bits); + virtual void vTestTouchPanel(TOUCH_DATA *Data); + virtual void vEnableSetInterrupt(void (*fptr)(void)); + virtual void vDisableInterrupt(void); + virtual bool bReadPinIRQ(void); +protected: +#define __delay_CLK_ADS7843() wait_us(1) +#define ADS7843_READ_X_8 0x98 // IRQ Enable +#define ADS7843_READ_Y_8 0xD8 +#define ADS7843_READ_X_12 0x90 // IRQ Enable +#define ADS7843_READ_Y_12 0xD0 + DigitalOut _PIN_SDI,_PIN_CS,_PIN_CLK; + DigitalIn _PIN_SDO,_PIN_IRQ; + InterruptIn ADS7843_Event_Touch; + unsigned char Resolution; + virtual UINT_COORDxy ADS7843WriteAndReadData(unsigned char Data); +}; +// ********************************************************************** +TouchScreenADS7843::TouchScreenADS7843(PinName PIN_SDO,PinName PIN_SDI,PinName PIN_CLK,PinName PIN_CS,PinName PIN_IRQ) + : _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) {} +// ********************************************************************** +void TouchScreenADS7843::vInitADS7843(unsigned char Bits,void (*fptr)(void)) { + + _PIN_CS=1; + _PIN_SDI=0; + _PIN_CLK=0; + Resolution=Bits; + if (fptr!=NULL) { + ADS7843_Event_Touch.fall(fptr); + } +} +// ********************************************************************** +void TouchScreenADS7843::vSetResolution(unsigned char Bits) { + Resolution=Bits; +} +// ********************************************************************** +void TouchScreenADS7843::vEnableSetInterrupt(void (*fptr)(void)) { + ADS7843_Event_Touch.fall(fptr); +} +// ********************************************************************** +void TouchScreenADS7843::vDisableInterrupt(void) { + ADS7843_Event_Touch.fall(NULL); +} +// ********************************************************************** +bool TouchScreenADS7843::bReadPinIRQ(void) { + return(_PIN_IRQ); +} +// ********************************************************************** +UINT_COORDxy TouchScreenADS7843::ADS7843WriteAndReadData(unsigned char Data) { + unsigned char k; + UINT_COORDxy Temp; + + _PIN_CS=0; + __delay_CLK_ADS7843(); + // En cada flanco ascendente se toma el dato: + for (k=0;k<8;k++) { + _PIN_SDI=!!(Data&0x80); + __delay_CLK_ADS7843(); + _PIN_CLK=1; + __delay_CLK_ADS7843(); + Data<<=1; + _PIN_CLK=0; + + } + __delay_CLK_ADS7843(); // Esperamos busy: + _PIN_CLK=1; + __delay_CLK_ADS7843(); + _PIN_CLK=0; + __delay_CLK_ADS7843(); + __delay_CLK_ADS7843(); // Esperamos busy: + + // En flanco descendente leemos data desde el ADS7843: + _PIN_CLK=1; + Temp=0; + + if (Resolution==8) { + for (k=0;k<8;k++) { + Temp<<=1; + _PIN_CLK=0; + Temp+=_PIN_SDO; + __delay_CLK_ADS7843(); + _PIN_CLK=1; + } + } else { + for (k=0;k<12;k++) { + Temp<<=1; + _PIN_CLK=0; + Temp+=_PIN_SDO; + __delay_CLK_ADS7843(); + _PIN_CLK=1; + } + } + __delay_CLK_ADS7843(); + _PIN_CLK=0; + _PIN_CS=1; + + return(Temp); +} +// ********************************************************************** +void TouchScreenADS7843::vTestTouchPanel(TOUCH_DATA *Data) { + unsigned short TempX,TempY; + unsigned char k; + + wait_ms(1); + + TempX=0; + TempY=0; + for (k=0;k<8;k++) { + if (Resolution==8) { + TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_8); + TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_8); + } else { + TempX+=ADS7843WriteAndReadData(ADS7843_READ_X_12); + TempY+=ADS7843WriteAndReadData(ADS7843_READ_Y_12); + } + } + + + Data->x=(TempX>>3); + Data->y=(TempY>>3); + + return; +} +// **********************************************************************