                  LIST      P=16F876A
                           INCLUDE <P16F876A.INC>
     
     
     CBLOCK       0X20
     Colun_1        
     Colun_2
     Colun_3
     Colun_4
     Colun_5
     Colun_6
     Colun_7
     Colun_8
     Conta_Barrido_Config
     Caracter
     Conta_Encendidos                 
     Conta_1
     Conta_2
     Conta_3
     Conta_4
     COLUN
     RX_DATO
     DATO_HIT
     DATO_LOW
     Numero_DIG
     Contador
     R_ContA
     R_ContB
     I2C_ContadorBits
     I2C_Dato
     I2C_Flags
     Anho
     Mes
     Dia
     DiaSemana
     Hora
     Minuto
     Segundo
     Bus1Linea_Dato
     Bus1Linea_ContadorBits
     DS1820_Temperatura
     DS1820_TemperaturaSigno
     DS1820_TemperaturaDecimal
     FlagsAjuste
     Auxiliar
     ApuntaCaracter
     ValorCaracter
     Guarda_W
     Guarda_STATUS
     Guarda_Auxiliar
     Guarda_PCLATH
     Conta_Segundos
     CONTA_PRUEBA                    
     ENDC
DecenasHoras_Base                 EQU    0XA0
UnidadesHoras_Base                EQU    0XA8
DosPuntosHoras_Base               EQU    0XB0
DecenasMinutos_Base               EQU    0XB8
UnidadesMinutos_Base              EQU    0XC0
DosPuntosMinutos_Base             EQU    0XC8
DecenasSegundos_Base              EQU    0XD0
UnidadesSegundos_Base             EQU    0XD8
DS1307_DireccionEscritura         EQU    0XD0
DS1307_DireccionLectura           EQU    0XD1
DS1820_Skip_ROM_Command           EQU    0XCC
DS1820_Read_Scratchpad_Command    EQU    0XBE
DS1820_Convert_T_Command          EQU    0X44
     #DEFINE       I2C_UltimoByteLeer  I2C_Flags,0
     #DEFINE       SCL                  PORTA,3
     #DEFINE       SDA                  PORTA,4
     #DEFINE       Bus1Linea            PORTB,3
     #DEFINE       ModoPulsador         PORTB,4
     #DEFINE       IncrementarPulsador  PORTB,5
     #DEFINE       OndaCuadrada_DS1307  PORTB,0
     #DEFINE       F_AjusteAnho         FlagsAjuste,5
     #DEFINE       F_AjusteMes          FlagsAjuste,4
     #DEFINE       F_AjusteDia          FlagsAjuste,3
     #DEFINE       F_AjusteDiaSemana    FlagsAjuste,2
     #DEFINE       F_AjusteHora         FlagsAjuste,1
     #DEFINE       F_AjusteMinuto       FlagsAjuste,0
     
             
  ;**************************************************************************
  ;*********PROGRAMA*********************************************************
  
         ORG       0X0000
         goto      INICIO
         ORG       0X0004
         goto      ServicioInterrupcion        
Mensajes
         addwf     PCL,F
MensajeLunes
         DT"LUNES",0X00
MensajeMartes
         DT"MARTES",0X00
MensajeMiercoles
         DT"MIERCOLES",0X00
MensajeJueves
         DT"JUEVES",0X00
MensajeViernes
         DT"VIERNES",0X00
MensajeSabado
         DT"SABADO",0X00
MensajeDomingo
         DT"DOMINGO",0X00
;
MensajeEnero
         DT"ENERO",0X00
MensajeFebrero
         DT"FEBRERO",0X00
MensajeMarzo
         DT"MARZO",0X00
MensajeAbril
         DT"ABRIL",0X00
MensajeMayo
         DT"MAYO",0X00
MensajeJunio
         DT"JUNIO",0X00
MensajeJulio
         DT"JULIO",0X00
MensajeAgosto
         DT"AGOSTO",0X00
MensajeSeptiembre
         DT"SEPTIEMBRE",0X00
MensajeOctubre
         DT"OCTUBRE",0X00 
MensajeNoviembre
         DT"NOVIEMBRE",0X00
MensajeDiciembre
         DT"DICIEMBRE",0X00 
;
DiasSemana
         addwf     PCL,F
         nop
         retlw     MensajeLunes
         retlw     MensajeMartes
         retlw     MensajeMiercoles
         retlw     MensajeJueves
         retlw     MensajeViernes
         retlw     MensajeSabado
         retlw     MensajeDomingo
Meses
         addwf     PCL,F
         nop
         retlw     MensajeEnero
         retlw     MensajeFebrero
         retlw     MensajeMarzo
         retlw     MensajeAbril
         retlw     MensajeMayo
         retlw     MensajeJunio
         retlw     MensajeJulio
         retlw     MensajeAgosto
         retlw     MensajeSeptiembre
         nop
         nop
         nop
         nop
         nop
         nop
         retlw     MensajeOctubre
         retlw     MensajeNoviembre
         retlw     MensajeDiciembre 
TABLA_CARACTERES
         addwf     PCL,F
         goto      Numer_0
         goto      Numer_1
         goto      Numer_2
         goto      Numer_3
         goto      Numer_4
         goto      Numer_5
         goto      Numer_6
         goto      Numer_7
         goto      Numer_8
         goto      Numer_9
         goto      Signo_Dos_Puntos
         goto      Signo_PuntoyComa;Equivale a signo de grados
         goto      Signo_MenorQue
         goto      Signo_Igual
         goto      Signo_MayorQue
         goto      Signo_Interrogacion
         goto      Signo_Arroba;Equivale a espacio
         goto      Letra_A
         goto      Letra_B
         goto      Letra_C
         goto      Letra_D
         goto      Letra_E
         goto      Letra_F
         goto      Letra_G
         goto      Letra_H
         goto      Letra_I
         goto      Letra_J
         goto      Letra_K
         goto      Letra_L
         goto      Letra_M
         goto      Letra_N
         goto      Letra_O
         goto      Letra_P
         goto      Letra_Q
         goto      Letra_R
         goto      Letra_S
         goto      Letra_T
         goto      Letra_U
         goto      Letra_V
         goto      Letra_W
         goto      Letra_X
         goto      Letra_Y
         goto      Letra_Z                               
