; chronomètre 1/10s MM 100626
; réglage par poussoirs +/-
;pour temps=9990 10ème s => tmax=16 mn 39s
;intro temps en mn et s
;les poussoirs sont sur le 0V,
;Broches avec pullup sur 20X2 : bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
;****** MODE D'EMPLOI **********
;A la mise sous tension, mémoire vide, passage auto en mode programmartion temps
;Mode Programmation du temps:
;Le point décimal est sur le digit 4 => valeur en secondes
;Appui sur plus1:
; appui court < 500ms => incrémentation de 1
; appui long > 500ms => défilemenrt rapide
;Appui sur moin1:
; Idem en décrémentation
;Appui sur MEM => clignotement vert + rouge => mise en mémoire EEPROM
;passage en mode décomptage
;Mode décomptage.
;Le point décimal est sur le digit 3 => 1/10 de s sur digit 4 . Ex: 025,8 s
;Attente appui sur poussoir start => décompte du temps led rouge allumée.
;A 5 s => led orange allumée
;A 00,0 s => R et O éteintes, verte allumée 10 s => retour valeur enregistrée.
;Arrêt possible par appui sur MEM à tout moment du décompte
;MEM => arrert décompte => retour start MEM => programmation MEM => mise en mémoire => start
;Attente appui sur start
#picaxe 20X2
setfreq M16
symbol dio=pinC.1 ;sur TM1637
symbol clk=pinC.2 ;idem
symbol mem=pinC.0 ;poussoir MEM
symbol plus1=pinC.6
symbol moin1=pinC.7
symbol start=pinB.7
symbol orange=B.0 ;led
symbol rouge=B.1
symbol verte=B.2
symbol octet=b0 ;octet doit être en b0; le bit0 est utilisé
symbol j=b6 ;position point décimal
symbol i=b7 ;compteur
symbol chiffre=b8
symbol dp=b9
symbol point=b10
symbol second=w11
symbol div=w12
symbol nombre=w13
symbol nbre=w14
symbol Ttot=w15
symbol AdrDep=$c0 ; adresse du 1er digit (poids fort)
symbol RegLum=$8c ; réglage luminosité $80 + 8(allumé, 0:éteint) + 0 à 7(intensité)
dp=$80
;pullup sur 20X2 bit0-bit7 = C.0,C.6,C.7,B.0,B.1,B.5,B.6,B.7
pullup %10000111 ;sur C.0,C.6,C.7,B.7
dirsC=%110 ;pour utilisation pinsC
settimer 59285 ;1/10 s à 16MHs 59285
; ***** init TM1637 et temps EEPROM
clk=1 : dio=1 : dio=0 ;bal start
Octet=RegLum ;Réglage luminosité
gosub EnvoiOctet
clk=0: dio=0: clk=1: dio=1 ;bal stop
low rouge,verte,orange
read 0,second ;lecture temps en EEPROM
if second=0 then ;la mémoire est vide
point=3
gosub introtemp ;entrer une valeur en mémoire EEPROM
endif
nombre=second* 10
gosub affich
;********decompte *******
decompt:
do loop while mem=0 ;suite arret decompte
low rouge
do
do ;****** boucle attente départ ou intro temps ******
if mem=0 then gosub introtemp
point=3
nombre=second *10 ;temps en 1/10 de s
gosub affich
loop while start=1 ;attente top
settimer 59285 ;1/10 s à 16MHs 59285
timer=0
Ttot=nombre
high rouge
do
nombre=Ttot -timer
if nombre < 50 then ;5 secondes avant la fin
high orange
endif
if mem=0 then decompt
gosub affich
loop while nombre<>0
high verte:low orange,rouge
timer=0
do loop while timer <= 100
low rouge,verte,orange
nombre=second *10
gosub affich
loop
introtemp: ;sub intro nouveau temps
;********** intro secondes *******
do loop while mem=0
point=4 ;point décimal sur digit n°4
do
nombre=second
gosub affich
;***** code plus *****
timer=0
if plus1=0 then
second =second+1 max 999
do while plus1=0
if timer >5 then ;500ms défilement accéléré
second =second+1 max 999
nombre=second
gosub affich
endif
loop
nombre=second
gosub affich
endif
; code moins
if moin1=0 then
second =second-1 min 0
do while moin1=0
if timer >5 then
second =second-1
if second>999 then: second=0 :endif
nombre=second
gosub affich
endif
loop
nombre=second
gosub affich
endif
if mem=0 then exit ;fin de boucle intro secondes
loop
do loop while mem=0 ;attente relâchement poussoir
write 0,second ;mise en EEPROM
high orange, rouge :pause 500:low orange, rouge:pause 500
high orange, rouge :pause 500:low orange, rouge:pause 500
return
affich:
div=1000
clk=1 : dio=1 : dio=0 ;bal start
Octet=adrdep ;synchro adresse départ
gosub EnvoiOctet
Nbre=Nombre
for j=1 to 4
Chiffre=Nbre/Div
gosub DecTo7seg
if j=point then ;choix affichage point
octet=octet | dp ;ajout point décimal
endif
gosub EnvoiOctet;
Nbre=Nbre//Div
Div=Div/10
next j
clk=0: dio=0: clk=1: dio=1 ;bal stop
return
;******* Envoi des chiffres (octet) bit à bit dans le registre ********
EnvoiOctet: ;lecture de b0 bit à bit de bit0 à bit8 poids faible en tête.
for i=1 to 8 ; envoi
clk=0
dio=bit0
Octet = Octet/2 ;effacement du bit lu, bit1 devient bit0
clk=1
next i
clk=0 :clk=1: clk=0 ; balise ACK
return
;****** Conversion des chiffres en segments
DecTo7seg:
lookup Chiffre,($3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f), Octet ; 0-9 uniquement
return