Ta baterka je tam jen z důvodu, aby vše zálohovala když je obvod bez napájení, jinak by se vybíjet neměla.
Do toho obvodu můžeš nahrávat nebo z něho číst data která potřebuješ. Takže pokud potřebuješ např. změnit jen tu jednu minutu, dáš odkaz na tlačítko po jehož stisknutí se provede přičtení +1 minuta k reálné minutě (to je ta kterou jsi si právě načetl) a provedeš zápis té upravené minuty. Tím se ti další minuta načte už změněná.
Pak je tam ještě problém s tím, že ten obvod komunikuje v BCD soustavě a je to třeba převádět na desítkovou. To jsem probíral zde:
Takhle nějak to vypadalo v cvičném programu. Funkce je ale bez záruky, narychlo jsem jen něco vytáhl z PC a ani už nevím zda je to jako celek funkční.
setfreq m4
symbol baud=N4800
pullup %0001110000000000 ;zapne rezistory na C2,C3,C4 kvůli tlačítkům
serout C.1, baud, (254,1) ;maže LCD
let b10=0
symbol seconds = b0
symbol mins = b1
symbol hour = b2
symbol day = b3
symbol date = b4
symbol month = b5
symbol year = b6
symbol control = b7
;jednorázové naprogramování času, datumu.. provede se pouze jednou při prvním zapojení obvodu RTC
;i2cslave %11010000, i2cslow, i2cbyte
;let day = $3 ; den v týdnu
;let year = $16 ; rok
;let month = $3 ; měsíc
;let date = $3 ; den
;let hour = $10 ; hodiny
;let mins = $49 ; minuty
;let seconds = $0 ; sekundy
;writei2c 14, ($0) ' DS3231 turn on $0 1hz pin3, turn off $4
;writei2c 0,(seconds,mins,hour,day,date,month,year,control)
;----- načtení času -----
start:
gosub lcd
if pinc.3=0 then start ;ošetření tlačítek
if pinc.4=0 then start ;ošetření tlačítek
cas:
if pinc.3=0 then minplus ;tlačítko co minutu přidá
if pinc.4=0 then minminus ;tlačítko co minutu ubere
i2cslave %11010000, i2cslow, i2cbyte ;načtení času z RTC
readi2c 0,(seconds,mins,hour,day,date,month,year)
gosub lcd
goto cas
; přepočet z BCB na desítky
lcd:
let b20=b0 ;přepočet sekundy
let b20=b20/16*10
let b0 = b0//16+b20
let b21=b1 ;přepočet minuty
let b21=b21/16*10
let b1 = b1//16+b21
let b22=b2 ;přepočet hodiny
let b22=b22/16*10
let b2 = b2//16+b22
let b23=b3 ;přepočet dny v týdnu
let b23=b23/16*10
let b3 = b3//16+b23
let b24=b4 ;přepočet dny
let b24=b24/16*10
let b4 = b4//16+b24
let b25=b5 ;přepočet měsíce
let b25=b25/16*10
let b5 = b5//16+b25
let b26=b6 ;přepočet rok
let b26=b26/16*10
let b6 = b6//16+b26
; výpis času na LCD
if b4<10 then serout C.1, baud, (254,128) serout C.1, baud, ("0",#b4,".")endif
if b4>9 then serout C.1, baud, (254,128) serout C.1, baud, (#b4,".")endif
if b5<10 then serout C.1, baud, (254,131) serout C.1, baud, ("0",#b5,".")endif
if b5>9 then serout C.1, baud, (254,131) serout C.1, baud, (#b5,".")endif
serout C.1, baud, (254,134) serout C.1, baud, ("20",#b6)
serout c.1, baud, (254,139) ;den v týdnu
if b3 = 0 then serout c.1, baud, ("Po")endif
if b3 = 1 then serout c.1, baud, ("Ut")endif
if b3 = 2 then serout c.1, baud, ("St")endif
if b3 = 3 then serout c.1, baud, ("Ct")endif
if b3 = 4 then serout c.1, baud, ("Pa")endif
if b3 = 5 then serout c.1, baud, ("So")endif
if b3 = 6 then serout c.1, baud, ("Ne")endif
serout c.1, baud, (254,142)
if b21<10 then serout C.1, baud, (254,142) serout C.1, baud, ("0",#b1,":")endif
if b21>9 then serout C.1, baud, (254,142) serout C.1, baud, (#b1,":")endif
if b2<10 then serout C.1, baud, (254,148) serout C.1, baud, ("0",#b2,":")endif
if b2>9 then serout C.1, baud, (254,148) serout C.1, baud, (#b2,":")endif
if b1<10 then serout C.1, baud, (254,151) serout C.1, baud, ("0",#b1,":")endif
if b1>9 then serout C.1, baud, (254,151) serout C.1, baud, (#b1,":")endif
if b0<10 then serout C.1, baud, (254,154) serout C.1, baud, ("0",#b0)endif
if b0>9 then serout C.1, baud, (254,154) serout C.1, baud, (#b0)endif
return
;------nastavení hodin-----
minplus:
let b1=b1+1
if b1=60 then:b1=0:b2=b2+1 end if ;překročení hodiny
if b2=24 then : b2=0 end if ;překročení půlnoci
gosub lcd
goto zapiscasu
minminus:
let b1=b1-1
if b1<0 then:b1=0:b2=b2-1 end if ;překročení O hodin
if b2<0 then : b2=23 end if ;překročení půlnoci
gosub lcd
goto zapiscasu
zapiscasu:
if b1>14 then : b1=b1+12 endif
gosub lcd
if pinc.3=0 then zapiscasu
if pinc.4=0 then zapiscasu
gosub lcd
i2cslave %11010000, i2cslow, i2cbyte
let seconds = $59
let mins = b1
let hour = b2
writei2c 14, ($0) ' DS3231 turn on $0 1hz pin3, turn off $4
writei2c 0,(seconds,mins,hour)
goto start