#include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT  LP, HS, RC, WDT,PROTECT,NOPUT , NOBROWNOUT
#use delay(clock=4000000)  
#use standard_io (A,B)

#define bus PIN_B7               //nombra bus al pinb7
#define presencia PIN_A0
#define error_ini PIN_A1
#define fin_conv PIN_A2
#define uno PIN_B6
#define cero PIN_B5

//DECLARO FUNCIONES
void reset (void);
void saltar_rom(void);
void convertir_ad(void);
void leer_reg(void);
void leo_temp(void);


//DEFINO FUNCIONES
void reset (void)
{ 
int pres=1, band=1;
   do
   {
      set_tris_b(0b01111111);//puerto B7 como salida
      output_low(bus);
      delay_us(485);
      set_tris_b(0b11111111);//puerto B7 como entrada
      delay_us(60);
   
      while (band==1)
         {
         pres=input(bus);
         if (pres==0)
         {
         set_tris_a(0x00);             //todas como salida puertos A
         output_high(presencia);       //led verde
         delay_ms(500);
         output_low(presencia);
         band=0;                       //esta lista la inicializacion
         }
         else
         { 
         set_tris_a(0x00);
         output_high(error_ini);       //led rojo
         delay_ms(500);
         output_low(error_ini);
         band=1;
         }
         }
   } while(band==1);
   
}
void saltar_rom (void)
{
int aux=0;int8 comando=0xCC;
   
for (aux=0;aux<8;++aux)
  {
      if (bit_test(comando,0)==0)    // escribo cero
      { 
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_low(bus);
      delay_us(100);
      set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(3);                  //recuperacion del bus
      shift_right(&comando,1,0);    //voy corriendo a la derecha e inserto cero
      
      }else{
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_low(bus);
      delay_us(10);
      output_high(bus);             //escribo el uno
      delay_us(50);
      set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(3);                  //recuperacion del bus
      shift_right(&comando,1,0);    //voy corriendo a la derecha e inserto cero
      }
  }
}
void convertir_ad(void)
{
   int aux=0,band_conv=1,pulso=0;int8 comando=0x44;
   
for (aux=0;aux<8;++aux)
  {
      if (bit_test(comando,aux)==0)    // escribo cero
      {
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_low(bus);
      delay_us(100);
      set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(3);                  //recuperacion del bus
     
      
      }else{
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_low(bus);
      delay_us(10);
      output_high(bus);             //escribo el uno
      delay_us(50);
      set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(3);                  //recuperacion del bus
      }
      }
      set_tris_b(0b01111111);       //pongo bus como salida
      output_low(bus);
      delay_us(10);
      set_tris_b(0b11111111);       //pongo bus como entrada
      set_tris_a(0b000000);
      output_high(PIN_A5);
   do
      {
      delay_us(1);
      pulso=input(bus);             //leo
      if(pulso==1){
         band_conv=0;
         output_high(fin_conv);
         delay_ms(500);             //fin conversion LED de Ok
         output_low(fin_conv);
         delay_ms(100);
         pulso=0;
         output_low(PIN_A5);        //apaga LED de espera de conversion
         }
      }while (band_conv==1);
      delay_us(2);
}
void leer_reg(void)
{
int aux=0;int8 comando=0xBE;
   
for (aux=0;aux<8;++aux)
  {
      if (bit_test(comando,aux)==0)    // escribo cero
      { 
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_low(bus);
      delay_us(100);
      output_float(bus);            //set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(2);                  //recuperacion del bus
      
      
      }else{
      set_tris_b(0b01111111);       //puerto B7 como salida
      output_float(bus);
      delay_us(10);
      output_high(bus);             //escribo el uno
      delay_us(50);
      output_float(bus);            //set_tris_b(0b11111111);       //puerto B7 como entrada
      delay_us(2);                  //recuperacion del bus
    
      }
  }
}
void leo_temp(void)
{
int tempe[16];
int aux=0;                      //g=0;

   for(aux=0;aux<16;++aux)
   {
   set_tris_b(0b01111111);             //lo pongo como salida
   output_low(bus);              
   delay_us(2);
   output_float(bus);
   delay_us(12); 
   //set_tris_b(0b11111111);
                       //dejo q se acomode el micro
   tempe[aux]=input(bus);
   //g=input(bus);
   //shift_right(tempe,2,g);     // muevo hacia la der y le inserto dato
   delay_us(60);
   }
   reset();
   
  // ahora  muestro lo que tiene en binario
   for(aux=0;aux<16;++aux)
   {
      set_tris_b(0b10011111);
      if(bit_test(tempe,aux)==0)
      {
      output_high(cero);
      delay_ms(1000);
      output_low(cero);
      delay_ms(500);
      }
      if(bit_test(tempe,aux)==1)
      {
      output_high(uno);
      delay_ms(1000);
      output_low(uno);
      delay_ms(500);
      }
   }
}   

void main (void)
{
                                       //int8 tempe_bin=0;
   do{
         reset();
         delay_us(2);
         saltar_rom ();
         delay_us(2);
         convertir_ad();
         //delay_ms(500);
         
         reset();
         delay_us(2);
         saltar_rom();
         delay_us(2);
         leer_reg();       //"te voy a leer la temperatura"
 
         leo_temp();       //leo la temperatura
         delay_ms(5000);
   }while(true);
}    