Numer_0
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E  
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_1
         movlw     0X18
         movwf     Colun_1
         movlw     0X38
         movwf     Colun_2
         movlw     0X78
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Numer_2
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Numer_3
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X1E
         movwf     Colun_4
         movlw     0X1E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_4
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X06
         movwf     Colun_7
         movlw     0X006
         movwf     Colun_8
         return
Numer_5
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4
         movlw     0X3E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_6
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_7
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Numer_8
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Numer_9
         movlw     0X3E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X3E
         movwf     Colun_5
         movlw     0X0C
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0x30
         movwf     Colun_8
         return
Signo_Dos_Puntos
         movlw     0X00
         movwf     Colun_1
         movlw     0X18
         movwf     Colun_2
         movlw     0X18
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_PuntoyComa
         movlw     0X00
         movwf     Colun_1
         movlw     0X3C
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X3C
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_MenorQue
         movlw     0X24
         movwf     Colun_1
         movlw     0X24
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_Igual
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Signo_MayorQue
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
Signo_Interrogacion
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X10
         movwf     Colun_6
         movlw     0X08
         movwf     Colun_7
         movlw     0X04
         movwf     Colun_8
         return
Signo_Arroba
         movlw     0X00
         movwf     Colun_1
         movlw     0X00
         movwf     Colun_2
         movlw     0X00
         movwf     Colun_3
         movlw     0X00
         movwf     Colun_4
         movlw     0X00
         movwf     Colun_5
         movlw     0X00
         movwf     Colun_6
         movlw     0X00
         movwf     Colun_7
         movlw     0X00
         movwf     Colun_8
         return
Letra_A
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_B
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7C
         movwf     Colun_8
         return
Letra_C
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X60
         movwf     Colun_4
         movlw     0X60
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_D
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7C
         movwf     Colun_8
         return
Letra_E
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X78
         movwf     Colun_4
         movlw     0X78
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_F
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X78
         movwf     Colun_4
         movlw     0X78
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Letra_G
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X6C
         movwf     Colun_4
         movlw     0X6E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_H
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_I
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X18
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_J
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X06
         movwf     Colun_4
         movlw     0X06
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0x3C
         movwf     Colun_8
         return
Letra_K
         movlw     0X66
         movwf     Colun_1
         movlw     0X6C
         movwf     Colun_2
         movlw     0X78
         movwf     Colun_3
         movlw     0X70
         movwf     Colun_4
         movlw     0X70
         movwf     Colun_5
         movlw     0X78
         movwf     Colun_6
         movlw     0X6C
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_L
         movlw     0X60
         movwf     Colun_1
         movlw     0X60
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X60
         movwf     Colun_4
         movlw     0X60
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return
Letra_M
         movlw     0X42
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X7E
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_N
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X76
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X6E
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_O
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_P
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7C
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0X60
         movwf     Colun_8
         return
Letra_Q
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X76
         movwf     Colun_5
         movlw     0X67
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3E
         movwf     Colun_8
         return
Letra_R
         movlw     0X7C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X7E
         movwf     Colun_4
         movlw     0X7C
         movwf     Colun_5
         movlw     0X78
         movwf     Colun_6
         movlw     0X6C
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_S
         movlw     0X3C
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X60
         movwf     Colun_3
         movlw     0X7C
         movwf     Colun_4  
         movlw     0X3E
         movwf     Colun_5
         movlw     0X06
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_T
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X18
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X18
         movwf     Colun_6
         movlw     0X18
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
         return
Letra_U
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X66
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X3C
         movwf     Colun_8
         return
Letra_V
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X66
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X3C
         movwf     Colun_7
         movlw     0X18
         movwf     Colun_8
         return
Letra_W
         movlw     0X42
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X66
         movwf     Colun_3
         movlw     0X66
         movwf     Colun_4
         movlw     0X7E
         movwf     Colun_5
         movlw     0X7E
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X42
         movwf     Colun_8
         return
Letra_X
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X24
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X24
         movwf     Colun_6
         movlw     0X66
         movwf     Colun_7
         movlw     0X66
         movwf     Colun_8
         return
Letra_Y
         movlw     0X66
         movwf     Colun_1
         movlw     0X66
         movwf     Colun_2
         movlw     0X3C
         movwf     Colun_3
         movlw     0X18
         movwf     Colun_4
         movlw     0X30
         movwf     Colun_5
         movlw     0X60
         movwf     Colun_6
         movlw     0X60
         movwf     Colun_7
         movlw     0x60
         movwf     Colun_8
         return
Letra_Z
         movlw     0X7E
         movwf     Colun_1
         movlw     0X7E
         movwf     Colun_2
         movlw     0X06
         movwf     Colun_3
         movlw     0X0C
         movwf     Colun_4
         movlw     0X18
         movwf     Colun_5
         movlw     0X30
         movwf     Colun_6
         movlw     0X7E
         movwf     Colun_7
         movlw     0X7E
         movwf     Colun_8
         return  
MODO_SPI;Se configura en modo SPI
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco 1
         bsf       SSPSTAT,SMP
         bsf       SSPSTAT,CKE
         bcf       STATUS,RP0;Banco 0
         movlw     0X00
         movwf     SSPCON;CKP
         return
