Minuterie compteuse-décompteuse à Picaxe 14M2
et afficheur LEDS 4 digits MAX 7219
Il y a sur d'autres pages des minuteries avec des LCD ou des leds.
En voici encore une autre avec un picaxe 14M2 et un afficheur à 4 digits MAX 7219.
Réglage continu entre 0 et.... 99mn 59 s
Résolution 1 seconde
La simplicité du schéma parle d'elle même:
Très peu de composants et si on enlève la décoration, il faut:
- 1 picaxe 14M2
- 1 afficheur 4 digits MAX 7219 (horaire, c'est mieux avec :)
- 1 potentiomètre
- 1 poussoir
- On appuie 3 secondes sur le poussoir, les deux points s'éteignent.
- On affiche les minutes de 0 à 99, on valide par le poussoir.
- On afiche les secondes de 0 à 59, on valide par le poussoir.
- Les deux points se rallument, c'est prêt.
Si le temps est différent de 0, on appuie, une diode s'allume et le temps se décompte,
à 0mn 0s, une diode s'éteint, une autre s'allume et le buzzer buzze une seconde (on peut ajouter un ajustable sur C.0 pour régler ce temps)
Si le temps de départ est égale à 0, on appuie, une diode s'allume et le temps s'incrémente, comme un chronomètre.
Retour au départ si on appuie sur le poussoir pendant le fonctionnement.
Le temps est mémorisé en EEPROM et s'affiche à chaque remise sous tension.
En remplaçant les diodes par des mocs, on peut commander un système d'éclairage comme sur
cette page.
Le code est celui de la page déjà citée, avec adaptation au MAX 7219.
Le code:
;Afficheur driver MAX7219
; Programme minuterie picaxe 14M2 et MAX7219
; MM 1/12/13
;Format des registres MAX 7219 sur 16 bits:
;|------------------------------w13------------------------------| |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
' b27=position du digit (1 to 8)
' b26=value à afficher
' gosub shiftt pour remplir le registre du max7219 bit par bit
' Pour afficher un point décimal: b26=value or $80
#picaxe 14M2
setfreq m16
symbol DIN = B.1 ;Entrée Data In de l'afficheur
symbol LOAD = B.2 ;Entrée Load de l'afficheur
symbol CLK = B.3 ;Entrée CLK de l'afficheur
symbol lum = B.4
symbol lum2 = B.5
symbol Valid = pinC.3 ;poussoir validation
symbol potar = C.4 ;potentiomètre
symbol LEN = 1 ;durée impulsion 1ms
symbol cpt = b2 ;compteur
; b3 unité
; b4 dizaine
; b5 centaine
symbol minut =b6
symbol second =b7
symbol rest =w11
symbol temps =w10
symbol regis =w13 ;=(b27,b26) chaque bit sera envoyé dans le registre
low DIN
low LOAD
low CLK
pullup %0000100000000000 ;activation résistance pullup sur C.3
;******** initialisation 7219 *******
b27=$09 'mode décodage
b26=%11111111 'code B sur tous les digits
gosub shiftt
b27=$0b 'limite scanner = Nbre de digits
b26=$04 '$04=5 digits ,$03=4 digits,, etc...
gosub shiftt
b27=$0f 'display test
b26=$00 '=normal
gosub shiftt
b27=$0c 'shutdown mode
b26=$01 '=normal (afficheur actif)
gosub shiftt
b27=$0a 'luminosité
b26=$04 '=croissante de 0 à 15, ici c'est 4
gosub shiftt
b27=$0f 'display test
b26=$00 '=normal
gosub shiftt
pause 500
;***************************
debut:
read 0,word temps ;lecture du temps en EEPROM
;******* Programme minuterie *********************
second= temps//60 ;reste des secondes
gosub affsec ;affichage secondes enregistrées
minut= temps/60 ;minutes entières
gosub affmin ;affichage minutes enregistrées
Do
b27=5
b26=$80
gosub shiftt
loop while valid=1 ;attente appui sur valid
time=0 ;on a appuyé! RAZ de time
Do
if time>2 then reglage ;si on reste appuyé plus de 3s -> sub réglages
loop while valid=0 ;si on relache avant, on continue et...
If temps=0 then ;en fonction de la valeur de temps,
goto compte ;on compte
else ;ou
goto decompte ;on décompte
endif
;******* comptage ******************
compte:
time=0 ;reset time
high lum
Do
if valid=0 then exit ;si appui sur poussoir ->sortie de boucle
minut=time/60 ;extraction minutes entières
gosub affmin ;affichage
second=time//60 ;reste les secondes
gosub affsec ;affichage
loop ;on boucle
low lum
do loop while valid=0 ;attente relachement
goto debut ;retour debut
;******* décomptage ******************
decompte:
time=0
high lum
Do
If valid=0 then exit ;si appui sur poussoir ->sortie de boucle
rest=temps-time ;calcul du temps rstant
minut=rest/60 ;minutes temps restant
gosub affmin ;affichage
second=rest//60 ;secondes temps restant
gosub affsec ;affichage
loop while rest>0 ;boucle jusqu'à 0
low lum
high lum2
pause 4000
low lum2
do loop while valid=0 ;attente relachement
goto debut
;***** Réglage de la temporisation **************
reglage:
b27=5 ;extinction des :
b26=$F
gosub shiftt
b27=4 ;extiction des digits secondes
b26=$F
gosub shiftt
b27=3 ;extiction des digits secondes
b26=$F
gosub shiftt
Do loop while valid=0 ;attente relachement pousoir
Do ;boucle réglage des minutes
readadc potar,minut ;lecture minutes
minut= 99 *minut/255 ;mise à l'échelle 0 à 99
gosub affmin ;affichage
loop while valid=1 ;si appui sur valid, on quite la boucle
Do loop while valid=0 ;attente relachement
Do ;boucle réglage des secondes
readadc C.4,second ;lecture secondes
second = 59 *second/255 ;mise à l'échelle 0 à 59
gosub affsec ;affichage
loop while valid=1 ;si appui sur valid, on quite la boucle
Do loop while valid=0 ;attente relachement
temps=minut*60 +second ;temps total en secondes
write 0,word temps ;sauvegarde en EEPROM
goto debut
;****** sub affichage minutes et secondes ****************
affmin:
bintoascii minut, b5,b4,b3 ;décomposition en digits
b27=2 ;digit 3
b26=b3-48 ;ascii -> numérique
gosub shiftt ;affichage
b27=1
b26=b4-48
gosub shiftt ;affichage
return
affsec:
bintoascii second, b5,b4,b3 ;décomposition en digits
b27=4 ;digit 1
b26=b3-48 ;ascii -> numérique
gosub shiftt ;affichage
b27=3
b26=b4-48
gosub shiftt ;affichage
return
;******** Sous programme affichage caractères *************************
;Format du registre sur 16 bits:
;|------------------------------w13------------------------------| |
;|-----------b27-----------------|------------b26 ---------------|
;|-X-|-X-|-X-|-X-|--ADRESSE------|----------DONNEES--------------|
;|D15|D14|D13|D12|D11|D10|D09|D08|D07|D06|D05|D04|D03|D02|D01|D00|
;Ex: chiffre 5 dans digit 2
;|-X-|-X-|-X-|-X-| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
;La broche DIN va prendre successivementla valeur de chaque bit de w13, scanné de gauchee à droire
shiftt:
for cpt=1 to 16 ;test des 16 bits de w13
w12=w13 & $8000 ;w13 = b27,b26 & %1000 0000 0000 0000: on ne garde que le 1er bit à gauche de w12
low DIN ;broche DIN à 0 à priori
if w12=0 then saut ;w12 contient la valeur (0 ou 1) à transmettre
high DIN ;on ne passe ici que si w12 <> 0, alors DIN =1 (évidemment)
saut: pulsout CLK,LEN ;envoi 1 pulse horloge pour valider DIN
w13=w13*2 ;on décale w13 vers la gauche pour examiner le bit suivant
next cpt
pulsout LOAD,LEN ;chargement du registre terminé, un pulse sur load valide le registre (commande ou affichage)
return