' LCD ALPHANUMERIQUE SERIE ET PICAXE 08M2
; Temporisareur cyclique programmable
; Maj 13/06/2003
#picaxe 08M2 'directive 08M2
symbol baud=N4800_16 'liaison série à 4800bauds 16Mhz
'*********** Nomination des I/O ***************
symbol sortie=C.4 'Sortie sur C.0
symbol pouss=pinC.3 'Poussoir sur pinC3
symbol LCD=C.2 'port LCD
symbol potent=C.1 'potentiomètre
'*********** Nomination des variables type bit/byte *********
symbol flag=bit0
symbol potar=b1 ;valeur pot
symbol dhr=b2 ;dizaine d'h
symbol hr=b3 ;heures
symbol dmn=b4 ;diz de mn
symbol mn=b5 ;min
symbol dsec=b6 ;diz de sec
symbol sec=b7 ;secondes
symbol var1=b8 ;variable temporaire byte
'*********** Nomination des variables type word *********
symbol var2=w9 ;variable temporaire word
symbol temps= w10
symbol memo = w11 ;mémorisation temps
symbol tempsON= w12
symbol tempsOFF= w13
'******************************************
setfreq m16 'fréquence horloge 16 MHz
pause 500 'pause pour initialisation LCD
'***** Affichage fixe ***************************************
init:
low sortie
serout LCD,baud,(254,1) 'Effacement écran
serout LCD,baud,(254,128,"MA /") 'position ligne 1
serout LCD,baud,(254,192,"AR /") 'position ligne 2
read 0,word TempsOn,word TempsOff 'lecture réglages en mémoire
If TempsOn=0 OR flag=1 then ;si pas de temps mémorisés
gosub lectemps ;passage au réglage des tempos
else 'sinon, reprise des temps enregistrés
temps=tempsOn
gosub conver 'conversion temps On
serout LCD,baud,(254,138,dhr,hr,dmn,mn,dsec,sec) 'affichage
temps=tempsOff '
gosub conver 'conversion temps Off
serout LCD,baud,(254,202,dhr,hr,dmn,mn,dsec,sec)
end if
'******************************************************
debut: 'En inversant les lignes, on change le cycle de départ
goto arret 'demarrage par le cycle "Arret"
goto marche 'cette ligne, en option, n'est pas prise en compte
'*****************************************************************
marche: 'Sub moteur ON
time=0 'variable système: +1 toutes les secondes
memo=0
high sortie 'sortie passe à 5 volts
Do 'boucle sortie ON
temps=tempsON-time
if memo<>time then 'affichage temps UNE fois chaque seconde,pas plus
gosub conver
serout LCD,baud,(254,131,dhr,hr,dmn,mn,dsec,sec)'position ligne4, col8
memo=time
endif
if pouss =1 then 'Bascule entre les deux boucles par poussoir
time=0
Do
If time>5 then
flag=1
goto init
endif
Loop while pouss=1 'attente relachement du poussoir
serout LCD,baud,(254,131," ") 'effacement position ligne4, col8
goto arret
endif
Loop while time < TempsOn 'fin de boucle tant que time < ...
serout LCD,baud,(254,131," ") ' effacement
goto arret
'*******************************************************
arret: 'Sub sortie OFF
time=0
memo=0
low sortie 'LCD passe à 0 volt
Do 'Boucle sortie OFF
temps=TempsOff-time 'affichage temps restant
if memo<>time then 'exécution de serout UNE fois chaque seconde seconde
gosub conver
serout LCD,baud,(254,195,dhr,hr,dmn,mn,dsec,sec)
memo=time
endif
'Bascule entre les deux boucles par poussoir C.3
if pouss =1 then
time=0
Do
If time>5 then
flag=1
goto init
endif
Loop while pouss=1 'attente relachement du poussoir 'attente relachement du poussoir
serout LCD,baud,(254,195," ") 'position ligne4, col13
goto marche
endif
Loop while time < TempsOff 'fin de boucle sortie Off
serout LCD,baud,(254,195," ") 'effacement position ligne4, col13
goto marche
'*********** 'Sous programmes réglage de TempsON et TempsOFF *****************
;************ et mise à l'echelle ***************************
lectemps:
flag=0
serout LCD,baud,(254,128,"MA hhmmss/") 'position ligne 1
serout LCD,baud,(254,192,"AR hhmmss/") 'position ligne 2
do:loop while pouss=1 ;attente relachement modif en cours de cycle
'Lecture temps ON
memo=0
var1=138 'position curseur
gosub lecpot 'lecture potentiomètre
TempsOn= memo 'enregistrement du temps en secondes
'Lecture temps OFF
memo=0
var1=202
gosub lecpot
TempsOff= memo
write 0,word TempsOn,word TempsOff 'sauvegarde en EEPROM
serout LCD,baud,(254,131," ") 'position ligne 1 col 4
serout LCD,baud,(254,195," ") 'position ligne 2 col 4
return
'******* 'Sous programme lecture du potentiomètre ***************************
lecpot:
Do 'boucle Do principale
readadc potent, potar 'lecture du pot
hr= 17 *potar/254 'mise à l'échelle
var2=hr 'mémo hr
dhr=hr/10+48 'dizaines d'hr
hr=hr//10+48 'unités hr
serout LCD,baud,(254,var1,dhr,hr) 'écriture LCD
If pouss=1 then 'pression poussoir
Do:loop while pouss=1 'attente relachement
Exit 'sortie boucle Do principale
endif
loop
memo=var2*3600 'mémo nombre hr en secondes
var1=var1+2 'incrémentation curseur
Do
readadc potent, potar
mn= 59 *potar/254
var2=mn
dmn=mn/10+48
mn=mn//10+48 '
serout LCD,baud,(254,var1,dmn,mn)
If pouss=1 then
Do:loop while pouss=1
Exit
endif
loop
memo=var2*60+memo
var1=var1+2
Do
readadc potent, potar
sec= 59 *potar/254
var2=sec
dsec=sec/10+48
sec=sec//10+48
serout LCD,baud,(254,var1,dsec,sec)
If pouss=1 then
Do:loop while pouss=1
Exit
endif
loop
memo=memo+var2
return
'***************************************************
conver: 'Ici, on décompose le temps en heures, minutes et secondes
'puis +48 pour le code ascii
hr=temps/3600 'heures entières
sec=temps//60 'reste secondes
var2=3600*hr 'heures entières en minutes
var2=temps-var2-sec 'minutes entières en secondes
mn=var2/60 'minutes entières en mn
dhr=hr/10+48 'chiffre diz heures
hr=hr//10+48 'chiffre heures
dmn=mn/10+48 'chiffre diz mn
mn=mn//10+48 'chiffre mn
dsec=sec/10+48 'chiffre dizaines de secondes
sec=sec//10+48 'chiffre unités de secondes
return
'****************************************************************