CONFIG_MAX7219
CONFIG_1
         movlw     0X09;Modo de decodificacion (no decodifica)
         movwf     DATO_HIT
         movlw     0X00
         movwf     DATO_LOW
         call      CONFIG_MAX
CONFIG_2 
         movlw     0X0A;Intensidad de luz(intensidad baja)
         movwf     DATO_HIT
         movlw     0X04
         movwf     DATO_LOW
         call      CONFIG_MAX
CONFIG_3
         movlw     0X0B;Limite del numero de filas a iluminar(todos se iluminan)
         movwf     DATO_HIT
         movlw     0X07
         movwf     DATO_LOW
         call      CONFIG_MAX
CONFIG_4
         movlw     0X0C;Operacion normal o bajo consumo(normal)
         movwf     DATO_HIT
         movlw     0X01
         movwf     DATO_LOW
         call      CONFIG_MAX 
CONFIG_5
         movlw     0X0F;Operacion normal o modo tes(normal)
         movwf     DATO_HIT
         movlw     0X00
         movwf     DATO_LOW
         call      CONFIG_MAX 
         return  
CONFIG_MAX
         movlw     0X01
         movwf     Numero_DIG
Otro_DIG_Conf
         call      ENVIA_DATO_SPI
         incf      Numero_DIG,F
         movf      Numero_DIG,W
         xorlw     0X09
         btfss     STATUS,Z
         goto      Otro_DIG_Conf
         return
ENVIA_DATO_SPI
         bsf       SSPCON,SSPEN
         bcf       PORTC,2
         clrf      Contador
Check_Contador
         decf      Numero_DIG,W
         subwf     Contador,W
         btfsc     STATUS,Z
         goto      ENVIA_DATO_DIG
         bcf       PIR1,SSPIF
         movlw     0X00
         movwf     SSPBUF
         btfss     PIR1,SSPIF
         goto      $-1
         bcf       PIR1,SSPIF
         movlw     0X00
         movwf     SSPBUF
         btfss     PIR1,SSPIF
         goto      $-1
Check_Loop
         incf      Contador
         movf      Contador,W
         xorlw     0X08
         btfss     STATUS,Z
         goto      Check_Contador
         bsf       PORTC,2
         bcf       SSPCON,SSPEN
         return
ENVIA_DATO_DIG
         bcf       PIR1,SSPIF
         movf      DATO_HIT,W
         movwf     SSPBUF
         btfss     PIR1,SSPIF
         goto      $-1
         bcf       PIR1,SSPIF
         movf      DATO_LOW,W
         movwf     SSPBUF
         btfss     PIR1,SSPIF
         goto      $-1
         goto      Check_Loop
  
Convertir;Convertimos el caracter en 8 Bytes y los colocamos en los registros Colun_1 al Colun_8
          
         movwf     Caracter
         movlw     0X30
         subwf     Caracter,F
         movf      Caracter,W
         return
Caracter_Al_Principio_Panel; Coloca los 8 Bytes del catacter justo a la derecha del panel
         movlw     0XE0
         movwf     FSR
         movf      Colun_1,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_2,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_3,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_4,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_5,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_6,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_7,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_8,W
         movwf     INDF
         return
Desplazar;Desplaza los Bytes de los caracteres de derecha a izquierda, 8 de una vez(un caracter)
         movlw     0X08
         movwf     Conta_1
Desplaza_1Posicion_A_Izquierda;Desplaza una colunna a la izquierda todo el panel,
         movlw     0XA0;Apunta a la primera colunna de la izquierda
         movwf     FSR
Otra_Vez
         movf      INDF,W
         decf      FSR,F
         movwf     INDF
         incf      FSR,F
         incf      FSR,F
         movlw     0XE9
         xorwf     FSR,W
         btfss     STATUS,Z
         goto      Otra_Vez
         decfsz    Conta_1,F
         goto      Desplaza_1Posicion_A_Izquierda
         return
EscribePanel
         movlw     0XA0
         movwf     FSR
         clrf      Numero_DIG
Otro_DIG 
         incf      Numero_DIG
         movlw     0X01
         movwf     DATO_HIT
Bucle_1DIG
         bcf       STATUS,IRP
         movf      INDF,W
         movwf     DATO_LOW
         call      ENVIA_DATO_SPI
         movf      FSR,W
         xorlw     0XDF
         btfsc     STATUS,Z
         goto      FinEscribePanel
         incf      FSR,F
         movf      DATO_HIT,W
         xorlw     0X08
         btfsc     STATUS,Z
         goto      Otro_DIG
         incf      DATO_HIT
         goto      Bucle_1DIG
FinEscribePanel
         return
TEMPORIZA
         movlw     0X85;100 en decimal
         movwf     CONTA_PRUEBA
Temporiza_5mls
         movlw     0X4D;77 en decimal
         movwf     TMR1L
         movlw     0X9E;158 en decimal
         movwf     TMR1H
         bsf       T1CON,TMR1ON;Activa TMR1
Espera
         btfss     PIR1,TMR1IF
         goto      Espera
         bcf       PIR1,TMR1IF
         decfsz    CONTA_PRUEBA
         goto      Temporiza_5mls
         bcf       T1CON,TMR1ON;Desactiva TMR1
         return
INICIO
         bsf       STATUS,RP0
         bcf       STATUS,RP1;Banco1
         movlw     0X10
         movwf     TRISC
         movlw     0X07
         movwf     ADCON1
         clrf      OPTION_REG
         bsf       ModoPulsador
         bsf       IncrementarPulsador
         bsf       OndaCuadrada_DS1307       
         bcf       STATUS,RP0
         bcf       STATUS,RP1;Banco0      
         bsf       PORTC,2 
         call      MODO_SPI
         call      CONFIG_MAX7219
         clrf      FlagsAjuste
         call      DS1307_Inicializa
         call      DS1307_Lee
         btfss     Segundo,7
         goto      AntesConBateria
         call      DS1307_CargaInicial
         movlw     0X90
         movwf     INTCON
         goto      Principal
