#include #include #include #include "config.h" #ifdef HAS_GRAPHIC_LCD #include "touch.h" #include "portbits.h" #define TOUCH_PORT_X0 PORTF_0 #define TOUCH_PORT_X1 PORTF_1 #define TOUCH_PORT_Y0 PORTF_3 #define TOUCH_PORT_Y1 PORTF_2 #define TOUCH_DDR_X0 DDRF_0 #define TOUCH_DDR_X1 DDRF_1 #define TOUCH_DDR_Y0 DDRF_3 #define TOUCH_DDR_Y1 DDRF_2 #define TOUCH_CHAN_X0 0 #define TOUCH_CHAN_X1 1 #define TOUCH_CHAN_Y0 3 #define TOUCH_CHAN_Y1 2 #define DELAY_TOUCH 100 // calibration #define XLO 12 #define XHI 115 #define YLO 16 #define YHI 115 /** * ADC initialisieren **/ void touch_init(void) { ADMUX = (1 << REFS0); ADCSRA = (1 <> 3; } /** * prüft ob der Touch berührt wird. Unmittelbar danach muss X und Y Wert ausgelesen werden * @return 0 wenn nicht berührt, > 0 wenn berührt (je höher der Druck um so größer der Wert) **/ unsigned int touched(void) { // X-plane auf Masse legen TOUCH_DDR_X0 = 1; TOUCH_DDR_X1 = 1; TOUCH_PORT_X0 = 0; TOUCH_PORT_X1 = 0; // Y-Plane mit Pullup auf + TOUCH_DDR_Y0 = 0; TOUCH_DDR_Y1 = 0; TOUCH_PORT_Y0 = 1; TOUCH_PORT_Y1 = 1; _delay_us(DELAY_TOUCH); return ADCReadChannel(TOUCH_CHAN_Y0) + ADCReadChannel(TOUCH_CHAN_Y1); } /** * Touch abfragen * @return den X Wert in Pixeln **/ unsigned int touch_x(void) { int x; // X-Plane auf - .. + legen TOUCH_DDR_X0 = 1; TOUCH_DDR_X1 = 1; TOUCH_PORT_X0 = 0; TOUCH_PORT_X1 = 1; // y-plane hochohmig TOUCH_DDR_Y0 = 0; TOUCH_DDR_Y1 = 0; TOUCH_PORT_Y0 = 0; TOUCH_PORT_Y1 = 0; _delay_us(DELAY_TOUCH); x = (ADCReadChannel(TOUCH_CHAN_Y0) + ADCReadChannel(TOUCH_CHAN_Y1)) >> 1; if (x < XLO) x = XLO; if (x > XHI) x = XHI; return (x - XLO) * 160 / (XHI - XLO); } /** * Touch abfragen * @return den Y Wert in Pixeln **/ unsigned int touch_y(void) { int y; // Y-Plane auf - .. + legen TOUCH_DDR_Y0 = 1; TOUCH_DDR_Y1 = 1; TOUCH_PORT_Y0 = 0; TOUCH_PORT_Y1 = 1; // y-plane hochohmig TOUCH_DDR_X0 = 0; TOUCH_DDR_X1 = 0; TOUCH_PORT_X0 = 0; TOUCH_PORT_X1 = 0; _delay_us(DELAY_TOUCH); y = (ADCReadChannel(TOUCH_CHAN_X0) + ADCReadChannel(TOUCH_CHAN_X1)) >> 1; if (y < YLO) y = YLO; if (y > YHI) y = YHI; return (y - YLO)*80 / (YHI - YLO); } #endif