Ejemplo RELOJ RTC
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;Programa para escribir y leer un RTC DS1307
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ADCON1=%0111
ADCON0.0=0
CMCON=7
TRISB=%11011111
;OPTION_REG.7=1
define OSC 4
DEFINE LCD_DREG PORTA ' Set LCD Data port
DEFINE LCD_DBIT 0 ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA ' Set LCD Register Select port
DEFINE LCD_RSBIT 4 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTA ' Set LCD Enable port
DEFINE LCD_EBIT 5 ' Set LCD Enable bit
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Set command delay time in us
DEFINE LCD_DATAUS 50 ' Set data delay time in us
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits)
CPIN Var Portb.1 ;pin señal de reloj I2C
DPIN Var Portb.0 ;pin de datos I2C
UP VAR PORTB.2
DOWN_MODE VAR PORTB.3
SET VAR PORTB.4
ALARMA VAR PORTB.5
POS VAR BYTE
ALARMA=0
X VAR BYTE
FLAG VAR BIT
TIMEX VAR BYTE
LIMIT VAR BYTE
Ahora VAR byte
Amin 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]
I2CREAD DPIN,CPIN,%11010000,5,[mes]
I2CREAD DPIN,CPIN,%11010000,6,[anio]
;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)
lcdout $fe,$c0 ; saltar a la 2da línea del LCD
if diaS=$1 then lcdout "Dom." ;mostrar día de la semana
if diaS=$2 then lcdout "Lun."
if diaS=$3 then lcdout "Mar."
if diaS=$4 then lcdout "Mie."
if diaS=$5 then lcdout "Jue."
if diaS=$6 then lcdout "Vie."
if diaS=$7 then lcdout "Sab."
lcdout $fe,$c5,hex2 diaF,"-" ;mostrar el día del mes /
lcdout $fe,$cB,"-20",hex2 anio ; mostrar año /20 + 09
lcdout $fe,$c8 ;pasar a la casilla 8
if mes=$1 then lcdout "ENE" ;mostrar el mes
if mes=$2 then lcdout "FEB"
if mes=$3 then lcdout "MAR"
if mes=$4 then lcdout "ABR"
if mes=$5 then lcdout "MAY"
if mes=$6 then lcdout "JUN"
if mes=$7 then lcdout "JUL"
if mes=$8 then lcdout "AGO"
if mes=$9 then lcdout "SEP"
if mes=$10 then lcdout "OCT"
if mes=$11 then lcdout "NOV"
if mes=$12 then lcdout "DIC"
PAUSE 300 ;esperar 0,3 segundo
GOSUB TECLAS
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,6,[$09] ;setear año 09
Pause 10
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
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ANTIRREBOTE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TECLAS:
;FLAG=0
FOR X = 1 TO 200
if DOWN_MODE == 0 THEN CNFG_ALARM
if SET == 0 then
PAUSE 200
IF SET == 0 THEN GOTO SET_TIME
ENDIF
FLAG=1 ;bandera de tecla; evita que cuente + de 1 vez
NEXT
RETURN
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SET_TIME:
POS=$80
LIMIT=36
TIMEX=HORA
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,2,[TIMEX]
PAUSE 10
POS=$83
TIMEX=MINU
LIMIT=90
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,1,[TIMEX]
PAUSE 10
POS=$C0
TIMEX=diaS
LIMIT=8
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,3,[TIMEX]
PAUSE 10
POS=$C4
TIMEX=diaf
LIMIT=50
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,4,[TIMEX]
PAUSE 10
POS=$C8
TIMEX=mes
LIMIT=19
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,5,[TIMEX]
PAUSE 10
POS=$Ce
TIMEX=anio
LIMIT=50
GOSUB CHD
I2CWRITE DPIN,CPIN,%11010000,6,[TIMEX]
PAUSE 10
IF SET == 0 THEN GOTO INICIO
CHD:
REPEAT
TEMP1=TIMEX
IF UP == 0 THEN
if (TEMP1 == $39) OR (TEMP1 == $49) or (TEMP1 == $9) THEN
TIMEX=TIMEX+7
ELSE
TIMEX=TIMEX+1
ENDIF
if (TEMP1 == $19) OR (TEMP1 == $29) THEN TIMEX=TIMEX+7
ENDIF
IF TIMEX == LIMIT THEN TIMEX = 0
IF DOWN_MODE == 0 THEN
if (TEMP1 == $30) OR (TEMP1 == $40) THEN
TIMEX=TIMEX-7
ELSE
if TEMP1>0 then TIMEX=TIMEX-1
ENDIF
if (TEMP1 == $10) OR (TEMP1 == $20) THEN TIMEX=TIMEX-7
ENDIF
lcdout $fe,POS, "__ "
PAUSE 200
lcdout $fe,POS, HEX2 TIMEX;," "
PAUSE 200
UNTIL SET == 0
PAUSE 100
RETURN
CNFG_ALARM:
if FLAG = 0 then return ;bandera de tecla
FLAG = 0 ;bandera de tecla, cuando ya ha sido pulsada
lcdout $fe,1,"ALARMA"
PAUSE 3000
RETURN