AntesConBateria
         movlw     0X90
         movwf     INTCON
Principal
         call      Muestra_Relog
         goto      Principal
ServicioInterrupcion
         movwf     Guarda_W
         swapf     STATUS,W
         movwf     Guarda_STATUS
         swapf     Auxiliar,W
         movwf     Guarda_Auxiliar
         btfss     INTCON,INTF
         goto      FinInterrupcion      
         call      DS1307_Lee
FinInterrupcion
         swapf     Guarda_Auxiliar,W
         movwf     Auxiliar
         swapf     Guarda_STATUS,W
         movwf     STATUS
         swapf     Guarda_W,F
         swapf     Guarda_W,W
         bcf       INTCON,INTF
         retfie
Muestra_Relog
HORAS
         movf      Hora,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         call      TABLA_CARACTERES
         call      DecenasHoras
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      UnidadesHoras
DOS_PUNTOS_HORAS
         movlw     ":"
         call      Convertir
         call      TABLA_CARACTERES
         call      DosPuntosHoras
MINUTOS
         movf      Minuto,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         call      TABLA_CARACTERES
         call      DecenasMinutos
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      UnidadesMinutos
DOS_PUNTOS_MINUTOS
         movlw     ":"
         call      Convertir
         call      TABLA_CARACTERES
         call      DosPuntosMinutos
SEGUNDOS
         movf      Segundo,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         call      TABLA_CARACTERES
         call      DecenasSegundos
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      UnidadesSegundos
         call      EscribePanel
         movf      Segundo,F
         btfss     STATUS,Z
         goto      Fin_Muestra_Relog
MuestraFecha
         call      EspacioEnBlanco
         call      Dia_De_La_Semana
         call      EspacioEnBlanco
         call      Dia_Del_Mes
         call      EspacioEnBlanco
         call      NombreMes
         call      EspacioEnBlanco
         call      NumeroAnho
         call      EspacioEnBlanco
         call      NumeroHora
         call      Dos_Puntos
         call      NumeroMinuto
         call      Dos_Puntos
         call      NumeroSegundo
Fin_Muestra_Relog
         return 
TraerColumnas
         movf      Colun_1,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_2,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_3,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_4,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_5,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_6,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_7,W
         movwf     INDF
         incf      FSR,F
         movf      Colun_8,W
         movwf     INDF
         return     
DecenasHoras
         movlw     DecenasHoras_Base;Digito 1
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
UnidadesHoras
         movlw     UnidadesHoras_Base;Digito 2
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
DosPuntosHoras
         movlw     DosPuntosHoras_Base;Digito 3
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
DecenasMinutos
         movlw     DecenasMinutos_Base;Digito 4
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
UnidadesMinutos
         movlw     UnidadesMinutos_Base;Digito 5
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
DosPuntosMinutos
         movlw     DosPuntosMinutos_Base;Digito 6
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
DecenasSegundos
         movlw     DecenasSegundos_Base;Digito 7
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return
UnidadesSegundos
         movlw     UnidadesSegundos_Base;Digito 8
         movwf     FSR
         bcf       STATUS,IRP
         call      TraerColumnas
         return       
Dia_De_La_Semana
         movf      DiaSemana,W
         sublw     0X07
         btfsc     STATUS,C
         goto      Llamada_a_DiasSemana
         movlw     0X01
         movwf     DiaSemana
Llamada_a_DiasSemana
         movf      DiaSemana,W
         call      DiasSemana       
VisualizaMensaje
         movwf     ApuntaCaracter
         movlw     Mensajes
         subwf     ApuntaCaracter,F
         decf      ApuntaCaracter,F
VisualizaOtroCaracter
         movf      ApuntaCaracter,W
         call      Mensajes
         movwf     ValorCaracter
         movf      ValorCaracter,F
         btfsc     STATUS,Z
         goto      FinMensaje
NoUltimoCaracter  
         call      Convertir
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         incf      ApuntaCaracter,F
         goto      VisualizaOtroCaracter
FinMensaje
         return
EspacioEnBlanco
         movlw     "@"
         call      Convertir
         call      TABLA_CARACTERES         
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         return
Dia_Del_Mes
         movf      Dia,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         return
NombreMes
         movf      Mes,W
         sublw     0X12
         btfsc     STATUS,C
         goto      Llamada_a_Meses
         movlw     0X01
         movwf     Mes
Llamada_a_Meses
         movf      Mes,W
         call      Meses
         call      VisualizaMensaje
         return 
NumeroAnho
         movlw     "2"
         call      Convertir
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movlw     "0"
         call      Convertir
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA   
         movf      Anho,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         return
NumeroHora
         movf      Hora,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X03
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar   
         call      EscribePanel
         call      TEMPORIZA
         return
Dos_Puntos
         movlw     ":"
         call      Convertir
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         return
NumeroMinuto
         movf      Minuto,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         return
NumeroSegundo
         movf      Segundo,W
         movwf     Auxiliar
         swapf     Auxiliar,W
         andlw     0X07
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA
         movf      Auxiliar,W
         andlw     0X0F
         call      TABLA_CARACTERES
         call      Caracter_Al_Principio_Panel
         call      Desplazar
         call      EscribePanel
         call      TEMPORIZA     
         return           
PuestaEnHora
         return
Incrementar
         return
         
     
         
         
AjusteBCD
         movwf     Auxiliar
         andlw     0X0F
         sublw     0X09
         btfsc     STATUS,C
         goto      NoSuperaNueve
         movlw     0X06
         addwf     Auxiliar,F
NoSuperaNueve
         movf      Auxiliar,W
         return
         

         
       
         
         
        
        
