#include <18f4620.h>
#device adc=10
#fuses XT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOPROTECT
#use delay(clock = 4000000)
#use fast_io(A)
#use standard_io (B)
#use standard_io (C)
#use standard_io (D)
#use standard_io (E)
#define Tx PIN_C6
#define Rx PIN_C7
#use rs232(baud = 9600, xmit = Tx, rcv = Rx)
#include "HDM64GS12.c"
#include "graphics.c"
/*****************************************************************
** Conexion del touchscreen resistivo de 4 hilos
** X+ = RA0/AN0
** Y+ = RA1/AN1
** X- = RA2/AN2
** Y- = RA3/AN3
*****************************************************************/
int16 tmp;
int16 txx,tyy;
int16 y_min,y_max,x_min,x_max;
int16 y_rng,x_rng;
int y_loc,x_loc;
/**************************************************
******* Lee la coordenada y ********************
**************************************************/
int16 y_pos(void)
{
int16 result;
set_tris_a(0x0A); //Seteo AN1 y AN3 como entradas
output_a(0x01); //Energizo X, RA0
set_adc_channel(1); //Seteo AN1 como canal analogo
delay_us(10);
result = read_adc(); //Adquiero Y
set_tris_a(0x03); //RA0 y RA1 ADC a masa
output_a(0x00); //todos a masa
Return(result);
}
/**************************************************
******* Lee la coordenada x ********************
**************************************************/
int16 x_pos(void)
{
int16 result;
set_tris_a(0x05); //Seteo AN0 y AN2 como entrada
output_a(0x02); //Energizo Y, RA1
set_adc_channel(0); //Seteo AN0 como canal analogo
delay_us(10);
result = read_adc(); //adquiero X
set_tris_a(0x03); //RA0 y RA1 ADC a masa
output_a(0x00); //todas a masa
Return(result);
}
int1 touch(void)
{
int1 resp;
resp=false;
tyy = y_pos();
if (tyy > 50)
{
delay_ms(30);
tyy=y_pos();
txx=x_pos();
if (tyy > y_min)
{
if(tyy < y_max)
{
resp = true;
tmp=(txx-x_min)*16;
x_loc=(int)(tmp/(x_rng/8));
x_loc=127-x_loc;
if(x_loc > 127)
x_loc = 127;
tmp=(tyy-y_min)*8;
y_loc=(int)(tmp/(y_rng/8));
if(y_loc > 63)
y_loc = 63;
}
}
}
return(resp);
}
void calibracion()
{
while(x_pos() < 50)
{
glcd_rect(125,1,127,3,YES,ON);
delay_ms(100);
}
delay_ms(30);
y_min = y_pos();
x_min = x_pos();
while(x_pos() > 50);
glcd_fillscreen(OFF);
delay_ms(30);
while(x_pos() < 50)
{
glcd_rect(1,61,3,63,YES,ON);
delay_ms(100);
}
delay_ms(30);
y_max = y_pos();
x_max = x_pos();
y_rng = y_max - y_min;
x_rng = x_max - x_min;
while(x_pos() > 50);
glcd_fillScreen(OFF);
delay_ms(30);
}
void main()
{
setup_adc_ports(AN0_TO_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(50);
glcd_fillScreen(OFF);
calibracion();
while(TRUE)
{
if(touch()==true)
{
delay_ms(10);
glcd_pixel(x_loc, y_loc,ON);
}
}
}
te dejo un pdf de un entrenador que usa un circuito con transistores: http://www.mikroe.com/pdf/easypic5/easypic5_manual_v101.pdf
espero que te sirva de algo. (tengo una vaga idea de que droky me comentó que modificara el circuito porque tenía algún problema... )
Pues los pines +X, -X, +Y y -Y se conectan directamente a 4 pines del micro, que los polariza por pares dejando el otro par en alta impedancia para poder medir la resistencia leída mediante el ADC.
Lo que yo no he conseguido es hacer la polarización de los pines con los mismos pines que la lectura del ADC, mientras que Gera sí lo consigue.