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