;SUBRUTINAS PARA MANEJO DEL BUS I2C
; Subrutina "SDA_Bajo" -------------------------------------------------------------------------------
;
SDA_Bajo
	bsf	STATUS,RP0		; Configura la línea SDA como salida.
	bcf	SDA
	bcf	STATUS,RP0
	bcf	SDA			; SDA en bajo.
	return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
	bsf	STATUS,RP0		; Configura la línea SDA entrada.
	bsf	SDA			; Lo pone en alta impedancia y, gracias a la
	bcf	STATUS,RP0		; Rp de esta línea, se mantiene a nivel alto.
	return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
	bsf	STATUS,RP0
	bcf	SCL			; Configura la línea SCL como salida.
	bcf	STATUS,RP0
	bcf	SCL			; La línea de reloj SCL en bajo.
	return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
	bsf	STATUS,RP0		; Configura la línea SCL entrada.
	bsf	SCL			; Lo pone en alta impedancia y, gracias a la Rp
	bcf	STATUS,RP0		; de esta línea, se mantiene a nivel alto.
SCL_EsperaNivelAlto
	btfss	SCL			; Si algún esclavo mantiene esta línea en bajo
	goto	SCL_EsperaNivelAlto	; hay que esperar.
	return
;
; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
;
; Esta subrutina envía una condición de Start o inicio.
;
I2C_EnviaStart
	call	SDA_AltaImpedancia	; Línea SDA en alto.
	call	SCL_AltaImpedancia	; Línea SCL en alto.
	call	Retardo_5micros		; Tiempo tBUF del protocolo.
	call	SDA_Bajo		; Flanco de bajada de SDA mientras SCL está alto.
	call	Retardo_4micros		; Tiempo tHD;STA del protocolo.
	call	SCL_Bajo		; Flanco de bajada del reloj SCL.
	call	Retardo_5micros	
	return
;
; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
;
; Esta subrutina envía un condición de Stop o parada.
;
I2C_EnviaStop
	call	SDA_Bajo
	call	SCL_AltaImpedancia	; Flanco de subida de SCL.
	call	Retardo_5micros		; Tiempo tSU;STO del protocolo.
	call	SDA_AltaImpedancia	; Flanco de subida de SDA.
	call	Retardo_5micros		; Tiempo tBUF del protocolo.
	return
;
; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
;
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte, 
; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
;
I2C_EnviaByte
	movwf	I2C_Dato			; Almacena el byte a transmitir.
	movlw	0x08			; A transmitir 8 bits.
	movwf	I2C_ContadorBits
I2C_EnviaBit
	rlf	    I2C_Dato,F		; Chequea el bit, llevándolo previamente al Carry.
	btfsc	STATUS,C
	goto	I2C_EnviaUno
I2C_EnviaCero
	call	SDA_Bajo		; Si es "0" envía un nivel bajo.
	goto	I2C_FlancoSCL
I2C_EnviaUno
	call	SDA_AltaImpedancia	; Si es "1" lo activará a alto.
I2C_FlancoSCL
	call	SCL_AltaImpedancia	; Flanco de subida del SCL.
	call	Retardo_4micros		; Tiempo tHIGH del protocolo.
	call	SCL_Bajo		; Termina el semiperiodo positivo del reloj.
	call	Retardo_5micros		; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los ocho bits.
	goto	I2C_EnviaBit
	call	SDA_AltaImpedancia	; Libera la línea de datos.
	call	SCL_AltaImpedancia	; Pulso en alto de reloj para que el esclavo
	call	Retardo_5micros		; pueda enviar el bit ACK.
	call	SCL_Bajo
	call	Retardo_5micros
	return
;
; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
; del registro W. Se empieza a leer por el bit de mayor peso MSB.
; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.

I2C_LeeByte
	movlw	0x08			; A recibir 8 bits.
	movwf	I2C_ContadorBits
	call	SDA_AltaImpedancia	; Deja libre la línea de datos.
I2C_LeeBit
	call	SCL_AltaImpedancia	; Flanco de subida del reloj.
	bcf 	STATUS,C		; En principio supone que es "0".
	btfsc	SDA			; Lee el bit
	bsf 	STATUS,C		; Si es "1" carga 1 en el Carry.
	rlf 	I2C_Dato,F		; Lo introduce en el registro.
	call	SCL_Bajo		; Termina el semiperiodo positivo del reloj.
	call	Retardo_5micros		; Tiempo tHD;DAT del protocolo.
	decfsz	I2C_ContadorBits,F		; Lazo para los 8 bits.
	goto	I2C_LeeBit; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento ACK en consecuencia.
	btfss 	I2C_UltimoByteLeer	; Si es el último, no debe enviar el bit de reconocimiento ACK.
	call	SDA_Bajo		; Envía el bit de reconocimiento ACK porque todavía no es el último byte a leer.
	call	SCL_AltaImpedancia	; Pulso en alto del SCL para transmitir el
	call	Retardo_4micros		; bit ACK de reconocimiento. Este es tHIGH.
	call	SCL_Bajo		; Pulso de bajada del SCL.
	call	Retardo_5micros
	movf	I2C_Dato,W		; El resultado se manda en el registro de
	return				; de trabajo W.
	

;SUBRUTINAS DE RETARDOS PARA CUARZO DE 20 MHZ QUE SON 5 MHZ/S. 0,2us POR CICLO MAQUINA
;RETARDOS DE 1,4,5,10,20,50 Y 100 us
Retardo_100micros;RETARDO DE 100 MICROS
    nop
    movlw    0XA4;164 en decimal
    goto     RetardoMicros
Retardo_50micros;RETARDO DE 50 MICROS
    movlw    0X51;81 en decimal
    goto     RetardoMicros
