Control TouchScreen ADS7843

Dependents:   Touch_Example Example_Menu_LCD_TFT

Touch.h

Committer:
Suky
Date:
2011-01-16
Revision:
0:5d8d6a976b8b
Child:
1:63a925e2a3d2

File content as of revision 0:5d8d6a976b8b:

/*
   \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;
}
// **********************************************************************