Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Date and time changing, with a RTC DS1307

Status
Not open for further replies.

fenixmiticus

Newbie level 1
Joined
May 21, 2010
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,338
Hi there!

Can anyone help me with this rtc? Actually , this code implemented on proteus gives the current time and date, synchronized with my computer.
The question is, how can I create a routine that allows me to change the hour, minut, second or date?
Here is my code

CODE:
;rotinas de trabalho com a rtc ds1307 da Dallas
;
; - inirtc: inicializa o rtc
;
;
;portos e registos do rtc ds1307
;
ds1307w .equ 11010000b ;identificacao do ds1307 na escrita
ds1307r .equ 11010001b ;identificacao do ds1307 na leitura
ds1307_scl .equ p3.1
ds1307_sda .equ p3.0
address .equ 01101000b
ds1307flags .equ 20h ;posição de flags do ds1307
ds1307_lastrd .equ 00h ;
ds1307_1224 .equ 01h ;flag para indicar dia de 12 ou 24 horas
ds1307_pmam .equ 02h ;flag para indicar hora am ou pm
ds1307_osc .equ 03h
ds1307_sqw .equ 04h ;flag para indicar geracao de onda quadrada
ds1307_ack .equ 05h
ds1307_fault .equ 06h
ds1307_busy .equ 07h

;inicializa o rtc escrevendo no Control Register
;
; - entrada: o acumulador possui o valor da inicialização
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_ini
setb ds1307_sda ;linha de dados em estado alto
lcall ds1307_sclhigh ;linha de clock em estado alto

clr ds1307_ack ;zera flags
clr ds1307_fault
ret

;inicializa dados do rtc
;
; - entrada: r0 aponta para um buffer que contem os dados a escrever
; - saida: nenhuma
; - registos alterados: acumulador
;
inidatartc

ret

;le as horas do rtc e coloca no lcd
;
; - entrada:
; - saida: nenhuma
; - registos alterados: acumulador
;
rddatartc

ret

;envia condicao de start
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_sendstart
setb ds1307_busy
clr ds1307_ack
clr ds1307_fault
jnb ds1307_scl,ds1307_sendstart_fault
jnb ds1307_sda,ds1307_sendstart_fault
setb ds1307_sda
lcall ds1307_sclhigh
clr ds1307_sda
lcall ds1307_delayone
clr ds1307_scl
ret

ds1307_sendstart_fault
setb ds1307_fault
ret

;envia condicao de stop
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: acumulador
;
ds1307_sendstop
clr ds1307_sda
lcall ds1307_sclhigh
setb ds1307_sda
clr ds1307_busy
ret

;escreve um byte no ds1307
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: acumulador
;
ds1307_wrdata
mov r0,#08h ;8bits

ds1307_wrdata_lp
jnb acc.7,ds1307_wrdata_notone
setb ds1307_sda
sjmp ds1307_wrdata_one

ds1307_wrdata_notone
clr ds1307_sda

ds1307_wrdata_one
lcall ds1307_sclhigh
rl a
clr ds1307_scl
djnz r0,ds1307_wrdata_lp
setb ds1307_sda
lcall ds1307_sclhigh
clr ds1307_ack
jnb ds1307_sda,ds1307_wrdata_exit
setb ds1307_ack

ds1307_wrdata_exit
lcall ds1307_delayone
clr ds1307_scl
lcall ds1307_delayone

ret

;le um byte do ds1307
;
; - entrada: nenhuma
; - saida: acumulador com o byte lido
; - registos alterados: acumulador, r0
;
ds1307_rddata
mov r0,#08h ;8bits
mov a,#00h
setb ds1307_sda
ds1307_rddata_rdbits
lcall ds1307_sclhigh
mov c,ds1307_sda
rlc a
clr ds1307_scl
djnz r0,ds1307_rddata_rdbits
jb ds1307_lastrd,ds1307_rddata_ack
clr ds1307_sda
ds1307_rddata_ack
lcall ds1307_sclhigh
clr ds1307_scl

ret

;set clock line high
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_sclhigh
setb ds1307_scl
jnb ds1307_scl,$
ret

;delay de quatro ciclos
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_delayfour
nop
nop
nop
nop
ret

;delay de one ciclo
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_delayone
nop
ret

;activa geração de sinal de clock no pino sqw do ds1307
;
; - entrada: bit de ds1307_sqw deve estar activa
; acumulador: 90h para 1hz, 91h para 4khz, 92h para 8khz, 93h para 32khz
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_sqwout
push a
lcall ds1307_sendstart
mov a,#ds1307w
lcall ds1307_wrdata