Retardo_20micros;RETARDO DE 20 MICROS
    movlw    0X1F;31en decimal
    goto     RetardoMicros 
Retardo_10micros;RETARDO DE 10 MICROS
    nop
    movlw    0X0E
    goto     RetardoMicros
Retardo_5micros;RETARDO DE 5 MICROS
    nop
    nop
    nop
    movlw    0X05
    goto     RetardoMicros
Retardo_4micros;RETARDO DE 4 MICROS
    movlw    0X05     
RetardoMicros
    movwf     R_ContA
Rmicros_Bucle
    decfsz    R_ContA,F
    goto      Rmicros_Bucle
    return
Retardo_1micro;RETARDO DE 1 MICRO
    nop
    return
;RETARDOS DE 500 micros y 1,2,5 y 10  milisegundos
Retardo_500micros
    movlw     0X05
    goto      Retardos_ms
Retardo_1ms
    movlw     0X0B
    goto      Retardos_ms
Retardo_2ms
    movlw     0X17
    goto      Retardos_ms
Retardo_5ms
    movlw     0X3B
    goto      Retardos_ms
Retardo_10ms
    movlw     0X77
    goto      Retardos_ms
Retardos_ms
    movwf     R_ContB
Bucle_ext
    movlw     0X68
    movwf     R_ContA
Bucle_int
    decfsz    R_ContA,F
    goto      Bucle_int
    decfsz    R_ContB,F
    goto      Bucle_ext
    return
; Estas subrutinas permiten realizar las tareas de manejo del reloj-calendario DS1307
; Este dispositivo transmite la información vía serie a través de un bus I2C.
; Subrutina "DS1307_Inicializa" ---------------------------------------------------------
; Configura la señal cuadrada que genera el DS1307 en su pin SQW/OUT a 1 Hz.

DS1307_Inicializa
	call	I2C_EnviaStart		; Envía condición de Start.
	movlw	DS1307_DireccionEscritura	; Indica al DS1307 que el byte a escribir,
	call	I2C_EnviaByte		; está en la posición 07h, que corresponde
	movlw	0x07			; al control de la señal cuadrada.
	call	I2C_EnviaByte
	movlw	b'00010000'		; Escribe en el registro de control para
	call	I2C_EnviaByte		; configurar onda cuadrada del DS1307 a 1 Hz.
	call	I2C_EnviaStop		; Termina de enviar datos.
	return

; Subrutina "DS1307_Lee" ----------------------------------------------------------------
;
; Se leen las variables de tiempo del DS1307 y se guardan en los registros correspondientes.
DS1307_Lee
	bcf	    I2C_UltimoByteLeer
	call	I2C_EnviaStart		; Envía condición de Start.
	movlw	DS1307_DireccionEscritura	; Indica al DS1307 que el primer byte
	call	I2C_EnviaByte		; a leer está en la posición 00H, que corresponde
	movlw	0x00			; a los segundos.
	call	I2C_EnviaByte
	call	I2C_EnviaStop		; Envía condición de Stop. Ahora va a leer el DS1307.
	call	I2C_EnviaStart		; Envía condición de Start.
	movlw	DS1307_DireccionLectura
	call	I2C_EnviaByte
	call	I2C_LeeByte		; Lee los segundos.
	movwf	Segundo			; Lo carga en el registro correspondiente.
	call	I2C_LeeByte		; Lee el resto de los registros utilizando
	movwf	Minuto			; el mismo procedimiento.
	call	I2C_LeeByte
	movwf	Hora
	call	I2C_LeeByte
	movwf	DiaSemana
	call	I2C_LeeByte
	movwf	Dia
	call	I2C_LeeByte
	movwf	Mes
	bsf	    I2C_UltimoByteLeer	; Para terminar.
	call	I2C_LeeByte
	movwf	Anho
	call	I2C_EnviaStop		; Acaba de leer.
	return

; Subrutina "DS1307_CargaInicial" -------------------------------------------------------
;
; Realiza una carga inicial en los registros internos del reloj-calendario DS1307 a fecha
; Lunes, 1 de Enero de 2004 a las 0:00:00.
;
DS1307_CargaInicial
	movlw	0X0F; Inicializa todos los datos del reloj: Año, mes,
	movwf	Dia
	movlw   0X0A			; día, día de la semana, hora, minuto y segundo.
	movwf	Mes
	movlw   0X07
	movwf	DiaSemana
	movlw   0X17	
	movwf	Anho			; Inicializa en el año 2004.
	clrf	Hora
	clrf	Minuto
	clrf	Segundo			; Después lo graba en el DS1307 para
	call	DS1307_Escribe		; ponerlo en marcha.
	return
;
; Subrutina "DS1307_Escribe" ----------------------------------------------------------------
;
; Carga los datos de los registros Anho, Mes, etc., dentro del DS1307.

DS1307_Escribe
	call	I2C_EnviaStart		; Envía condición de Start.
	movlw	DS1307_DireccionEscritura	; Indica al DS1307 que el primer byte a escribir
	call	I2C_EnviaByte		; está en la posición 00h que corresponde
	movlw	0x00			; a los segundos.
	call	I2C_EnviaByte
	movf	Segundo,W		; Pasa los segundos de la memoria del PIC16F84A al
	call	I2C_EnviaByte		; DS1307.
	movf	Minuto,W		; Y se repite el proceso para el resto.
	call	I2C_EnviaByte
	movf	Hora,W
	call	I2C_EnviaByte
	movf	DiaSemana,W
	call	I2C_EnviaByte
	movf	Dia,W
	call	I2C_EnviaByte
	movf	Mes,W
	call	I2C_EnviaByte
	movf	Anho,W
	call	I2C_EnviaByte
	call	I2C_EnviaStop		; Termina de enviar datos.
	return
