#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#use     delay(crystal = 20 MHz, RESTART_WDT)
#define LCD_RS_PIN               PIN_E0
#define LCD_RW_PIN               PIN_E1
#define LCD_ENABLE_PIN           PIN_E2
#define LCD_DATA4                PIN_D2
#define LCD_DATA5                PIN_D3
#define LCD_DATA6                PIN_D4
#define LCD_DATA7                PIN_D5
#include <lcd.c>
int andata1, andata2, tiempo = 250;
void rutina1 (void)
{
   set_adc_channel(0);
   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b00000001);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b00000011);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b00000111);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b00001111);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b00011111);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b00111111);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b01111111);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000010);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}
void rutina2 (void)
{
   set_adc_channel(0);
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b10000000);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b11000000);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b11100000);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b11110000);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b11111000);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b11111100);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b11111110);
   if(andata2 > 75 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b01000000);
   if(andata2 > 90)  output_d(0b11000000);   //prenden leds del puerto D porterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}
void rutina3 (void)
{
   set_adc_channel(0);
   
   if(andata1 <= 45) output_c(0b00000000);
   if(andata1 > 45 && andata1 <= 50)   output_c(0b10000000);
   if(andata1 > 50 && andata1 <= 55)   output_c(0b11000000);
   if(andata1 > 55 && andata1 <= 60)   output_c(0b11100000);
   if(andata1 > 60 && andata1 <= 65)   output_c(0b11110000);
   if(andata1 > 65 && andata1 <= 70)   output_c(0b11111000);
   if(andata1 > 70 && andata1 <= 75)   output_c(0b11111100);
   if(andata1 > 75 && andata1 <= 80)   output_c(0b11111110);
   if(andata1 > 80 && andata1 <= 85)   output_c(0b11111111);
   if(andata1 > 85 && andata1 <= 90)   output_d(0b00000001);
   if(andata1 > 90)  output_d(0b00000011);
   
   set_adc_channel(3);
   andata1 = read_adc();
   output_c(0);
   output_d(0);
}
void rutina4 (void)
{  set_adc_channel(0);
   if(andata2 <= 45) output_b(0b00000000);
   if(andata2 > 45 && andata1 <= 50)   output_b(0b00000001);
   if(andata2 > 50 && andata1 <= 55)   output_b(0b00000011);
   if(andata2 > 55 && andata1 <= 60)   output_b(0b00000111);
   if(andata2 > 60 && andata1 <= 65)   output_b(0b00001111);
   if(andata2 > 65 && andata1 <= 70)   output_b(0b00011111);
   if(andata2 > 70 && andata1 <= 75)   output_b(0b00111111);
   if(andata2 > 75 && andata1 <= 80)   output_b(0b01111111);
   if(andata2 > 80 && andata1 <= 85)   output_b(0b11111111);
   if(andata2 > 85 && andata1 <= 90)   output_d(0b01000000);
   if(andata2 > 90)  output_d(0b11000000);   //prenden leds del puerto D posterior al puerto C
   
   set_adc_channel(1);
   andata2 = read_adc();
   output_b(0);
   output_d(0);
}
void rutina5 (void)
{
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001) && output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000);
         output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         output_c(0b10000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000) && output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b10000000);
         ;output_c(0b10000000);  //vuelta
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b01000000) && output_c(0b01000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00100000);
         output_c(0b00100000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00010000);
         output_c(0b00010000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00001000);
         output_c(0b00001000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000100);
         output_c(0b00000100);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000010);
         output_c(0b00000010);
         delay_ms(tiempo);
      }
      if (input(pin_A4)==1 && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000001);
         output_c(0b00000001);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b00000000);
         output_c(0b00000000);
         delay_ms(tiempo);
      }
      if (input(pin_A4) && !input(pin_A5) && !input(pin_A2))
      {
         output_b(0b11111111);
         output_c(0b11111111);
         delay_ms(tiempo);
      }
      
}
void main (void)
{
   lcd_init();
   
   int i;
   
   int8 tiempo2 = 5;
   int8 dato = 0;
   set_tris_a(0b00111111);
   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0);
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   
   output_b(0);
   output_c(0);
   output_d(0);
   
 for(;;){ 
 if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4)) 
 
   while(true)
   {
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         while(dato<1)
         {
            if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
            {
               lcd_gotoxy(1,1);
               printf(LCD_PUTC, "\fCARGANDO ARCHIVO");
               for (i=1;i<=16;++i)
               {
                  lcd_gotoxy(i,2);
                  printf(LCD_PUTC, "*");
                  delay_ms( 5 );
               }
            }
            dato ++;
            printf(LCD_PUTC, "\f");
         }
      }
     
      if (!input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"SECCION 0");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MOVER PERILLA");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
      {
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"SECCION 1");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 1");
         delay_ms(tiempo2);
      }
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina1();
      
      if (input(pin_A2) && !input(pin_A5) && !input(pin_A4))
         rutina2();
      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina3();
      
      if (input(pin_A5) && !input(pin_A4) && !input(pin_A2))
         rutina4();
         
      if (!input(pin_A2) && !input(pin_A5) && input(pin_A4))
         rutina5();
      
      if (!input(pin_A2) && input(pin_A5) && !input(pin_A4))
      {  
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 2");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"VUMETRO 2 ");
         delay_ms(tiempo2);
      }
      
      if (!input(pin_A2) && !input(pin_A5) && input(pin_A4))
      {  
         printf(LCD_PUTC, "\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc,"\fSECCION 3");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"JUEGO DE LUCES");
         delay_ms(tiempo2);
      }
      
      
   }
}  
}