Control TouchScreen ADS7843
Dependents: Touch_Example Example_Menu_LCD_TFT
Revision 0:5d8d6a976b8b, committed 2011-01-16
- Comitter:
- Suky
- Date:
- Sun Jan 16 14:08:38 2011 +0000
- Child:
- 1:63a925e2a3d2
- Commit message:
- 1.0
Changed in this revision
| Touch.h | Show annotated file Show diff for this revision Revisions of this file |
--- /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;
+}
+// **********************************************************************
Ale C.-