//Joystick de play 2 inalambrico casero para uso general, programa del joystick

#include <16F818.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A6,rcv=PIN_A7,bits=8)

#include "G:\marcos\productos\Joystick Inalambrico\Joystick\kbd_lib.c" //esta
//libreria es la de el teclado matricial 4x4 que la uso para ahorrarme pines

#define tri dato[0]
#define cuad dato[1]
#define circ dato[2]
#define ex dato[3]
#define up dato[4]
#define down dato[5]
#define left dato[6]
#define right dato[7]
#define sel dato[8]
#define strt dato[9]
#define l1 dato[10]
#define l2 dato[11]
#define r1 dato[12]
#define r2 dato[13]
#define l3 dato[14]
#define r3 dato[15]
#define analog0on dato[16]
#define analog0off dato[17]
#define analog1on dato[18]
#define analog1off dato[19]

int c,i;
char dato[21];

void todo_cero(){
 analog0on=0;
 analog0off=0;
 analog1on=0;
 analog1off=0;
 tri=0;
 cuad=0;
 circ=0;
 ex=0;
 up=0;
 down=0;
 left=0;
 right=0;
 l1=0;
 l2=0;
 r1=0;
 r2=0;
 sel=0;
 strt=0;
 l3=0;
 r3=0;
}

void que_boton()
{
c=kbd_getc();
switch(c){
 case '1':
 up=1;
 break;
 case '2':
 down=1;
 break;
 case '3':
 left=1;
 break;
 case 'A':
 right=1;
 break;
 case '4':
 tri=1;
 break;
 case '5':
 cuad=1;
 break;
 case '6':
 circ=1;
 break;
 case 'B':
 ex=1;
 break;
 case '7':
 l1=1;
 break;
 case '8':
 l2=1;
 break;
 case '9':
 r1=1;
 break;
 case 'C':
 r2=1;
 break;
 case '*':
 sel=1;
 break;
 case '0':
 strt=1;
 break;
 case '#':
 l3=1;
 break;
 case 'D':
 r3=1;
 break;
 default:
 todo_cero();
 break;
}
}



void main()
{

   setup_adc_ports(AN0_AN1_VSS_VREF);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);

 {
 inicio:
 output_high(pin_a4);    //encender led
 delay_us(100);
 kbd_init();             //inicia los parametros para los botones
 delay_us(100);
 que_boton();            //lee que boton se esta presionando
 delay_us(100);
  set_adc_channel(0);    //lee el puerto analogo AN0
  delay_us(100);
  c=read_adc();          //vuelca el valor de AN0 a la variable c
  delay_us(100);
  if (c<=80){            //si c es menor a 80 el analogo se
   analog0off=1;         //esta presionando hacia abajo
   delay_us(100);
   analog0on=0;}   
  if ((c>80)&&(c<180)){  //si el valor es intermedio el analogo no
   analog0off=0;         //se esta accionando
   delay_us(100);
   //output_high(pin_a7);    //esto lo habia puesto para probar si el
   //delay_us(100);          //conversor adc estaba funcionando bien
   analog0on=0;
   delay_us(100);}
  if(c>=180){            //si c es mayor a 180 el analogo se
   analog0off=0;         //esta presionando hacia arriba
   delay_us(100);
   analog0on=1;
   delay_us(100);}
  set_adc_channel(1);    //lee el puerto analogo AN1
  delay_us(100);
  c=read_adc();          //vuelca el valor de AN0 a la variable c
  delay_us(100);
  if (c<=80){            //si c es menor a 80 el analogo se
   analog1off=1;         //esta presionando hacia abajo
   delay_us(100);
   analog1on=0;
   delay_us(100);}
  if ((c>80)&&(c<180)){  //si el valor es intermedio el analogo no
   analog1off=0;         //se esta accionando
   delay_us(100);
   analog1on=0;
   delay_us(100);}
  if(c>=180){            //si c es mayor a 180 el analogo se
   analog1off=0;         //esta presionando hacia arriba
   delay_us(100);
   analog1on=1;
   delay_us(100);}
 for (i=1;i<=3;++i){     //envia tres veces la cadena dato
  puts(dato);
  delay_us(10);}
 goto inicio;
 }
}