;**************************** Librería "BUS_1LIN.INC" *********************************
; Estas subrutinas permiten realizar las tareas básicas de control del bus de una sola línea
; según el protocolo del fabricante de semiconductores Dallas Semiconductors.
; Subrutina "Bus1Linea_AltaImpedancia" --------------------------------------------------
;
; Configura la línea única de 1-Wire Bus como entrada. Lo pone en alta impedancia.

Bus1Linea_AltaImpedancia
	bsf	STATUS,RP0
	bsf	Bus1Linea		; La línea como entrada, por tanto, en alta
	bcf	STATUS,RP0		; impedancia.
	return

; Subrutina "Bus1Linea_Bajo" ------------------------------------------------------------
;
; Mantiene el pin de datos del Bus de 1 línea en bajo.
 
Bus1Linea_Bajo
	bsf	STATUS,RP0
	bcf	Bus1Linea		; La línea como salida.
	bcf	STATUS,RP0
	bcf	Bus1Linea		; Pasa a bajo.
	return

; Subrutina "Bus1Linea_Reset" -----------------------------------------------------------
;
; Envía un impulso de Reset al dispositivo conectado en el bus de 1 línea y después
; espera recibir un impulso de Presence". Esto consiste en:
; 1º.	El PIC manda un impulso en bajo durante unos 500 µs. (El protocolo permite entre 480
;	y 960 µs).
; 2º. 	El PIC pasa a modo entrada, espera 20 µs. (El protocolo fija entre 15 y 60 µs).
; 3º. 	El PIC lee la línea de entrada y si es bajo está correcto (pulso de "Presence").
;	Se interpreta como que el procedimiento está correctamente inicializado.

Bus1Linea_Reset
	call	Bus1Linea_AltaImpedancia	; Empieza en alto para conseguir el flanco de
					; bajada con la siguiente instrucción.
	call	Bus1Linea_Bajo		; El bus de 1 línea en bajo durante 500 µs.
	call	Retardo_500micros
	call	Bus1Linea_AltaImpedancia	; Permanece en alta impedancia (nivel alto por
	call	Retardo_20micros		; las resistencias de Pull-Up) durante unos µs.
Bus1Linea_EsperaLeerBajo
	btfsc	Bus1Linea		; Espera a que el dispositivo le envíe el pulso
	goto	Bus1Linea_EsperaLeerBajo	; en bajo de "Presence".
Bus1Linea_EsperaLeerAlto
	btfss	Bus1Linea		; Y ahora el dispositivo lo debe poner en alto.
	goto	Bus1Linea_EsperaLeerAlto
	return

; Subrutina "Bus1Linea_EscribeByte" -----------------------------------------------------
;
; El maestro escribe un byte al esclavo conectado al bus de 1 línea comenzando por el bit LSB.
; Consiste en enviar 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º	El PIC manda un impulso en bajo durante unos microsegundos. (El protocolo fija un
;	mínimo de 1 µs y sin exceder con lo que viene a continuación de 60 µs) A continuación:
;	- Si va a enviar un "0" permanece en bajo durante 50 µs.
;	- Si va a escribir un "1" se pone en alta impedancia durante 50 µs. (El protocolo
;	  permite unos valores entre 15 y 60 µs para ambos casos).
; 2º 	Para escribir otro bit se pone en alta impedancia durante unos µs. (El protocolo
;	establece un mínimo de 1 µs).
;
; Entrada:	En (W) el dato a enviar.

Bus1Linea_EscribeByte
	movwf	Bus1Linea_Dato		; Guarda el byte a transmitir.
	movlw	0x08			; 8 bits a transmitir.
	movwf	Bus1Linea_ContadorBits
	call	Bus1Linea_AltaImpedancia	; Empieza en alta impedancia.
Bus1Linea_EnviaBit
	call	Bus1Linea_Bajo		; Flanco de bajada.
;
; Pregunta por el valor del bit a transmitir.
;
	rrf	Bus1Linea_Dato,F		; Lleva el bit de menor peso LSB al Carry. 
	btfss	STATUS,C		; ¿Es un "1" el bit a transmitir?.
	goto	Bus1Linea_EnviaCero	; No, pues envía un "0".	
Bus1Linea_EnviaUno
	call	Bus1Linea_AltaImpedancia	; Transmite un "1".
	goto	Bus1Linea_Espera50us
Bus1Linea_EnviaCero
	call	Bus1Linea_Bajo		; Transmite un "0".
Bus1Linea_Espera50us
	call	Retardo_50micros
	call	Bus1Linea_AltaImpedancia	; Flanco de subida.
	decfsz	Bus1Linea_ContadorBits,1	; Comprueba que es el último bit.
	goto	Bus1Linea_EnviaBit	; Como no es el último bit repite la operación.
	return
;
; Subrutina "Bus1Linea_LeeByte" ---------------------------------------------------------
;
; El microcontrolador maestro lee un byte del dispositivo esclavo conectado al bus de
; 1 línea. Consiste en leer 8 bits, repitiendo 8 veces la siguiente secuencia:
; 1º	El PIC manda un pulso en bajo durante unos µs. (El protocolo fija un mínimo de 1 µs).
; 2º 	El PIC se pone en entrada (alta impedancia) durante otros 10 µs (con un total de 15 µs
;	desde el flanco de bajada) para proceder a la lectura de la línea.
; 3º	El PIC espera 50 µs para realizar la siguiente lectura (total unos 65 µs desde el
;	flanco de bajada). El protocolo fija que las lecturas se harán cada 60 µs ó más.
;
; Salida:	En (W) el dato leído.

Bus1Linea_LeeByte
	movlw	0x08			; 8 bits a recibir.
	movwf	Bus1Linea_ContadorBits
	call	Bus1Linea_AltaImpedancia	; Empieza en alta impedancia.
