You are on page 1of 7

RELOJ EN TIEMPO REAL USANDO EL DS 1307

$regfile = "m164pdef.dat" $crystal = 4000000 'DECLARACION DE VARIABLES Dim Seg As Byte , Minu As Byte , Hor As Byte Dim Segh As Byte , Segl As Byte Dim Minuh As Byte , Minul As Byte Dim Horh As Byte , Horl As Byte Dim Dia As Byte , Mes As Byte , Anio As Byte Dim Diah As Byte , Dial As Byte Dim Mesh As Byte , Mesl As Byte Dim Anioh As Byte , Aniol As Byte Dim Auxl As Byte , Auxh As Byte Dim I As Byte Dim Habilitar As Bit Dim Value As Byte Dim Dato As Byte Dim Uni As Byte , Decen As Byte , Num As Byte Const Ds1307_write = &HD0 Const Ds1307_read = &HD1 Declare Sub Hab Declare Sub Subir Declare Sub Cambiar Ddra = 0 Porta = 255 Config Portb = Output Config Portd = Input Mcucr = 0

'CONFIGURACION DE I2C Config Scl = Portc.0 Config Sda = Portc.1 I2cinit 'CONFIGURACIN DE INTERRRUPCIONES Pcmsk0 = &B00000011 On Pcint0 Fijar_h Nosave Enable Pcint0 Config Lcd = 16 * 2 Cls

Cursor Off Noblink Enable Interrupts 'INICIALIZACION DE VARIABLES Habilitar = 0 Value = 0 Dato = 0 I2cstart I2cwbyte Ds1307_write I2cwbyte &B00000000 I2cwbyte &B00000000 I2cstop Waitms 10 I2cstart I2cwbyte Ds1307_write I2cwbyte &H7 I2cwbyte &B10010000 I2cstop Waitms 10 Locate 1 , 1 Lcd "Hora :" Locate 2 , 1 Lcd "Fecha:" Do If Habilitar = 0 Then Gosub Leer Gosub Convertir Gosub Pantalla Else If Habilitar = 1 Then Cursor On Blink I2cstart I2cwbyte Ds1307_write I2cwbyte &H00 I2cwbyte &B10000000 I2cstop Waitms 10 Do Gosub Empezar_igualar Loop Until Habilitar = 0 End If

End If Loop

'LEER DATO DE DALLAS1307 Leer: I2cstart I2cwbyte Ds1307_write I2cwbyte &H00 I2cstart I2cwbyte Ds1307_read I2crbyte Seg , Nack I2cstop I2cstart I2cwbyte Ds1307_write I2cwbyte &H01 I2cstart I2cwbyte Ds1307_read I2crbyte Minu , Nack I2cstop I2cstart I2cwbyte Ds1307_write I2cwbyte &H02 I2cstart I2cwbyte Ds1307_read I2crbyte Hor , Nack I2cstop I2cstart I2cwbyte Ds1307_write I2cwbyte &H04 I2cstart I2cwbyte Ds1307_read I2crbyte Dia , Nack I2cstop I2cstart I2cwbyte Ds1307_write I2cwbyte &H05 I2cstart I2cwbyte Ds1307_read I2crbyte Mes , Nack I2cstop I2cstart I2cwbyte Ds1307_write

I2cwbyte &H06 I2cstart I2cwbyte Ds1307_read I2crbyte Anio , Nack I2cstop Return

Pantalla: Locate 1 , 9 Lcd Horh ; Horl ; ":" ; Minuh ; Minul ; ":" ; Segh ; Segl Locate 2 , 9 Lcd Diah ; Dial ; "/" ; Mesh ; Mesl ; "/" ; Anioh ; Aniol Waitms 10 Return

Convertir: Segl = Seg And &B0000_1111 Segh = Seg And &B1111_0000 Segh = Segh / 16 Minul = Minu And &B0000_1111 Minuh = Minu And &B1111_0000 Minuh = Minuh / 16 Horl = Hor And &B0000_1111 Horh = Hor And &B1111_0000 Horh = Horh / 16

Dial = Dia And &B0000_1111 Diah = Dia And &B1111_0000 Diah = Diah / 16 Mesl = Mes And &B0000_1111 Mesh = Mes And &B1111_0000 Mesh = Mesh / 16 Aniol = Anio And &B0000_1111 Anioh = Anio And &B1111_0000 Anioh = Anioh / 16 Return Fijar_h: I = Pina

I = I Or &B11111100 Waitms 10 Select Case I Case &B11111101 : Call Hab Case &B11111110 : Call Subir Case &B11111100: Call Cambiar Case Else nop End Select Return

Sub Hab Toggle Habilitar Value = 0 Num = 0 Dato = 0 End Sub

Sub Subir Select Case Value Case 0 If Dato < 59 Then Dato = Dato + 1 Else Dato = 0 End If Case 1 If Dato < 59 Then Dato = Dato + 1 Else Dato = 0 End If Case 2 If Dato < 23 Then Dato = Dato + 1 Else Dato = 0 End If

Case 4 If Dato < 31 Then Dato = Dato + 1 Else Dato = 0 End If Case 5 If Dato < 12 Then Dato = Dato + 1 Else Dato = 0 End If Case 6 If Dato < 99 Then Dato = Dato + 1 Else Dato = 0 End If End Select

Decen = Dato / 10 Uni = Dato Mod 10 Num = Decen * 16 Num = Num + Uni End Sub Sub Cambiar Num = 0 Dato = 0 If Value < 6 Then Value = Value + 1 Else Value = 0 End If If Value = 3 Then Value = 4 End If 'I2cstart 'I2cwbyte Ds1307_write 'I2cwbyte Value 'I2cstart 'I2cwbyte Ds1307_read 'I2crbyte Dato , Nack 'I2cstop

'I2cstart

End Sub

Empezar_igualar: I2cstart I2cwbyte Ds1307_write I2cwbyte Value I2cwbyte Num I2cstop Waitms 10 Gosub Leer Gosub Convertir Gosub Pantalla Return

You might also like