#include #include "touch.h" #include "sed1335.h" #define TOUCH_enable 0 #define TOUCH_disable 1 #define SPI_WRITE(a) (SPDR = a) #define SPI_CS(a) ((a==1)?(PORTB |=0x10):(PORTB &= ~0x10)) #define SPI_BUSY ((SPSR & 0x80) == 0) #define DCLK(a) ((a==1)?(PORTB|=_BV(7)):(PORTB&=(~_BV(7)))) #define DOUT(a) ((a==1)?(PORTB|=_BV(6)):(PORTB&=(~_BV(6)))) #define DIN (PINB&0b00100000) #define X 0b11011000 #define Y 0b10011000 #define TOUCH_INT_DIR DDRD #define TOUCH_PEN1(a) ((a==1)?(PORTD|=_BV(3)):(PORTD&=(~_BV(3)))) //#define TOUCH_DOWN (0b0000000100 - (PIND&0b00000100)) void TOUCH_init (void) { //initialize PORT for SPI DDRB = 0b10110000; PORTB = 0x00; //SPI enable, MSB first, master mode, SCK low when idle, sample on leading edge, CLK = f/16=1Mhz SPCR = 0b01010010; //Clear interrupt flag, clear collision flag, single speed operation SPSR = 0x00; // set up external interrupt on PD2 (0) TOUCH_INT_DIR = 0b11111000; TOUCH_PEN1(1); } unsigned char TOUCH_get (unsigned char axis) { unsigned int data; SPI_CS(TOUCH_enable); SPI_WRITE(axis); while(SPI_BUSY); SPI_WRITE(0x00); while(SPI_BUSY); return (SPDR << 1); } struct Point TOUCH_coord; struct Point* TOUCH_get_coord () { unsigned char i; TOUCH_PEN1(0); TOUCH_coord.x = TOUCH_get(X); if (TOUCH_coord.x == 0) // no touch, return out of bounds { TOUCH_coord.x = OOB; TOUCH_coord.y = OOB; return &TOUCH_coord; } // get y coord TOUCH_coord.y = TOUCH_get(Y); TOUCH_PEN1(1); // get 7 more values and average for (i=0; i<7; i++) { TOUCH_PEN1(0); TOUCH_coord.x += TOUCH_get(X); TOUCH_coord.y += TOUCH_get(Y); TOUCH_PEN1(1); } // average the values (div by 8) TOUCH_coord.x = TOUCH_coord.x >> 3; TOUCH_coord.y = TOUCH_coord.y >> 3; //return &coord; // scale coordinates to the screen if ( (TOUCH_coord.x >= 12) && (TOUCH_coord.x <= 222) ) { TOUCH_coord.x = (unsigned short)((float)(TOUCH_coord.x - 12) * 1.52); } else { TOUCH_coord.x = OOB; // out of bounds } if ( (TOUCH_coord.y >= 12) && (TOUCH_coord.y < 240) ) { TOUCH_coord.y = (unsigned short)(240 - ((float)(TOUCH_coord.y - 12) * 1.12)); } else { TOUCH_coord.y = OOB; } return &TOUCH_coord; }