;------------------------------------------------------------------------
;Programa para escribir y leer un RTC DS1307
include "modedefs.bas"
;OPTION_REG.7=1
Define LCD_DREG PORTB ;usamos puertoB como salida de datos
Define LCD_DBIT 4
Define LCD_RSREG PORTB ;RS va conectado a puertoB
Define LCD_RSBIT 2 ; RS a Rb5
Define LCD_EREG PORTB ; E va conectado a puertoB
Define LCD_EBIT 3
DEFINE LCD_COMANDUS 2000
DEFINE LCD_DATAUS 600
CPIN Var PortA.3 ;pin señal de reloj I2C
DPIN Var PortA.4 ;pin de datos I2C
UP VAR PORTA.0
DOWN_MODE VAR PORTA.1
SET VAR PORTA.2
TX VAR PORTB.1
POS VAR BYTE
X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE
LIMIT VAR BYTE
segu var byte ;definir tamaño de variable segundos 1 a 255
minu var byte ;variable para los minutos
hora var byte ;variable para las horas
diaS var byte ;variable día de la semana
diaF var byte ;variable día fecha del mes
mes var byte ;variable mes
anio var byte ;variable año de 2 dígitos
XTEMP VAR BYTE
TEMP1 VAR BYTE
dato VAR BYTE ;variable para almacenar dato leído
actualizado VAR BIT ;variable para almacenar un 1 o 0
EEPROM 0,[0] ;memoria 0 con el valor inicial 0 , sirve para
;indicar que nunca ha corrido este programa
READ 0,actualizado ;carga el valor de la memoria EEPROM dirección 0
IF actualizado =0 THEN grabarRTC ;si es la 1ra vez que corre ir a grabar RTC
;caso contrario solo leer el RTC
INICIO:
I2CREAD DPIN,CPIN,%11010000,0,[segu] ;leer los datos de mem. 0,
I2CREAD DPIN,CPIN,%11010000,1,[minu] ;1,2,..y guardarlos en sus
I2CREAD DPIN,CPIN,%11010000,2,[hora] ;respectivas variables
I2CREAD DPIN,CPIN,%11010000,3,[diaS]
I2CREAD DPIN,CPIN,%11010000,4,[diaF]
;hora=((hora DIG 1)*16)+(hora DIG 0)
;minu=((minu DIG 1)*16)+(minu DIG 0)
;lcdout $fe,1,DEC2 hora,":",DEC2 minu,":",hex2 segu
lcdout $fe,1,HEX2 hora,":",HEX2 minu,":",HEX2 segu;, " ",DEC2 TEMP1 ;mostrar la
;hora minuto y segundos en 2 dígitos (HEX2)
PAUSE 300 ;esperar 0,3 segundo
goto inicio ;volver a leer los datos
; ************************ subrutina grabar *********************
grabarRTC:
I2CWRITE DPIN,CPIN,%11010000,0,[$00] ;setear 00 segundos
Pause 10 ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$39] ;setear 39 minutos
Pause 10
I2CWRITE DPIN,CPIN,%11010000,2,[$23] ;setear las 23 horas
Pause 10
I2CWRITE DPIN,CPIN,%11010000,3,[$5] ;setear día lunes ,D=1,L=2
Pause 10 ;M=3 , M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$06] ;setear día 27 del mes
Pause 10
I2CWRITE DPIN,CPIN,%11010000,5,[$8] ;setear mes agosto
Pause 50
I2CWRITE DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
Pause 10 ;encender el led cada 1 seg.
WRITE 0,1 ;escribe en la memoria 0 el valor de 1 para que no
;se vuelva a grabar otra vez estos datos en el RTC
goto inicio ;ir a presentar los datos en el LCD
end