'########################################
'# Pour PICAXE-08M2 et MAXIM DS3231 RTC #
'# MM 12072016 #
'########################################
' Plage de dates entre 2000 et 2100
' Affichage des données sur LCD série port LCD
;MISE A L'HEURE:
;Appui sur poussoir
;Faire défiler les chiffres par appuis sur le poussoir
;Lorsque le bon chiffre apparait, attendre 2 secondes
;Le chiffre est mémorisé et on passe au suivant
;A la fin, réparer la minute entière suivante
; Affichage "TOP SYNCHRO" pour attendre la seconde "S"
;appuyer sur pouss et relacher lorsque la seconde tombe
;l'écran affiche la date et l'heure
#picaxe 08m2
SetFreq m8
symbol baud=N2400_8 'liaison série à 2400 bauds 8 Mhz
pullup %1000 ;pullup sur C.3
'***** Nomination des ports *********
symbol LCD =C.0
symbol pouss = pinC.3 'poussoir poussation
'***** Nomination des variables type byte ***********
symbol ch =b1 'chiffre
symbol dch =b2 'chiffre diz
symbol col =b3 'n° colonne
symbol varb =b4 'temporaire byte
symbol jour =b5
symbol mois =b6
symbol heure =b7
symbol minut =b8
symbol second =b9
'***** Nomination des variables type word **********
symbol joursem =w11
symbol varw =w12 'temporaire word
symbol an =w13
'******************************************
pause 500 'temps initialisation LCD
' Initialisation DS3231
'****** %11010000 est l'adresse i2c ********
hi2csetup i2cmaster,%11010000, i2cslow, i2cbyte ;init I2C
#macro transdectobcd(varb) ;transformation de dec vers bcd, y a pas sur M2...
dch=varb//10
varb=varb/10*16 'mises au format BCD
varb=varb+dch 'pour enregistrement
#endmacro
Do 'boucle principale
if pouss=0 then gosub init ;un appui sur poussoir pour le réglage
hi2cin 3,(varb) ' jour de semaine lu dans le registre 3
bcdtoascii varb,dch,ch ' DS1307 les données sont au format BCD
serout LCD,baud,(254,128)
if ch="1" then serout LCD,baud,(" Dim ") 'affichage du jour de la semaine
elseif ch="2" then serout LCD,baud,(" Lun ")
elseif ch="3" then serout LCD,baud,(" Mar ")
elseif ch="4" then serout LCD,baud,(" Mer ")
elseif ch="5" then serout LCD,baud,(" Jeu ")
elseif ch="6" then serout LCD,baud,(" Ven ")
elseif ch="7" then serout LCD,baud,(" Sam ")
endif
hi2cin 4,(jour) ' jour lu dans le registre 4
bcdtoascii jour,dch,ch
serout LCD,baud,(dch,ch,"/")
hi2cin 5,(mois) ' mois lu dans le registre 5
bcdtoascii mois,dch,ch
serout LCD,baud,(dch,ch,"/")
hi2cin 6,(an) ' année lue dans le registre 6.
bcdtoascii an,dch,ch
serout LCD,baud,("20",dch,ch," ")
serout LCD,baud,(254,192)
hi2cin 2,(heure) ' heure lue dans le registre 2
bcdtoascii heure,dch,ch
serout LCD,baud,(254,192," ",dch,ch)
hi2cin 1,(minut) ' Minute lue dans le registre 1
bcdtoascii minut,dch,ch
serout LCD,baud,(":",dch,ch)
hi2cin 0,(second) ' Seconde lue dans le registre 0
bcdtoascii second,dch,ch
serout LCD,baud,(":",dch,ch," ")
loop ' fin boucle principale
'******* Initialisation du DS1307 ************************
init: ;Procédure intro date et heure
;Do: loop while pouss=0 'attente relachement poussoir
serout LCD,baud,(254,1) 'Effacement écran
serout LCD,baud,(254,128,"20aa/MM/jj hh:mm ") 'Modèle du format
'********* an ***************
Do: loop while pouss=0 'Attente relachement poussoir
col=194 'Position colonne 1er chiffre
gosub chiffre 'routine affichage
dch=ch 'mémoire dizaine
col=195 'position 2éme chiffre
gosub chiffre
an=dch*10+ch 'nombre année
'******* mois ********
col=197
gosub chiffre
dch=ch
col=198
gosub chiffre
mois=dch*10+ch
'****** jour ********
col=200 'chiffre des dizaines
gosub chiffre
dch=ch
col=201 'chiffre des unités
gosub chiffre
jour=dch*10+ch
'******** heure **************
col=203
gosub chiffre
dch= ch
col=204
gosub chiffre
heure=dch*10+ch
'******** minutes **********
col=206
gosub chiffre
dch= ch
col=207
gosub chiffre
minut=dch*10+ch
'***** calcul joursem ****************
'L'algorithme de Mike Keith numérote de 0 à 6
'Dim=0, Lun=1,...,Sam=6
an= 2000+an
if mois < 3 then
varw=an-1
else varw=an
end if
joursem= 23*mois/9 +jour+4+an
w10=varw/4
joursem=joursem+w10
w10=varw/100
joursem=joursem-w10
w10=varw/400
joursem=joursem+w10
if mois>= 3 then
joursem=joursem-2
endif
joursem=joursem//7+1 ;+1 pour numérotation de 1 à 7 idem DS1307
'***********************************************
transdectobcd(minut)
transdectobcd(heure)
transdectobcd(jour)
transdectobcd(mois)
an=an-2000
transdectobcd(an)
serout LCD,baud,(254,1,254,131,"TOP SYNCHRO",254,194,"au relachement") ;c'est prêt
do loop while pouss=1 ;appui à s-qques secondes
do loop while pouss=0 ;relâchement quand la seconde tombe
hi2cout 0, ($00,minut,heure,joursem,jour,mois,an,%00010000)
return
'******* Sous programme affichage et incrémentation ***************
chiffre:
ch=0
serout LCD,baud,(254,col,#ch)
Do
serout LCD,baud,(254,col,#ch)
do loop while pouss=0
time=0
do
if time > 1 then retour
pause 10
loop while pouss=1
inc ch
if ch>9 then
ch=0
endif
loop
retour:
return