avr-lc7981/include/touch.c

95 lines
1.3 KiB
C

/*
* touch.c
*
* Created on: 29.05.2009
* Author: sebastian
*/
#include "touch.h"
/**
* This functions set 5V to X1 and GND to Y1,
* the voltage at X2 is measured via the ADC.
* If the ADC-Value is less then TOUCH_PRESSED_LEVEL,
* the function will return 1.
* \return 1 if pressed else 0
*/
uint8_t touch_is_pressed() {
TOUCH_DDR |= (1 << TOUCH_X1);
TOUCH_DDR |= (1 << TOUCH_Y1);
TOUCH_DDR &= ~(1 << TOUCH_X2);
TOUCH_PORT &= ~(1 << TOUCH_Y1);
TOUCH_PORT |= (1 << TOUCH_X1);
if(readADC(TOUCH_X2) < TOUCH_PRESSED_LEVEL) {
return 1;
}
else {
return 0;
}
}
/**
*
*
*/
int16_t touch_readX() {
int16_t pos;
if(touch_is_pressed()) {
TOUCH_DDR |= (1 << TOUCH_X1);
TOUCH_DDR |= (1 << TOUCH_X2);
TOUCH_DDR &= ~(1 << TOUCH_Y1);
TOUCH_DDR &= ~(1 << TOUCH_Y2);
TOUCH_PORT &= ~(1 << TOUCH_X1);
TOUCH_PORT |= (1 << TOUCH_X2);
_delay_us(10);
pos = (readADC(TOUCH_Y1) - 263) * 16 / 53;
return pos;
}
else {
return -1;
}
}
int16_t touch_readY() {
int16_t pos;
if(touch_is_pressed()) {
TOUCH_DDR |= (1 << TOUCH_Y1);
TOUCH_DDR |= (1 << TOUCH_Y2);
TOUCH_DDR &= ~(1 << TOUCH_X1);
TOUCH_DDR &= ~(1 << TOUCH_X2);
TOUCH_PORT |= (1 << TOUCH_Y1);
TOUCH_PORT &= ~(1 << TOUCH_Y2);
_delay_us(10);
pos = (readADC(TOUCH_X1) - 330) * 8 / 40;
return pos;
}
else {
return -1;
}
}