programa para escribir y leer un rtc ds1307

6
;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

Upload: jose-biafore

Post on 29-Oct-2015

43 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Programa Para Escribir y Leer Un RTC DS1307

          ;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

Page 2: Programa Para Escribir y Leer Un RTC DS1307

                                   ;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

Page 3: Programa Para Escribir y Leer Un RTC DS1307

        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

Page 4: Programa Para Escribir y Leer Un RTC DS1307

    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

Page 5: Programa Para Escribir y Leer Un RTC DS1307

           lcdout $fe,1,"ALARMA"            PAUSE 3000            RETURN