Bus1Linea_LeeBit
	call	Bus1Linea_Bajo		; Flanco de bajada.
	call	Bus1Linea_AltaImpedancia
	call	Retardo_10micros		; Añadiendo las instrucciones anteriores, supone
					; un total de 15 µs desde el flanco de bajada.
	bcf 	STATUS,C		; Ahora lee el pin. En principio supone que es 0.
	btfsc	Bus1Linea		; ¿Realmente es cero?.
	bsf	    STATUS,C		; No, pues cambia a uno.
	rrf 	Bus1Linea_Dato,1		; Introduce el bit en el registro.
	call	Retardo_50micros		; Espera.
	call	Bus1Linea_AltaImpedancia	; Flanco de subida del pulso positivo.
	decfsz 	Bus1Linea_ContadorBits,1	; Comprueba que es el último bit.
	goto	Bus1Linea_LeeBit		; Si no es el último bit pasa a leer el siguiente.
	movf	Bus1Linea_Dato,W		; El resultado en el registro W.
	return
	
;**************************** Librería "DS1820.INC" ***********************************
; Estas subrutinas permiten realizar las tareas de manejo del sensor de temperatura DS1820.
; Este sensor transmite la información vía serie a través de un 1-Wire Bus.
; Subrutina "DS1820_Inicializa" ---------------------------------------------------------
;
; Inicializa el DS1820 para que comience la conversión de temperatura.
;
DS1820_Inicializa
	call	Bus1Linea_Reset		; Primero los pulsos de Reset y Presence.
	movlw	DS1820_Skip_ROM_Command ; Salta los comandos de ROM ya que hay
	call	Bus1Linea_EscribeByte	; conectado un único dispositivo al bus.
	movlw	DS1820_Convert_T_Command ; Para que comience la conversión de temperatura.
	call	Bus1Linea_EscribeByte
	return

; Subrutina "DS1820_LeeTemperatura" -----------------------------------------------------
;
; El DS1820 lee la temperatura en un formato ejemplarizado como sigue:
;
; +125,0 ºC	00000000 11111010
; + 25,5 ºC	00000000 00110011
; + 25,0 ºC	00000000 00110010
; +  0,5 ºC	00000000 00000001
; +  0,0 ºC	00000000 00000000
; -  0,5 ºC	11111111 11111111
; - 25,0 ºC	11111111 11001110
; - 55,0 ºC	11111111 10010010
;
; Se observa que:
;     -	El formato es de dos bytes. El primer byte es el de signo.
;     -	Las temperaturas positivas comienzan con 1 byte todo a cero: "00000000 xxxxxxxx".
;     -	Las temperaturas negativas comienzan con 1 byte todo a uno : "11111111 xxxxxxxx".
;     -	Las temperaturas "xx.0 ºC" terminan en cero: "xxxxxxx0".
;     -	Las temperaturas "xx.5 ºC" terminan en uno : "xxxxxxx1".
;     -	El valor de la temperatura está contenido en los 7 bits de mayor peso del byte bajo.
;	Por ejemplo: +25ºC = xxxxxxxx 0011001x = 25 en decimal. Por tanto, para obtener el
;	valor de la temperatura habrá que desplazar un lugar hacia la derecha los bits del
;	byte bajo.
;     -	Las temperaturas negativas vienen dadas en complemento a 2. Por tanto para obtener
;	su valor absoluto habrá que negarlas.
;
; Esta subrutina lee la temperatura proporcionando tres datos: 
;
; Salida:	- En el registro DS1820_Temperatura, el valor de la temperatura en valor absoluto.
;	- En el registro DS1820_TemperaturaDecimal, la parte decimal del valor de la temperatura.
;	- En (DS1820_TemperaturaSigno)=b'11111111' si la temperatura es negativa y
;	  (DS1820_TemperaturaSigno)=b'00000000' si es positiva.
;
DS1820_LeeTemperatura
	call	Bus1Linea_Reset		; Primero los pulsos de "Reset" y "Presence".
	movlw	DS1820_Skip_ROM_Command ; Salta los comandos de ROM ya que hay
	call	Bus1Linea_EscribeByte	; conectado un único dispositivo al bus.
	movlw	DS1820_Read_Scratchpad_Command ; Va a leer la primera posición de memoria,
	call	Bus1Linea_EscribeByte	; donde se localiza el valor de la temperatura.
	call	Bus1Linea_LeeByte		; Lee la temperatura en 
	movwf	DS1820_Temperatura	; complemento a 2.
	call	Bus1Linea_LeeByte		; Ahora lee el segundo byte que indica el signo
	movwf	DS1820_TemperaturaSigno	; de la temperatura.
	call	Bus1Linea_Reset		; Y para terminar, resetea el dispositivo.
;
; Ahora deduce si la temperatura es positiva o negativa y halla su valor absoluto.
;
	btfss	DS1820_TemperaturaSigno,7	; Si cualquier bit es "1": temperatura negativa.
	goto	DS1820_FinLeeTemperatura	; La temperatura es positiva y salta.
DS1820_TemperaturaNegativa
	movf	DS1820_Temperatura,W	; La niega para convertirla a su valor
	sublw	0x00			; absoluto. Para ello, simplemente le resta de
	movwf	DS1820_Temperatura	; cero.
DS1820_FinLeeTemperatura
	bcf 	STATUS,C		; Para no corromper luego el MSB.
	rrf 	DS1820_Temperatura,F	; Obtiene el valor absoluto de la temperatura.
	movlw	.5
	btfss	STATUS,C		; Si el bit LSB es "1", la temperatura
	clrw				; medida es "xx.5ºC" sino "xx.0ºC".
	movwf	DS1820_TemperaturaDecimal
	movf	DS1820_Temperatura,W	; En (W) la parte entera del valor absoluto de la
	return				; temperatura.
	END
     