mov a,#07h
lcall ds1307_wrdata

pop a
jnb ds1307_sqw,ds1307_sqwout_jp

mov a,#80h

ds1307_sqwout_jp
lcall ds1307_wrdata
lcall ds1307_sendstop

ret

;controlo do oscilador do ds1307
;
; - entrada: nenhuma
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_controlosc

lcall ds1307_sendstart
mov a,#ds1307w
lcall ds1307_wrdata
mov a,#00h
lcall ds1307_wrdata
setb ds1307_lastrd
lcall ds1307_sendstop
lcall ds1307_sendstart
mov a,#ds1307r
lcall ds1307_wrdata
lcall ds1307_rddata
clr acc.7
jnb ds1307_osc,ds1307_controlosc_jp
setb acc.7

ds1307_controlosc_jp

push a
lcall ds1307_sendstop
lcall ds1307_sendstart
mov a,#ds1307w
lcall ds1307_wrdata
mov a,#00h
lcall ds1307_wrdata
pop a
lcall ds1307_wrdata
lcall ds1307_sendstop

ret

;le o registo de segundos do ds1307
;
; - entrada: nenhuma
; - saida: o acumulador possui o valor lido no registo segundos
; - registos alterados: nenhum
;
ds1307_segundos

clr ds1307_lastrd

lcall ds1307_sendstart

mov a,#ds1307w
lcall ds1307_wrdata

mov a,#00h
lcall ds1307_wrdata

lcall ds1307_sendstop

lcall ds1307_sendstart

mov a,#ds1307r
lcall ds1307_wrdata

setb ds1307_lastrd

lcall ds1307_rddata

clr ds1307_osc

jnb acc.7,ds1307_segundos_jp

setb ds1307_osc

clr acc.7

ds1307_segundos_jp

lcall ds1307_sendstop

ret

;le as posicoes de relogio do ds1307
;
; - entrada: nenhuma
; - saida: no buffer 21h, 22h, 23h, 24h, 25h, 26h, 27h
; estao os dados lidos do ds1307
; - registos alterados: nenhum
;
ds1307_dados
mov r1,#21h
mov r7,#00h

clr ds1307_lastrd

lcall ds1307_sendstart

mov a,#ds1307w
lcall ds1307_wrdata

mov a,#00h
lcall ds1307_wrdata

lcall ds1307_sendstop

lcall ds1307_sendstart

mov a,#ds1307r
lcall ds1307_wrdata

ds1307_dados_loop
cjne r7,#07h,ds1307_notlast

setb ds1307_lastrd

ds1307_notlast
lcall ds1307_rddata

mov @r1,a

cjne r7,#00h,ds1307_dados_notfirst

clr ds1307_osc

mov a,@r1

jnb acc.7,ds1307_dados_jp

setb ds1307_osc

clr acc.7

mov @r1,a

ds1307_dados_jp
ds1307_dados_notfirst
inc r1
inc r7
cjne r7,#08h,ds1307_dados_loop

lcall ds1307_sendstop

ret

;le buffer em memória e escreve no LCD
;
; - entrada: no buffer 21h, 22h, 23h, 24h, 25h, 26h
; estao os dados a escrever no LCD
; - saida: nenhuma
; - registos alterados: nenhum
;
ds1307_2lcd

mov r1,#21h

mov a,#0c7h ;aponta posicao de mostrar segundos
lcall cmdo_lcd

mov a,@r1
lcall lcdhexascii

mov a,#0c4h ;aponta posicao de mostrar minutos
lcall cmdo_lcd

inc r1
mov a,@r1
anl a,#01111111b ;mascara mais significativo dos minutos

lcall lcdhexascii


mov a,#0c1h ;aponta posicao de mostrar horas
lcall cmdo_lcd

inc r1
mov a,@r1
anl a,#01111111b ;mascara mais significativo das horas

lcall lcdhexascii

mov a,#0cbh ;aponta posicao de mostrar dia
lcall cmdo_lcd

inc r1 ;salta o dia da semana

inc r1
mov a,@r1
anl a,#00111111b ;mascara mais significativo do dia

lcall lcdhexascii

mov a,#0ceh ;aponta posicao de mostrar mes
lcall cmdo_lcd

inc r1
mov a,@r1
anl a,#00011111b ;mascara mais significativo do mes

lcall lcdhexascii

mov a,#0d1h ;aponta posicao de mostrar ano
lcall cmdo_lcd

inc r1
mov a,@r1

lcall lcdhexascii

ret
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top