'Ennoncé Afficheurs 7 Segments '***************************** 'A l'aide de la carte "MC14499 : Afficheur 7 segments", réaliser une minuterie. ' 'Au reset, le compteur est mis sur 3 minutes (Affichage 03OO). 'Après avoir choisi le temps, la position de l'intérupteur S2 est inversée puis 'remise en place, et le décomptage commence, et la première led est allumée. 'Lorsque le temps arrive à 10 secondes, on envoie un léger "BIP" dans 'le haut-parleur, et lorsque le temps arrive à zéro, on envoie trois "BIPs" 'dans le haut-parleur toute les 2 secondes, et on éteint la première led. 'Les "Bips" doivent s'arrêter dès que l'on appuie sur n'importe qu'elle touche. 'Pour choisir le temps de départ, on utilise les poussoirs S3 à S6 de la manière'suivante : 'S3 (entrée P14) incrémente le temps de 10 secondes 'S4 (entrée P15) incrémente le temps de 1 seconde 'S5 (entrée P13) décrémente le temps de 10 secondes 'S6 (entrée P12) décrémente le temps de 1 seconde ' ' 'Description du programme '************************ ' 'Dans le principe, le programme sera contitué d'une boucle infinie qui scrutera 'le clavier en permanance. A chaque appuis d'un bouton poussoir, la valeur du 'temps sera modifiée en conséquence et l'affichage sera mis à jour. 'Après manipulation de l'intérupteur c'est la séquence de décomptage suivi de 'la sonnerie qui est lancée. Lorsque l'arrêt de la sonnerie est éffectué, 'le programme revient dans la boucle infinie en réaffichant la dernière valeur 'sélectionnée. 'Liste des routines '****************** 'Init : Routine d'initialisation ' Cette routine initialise les variables ' 'Affi : Routine d'affichage ' Cette routine convertit la variable Temps en quatre ' variables Affi1 à Affi4 qui représentent les 4 digits ' de l'afficheur, puis envoie ces 4 variables à l'afficheur ' 'Lecture : Routine de Lecture ' Cette routine effectue la lecture des touches. Elle tourne ' en boucle tant qu'une touche n'est pas appuyée. Lorsque la ' touche 2 est appuyée (Intérupteur), la routine attend le ' relachement et uniquement le relachement de cette touche ' avant de continuer, En sortant de cette routine, la variable ' Touche contient les valeurs 2, 3, 4, 5 ou 6. ' 'Entrée : Routine de lecture du "clavier" ' Cette routine lit la valeur d'entrée, et renvoie les valeurs ' 0 = Pas de touche, 2 = S2 appuyé, 3 = S3 appuyé, 4 = S4 appuyé, ' 5 = S5 appuyé, 6 = S6 appuyé dans la variable Etatin. Comme la ' lecture s'éffectue dans l'ordre noté, si plusieurs touches sont ' appuyées en même temps, seule la valeur la plus petite sera ' retenue, donnant ainsi au "clavier" une priorité "numérique". ' 'Décompte : Routine de décompte ' Cette routine s'occupe de la minuterie. Elle éffectue donc le ' du temps, et affiche ce temps. Puis s'occupe des différentes ' sonneries et de l'arrêt de celles-ci. Puis le temps est ' réinitialisé à sa valeur antérieure. 'Programmation structurée '************************ ' ' 'BEGIN ' 'DECLARE Affi1 AS NIBBLE ' Digit "dizaines de minutes" 'DECLARE Affi2 AS NIBBLE ' Digit "unités de minutes" 'DECLARE Affi3 AS NIBBLE ' Digit "dizaines de secondes" 'DECLARE Affi4 AS NIBBLE ' Digit "unités de secondes" 'DECLARE Temps AS WORD ' Temps exprimé en secondes 'DECLARE Oldtemps AS WORD ' Temps précédent exprimé en secondes 'DECLARE Touche AS Nibble ' Touche appuyée (2,3,4,5 ou 6) 'DECLARE Etatin AS Nibble ' Valeur de l'état d'entrée (0,2,3,4,5 ou 6) 'DECLARE i AS Byte ' Variable de travail ' 'GOSUB Init ' Initialisation des variables 'GOSUB Affi ' Affichage de la valeur de base 'DO WHILE i=i ' Début de la "boucle infinie" ' GOSUB Lecture ' Lecture de l'état des touches ' IF Touche = 2 ' touche "Start Decompte" ' GOSUB Decompte ' Routine de decomptage + sonnerie ' ELSE ' IF Touche=3 or Touche=4 ' Si Augmentation du temps ' IF Touche=3 ' Touche = "Incrémente 10 secondes" ' LET Temps=Temps+10 ' Incrémente le temps de 10 secondes ' ELSE ' Touche = "Incrémente 1 seconde" ' LET Temps=Temps+1 ' Incrémente le temps de 1 seconde ' ENDIF ' IF Temps > 5999 ' Dépassement 99 minutes, 59 secondes ' LET Temps=5999 ' ENDIF ' ELSE ' Si diminution du temps ' IF Touche=5 ' Touche = "Décrémente 10 secondes" ' LET Temps=Temps-10 ' Décrémente de tmeps de 10 secondes" ' ELSE ' Touche = "Décrémente 1 seconde" ' LET Temps=Temps-1 ' Décrémente 1 seconde ' ENDIF ' IF Temps < 0 ' Dépassement 0 seconde ' LET Temps=0 ' ENDIF ' ENDIF ' GOSUB Affi ' Affichage du nouveau temps ' ENDIF 'ENDDO ' Fin de la "boucle infinie" 'END ' Fin "fictive" du programme ' Routine d'initialisation ' ************************ ' Cette routine initialise les variables ' 'SUB Init ' LET i=0 ' LET j=0 ' LET k=0 ' LET l=0 ' LET Temps=180 ' LET Touche=0 'ENDSUB ' ' ' ' ' Routine d'affichage ' ******************* ' Cette routine convertit la variable Temps en quatre variables ' Affi1 à Affi4 qui représentent les 4 digits de l'afficheur, puis ' envoie ces 4 variables à l'afficheur ' 'SUB Affi ' LET Affi1=Temps/600 ' LET Affi2=(Temps-(Affi1*600))/60 ' LET Affi3=(Temps-(Affi1*600)-(Affi2*60))/10 ' LET Affi4=Temps-(Affi1*600)-(Affi2*60)-(Affi3*10) ' Envoyer les variables Affi1 - Affi4 à l'afficheur 'ENDSUB ' Routine de Lecture ' ****************** ' Cette routine effectue la lecture des touches. Elle tourne ' en boucle tant qu'une touche n'est pas appuyée. Lorsque la ' touche 2 est appuyée (Intérupteur), la routine attend le ' relachement et uniquement le relachement de cette touche ' avant de continuer, En sortant de cette routine, la variable ' Touche contient les valeurs 2, 3, 4, 5 ou 6. 'SUB Lecture ' Début de la routine ' LET Touche = 0 ' Initialisation de touche pour boucler ' DO WHILE Touche = 0 ' Début de la boucle ' GOSUB Entrée ' Lecture du "clavier" ' IF Etatin = 2 ' Traitement de l'intérupteur ' DO WHILE Etatin = 2 ' Bouclage de la position "appuyé" ' GOSUB Entrée ' Lecture du "clavier" ' ENDDO ' LET Touche = 2 ' Renvoi du code "intérupteur" ' ELSE ' Traitement des autres valeurs ' LET Touche = Etatin ' Touche = valeur du "clavier" ' ENDIF ' ENDDO ' Bouclage si pas de touche 'ENDSUB ' Fin de la routine ' Routine Entrée ' ************** ' Cette routine lit la valeur d'entrée, et renvoie les valeurs ' 0 : Pas de touche, 2 : S2 appuyé, 3 : S3 appuyé ' 4 : S4 appuyé, 5 : S5 appuyé, 6 : S6 appuyé ' dans la variable Etatin. Comme la lecture s'éffectue dans l'ordre ' noté, les touches on la priorité de leur numéro. ' 'SUB Entrée ' Début de la routine ' Lit la valeur de l'entrée ' Lecture du 'clavier' ' IF S2 appuyé ' Lecture de l'intérupteur ' LET Etatin = 2 ' Mise à jour de Etatin ' ELSE ' IF S3 appuyé ' Lecture du bouton S3 ' LET Etatin = 3 ' Mise à jour de Etatin ' ELSE ' IF S4 appuyé ' Lecture du bouton S4 ' LET Etatin = 4 ' Mise à jour de Etatin ' ELSE ' IF S5 appuyé ' Lecture du bouton S5 ' LET Etatin = 5 ' Mise à jour de Etatin ' ELSE ' IF S6 appuyé ' Lecture du bouton S6 ' LET Etatin = 6 ' Mise à jour de Etatin ' ELSE ' Si autre valeur, alors ' LET Etatin = 0 ' pas de touche ' ENDIF ' ENDIF ' ENDIF ' ENDIF ' ENDIF 'ENDSUB ' Fin de la routine ' Routine de Décompte ' ******************* ' Cette routine s'occupe de la minuterie. Elle éffectue donc le du temps, ' et affiche ce temps. Puis s'occupe des différentes sonneries et de l'arrêt ' de celles-ci. Puis le temps est réinitialisé à sa valeur antérieure. ' 'SUB Décompte ' Début de la routine ' LET Oldtemps = Temps ' Mise en mémoire du temps de départ ' Allumer la LED n°1 ' Allumage de la led ' DO WHILE Temps > 0 ' Bouclage pendant le décompte ' GOSUB Affi ' Mise à jour de l'affichage ' LET Temps=Temps-1 ' Décompte une seconde ' PAUSE 1 seconde ' Pause d'une seconde ' IF Temps = 10 ' Test de 10 secondes avant la fin ' Envoyer un BIP dans le HP ' Biiip ' ENDIF ' ENDDO ' Fin du bouclage de décompte ' Eteindre la LED n°1 ' Extinction de la led ' LET Etatin=0 ' Initialisation de Etatin ' DO WHILE Etatin = 0 ' Attente d'appuis de touche ' GOSUB Entrée ' Lecture du "clavier" ' IF Etatin = 0 ' Tant que pas de touche ' Envoyer trois BIPs dans le HP '3 bips toute les 2 secondes ' PAUSE 2 Secondes ' Pause de 2 secondes ' ENDIF ' ENDDO ' Fin de l'attente de touche ' LET Temps = Oldtemps ' Temps remis à la valeur de départ ' GOSUB Affi ' Affichage de la valeur de départ 'ENDSUB PROGRAMME POUR LE BASIC STAMP 2 ******************************* 'Programme de Minuterie pour circuit MC14499 et STAMP2 ' 'Exercice 05-2 ' '************************************************************************** 'Le MC14499 est connecté au stamp de la maniere suivante : ' P14 : ENB - Enabled, actif bas ' P13 : CLK - Clock ' P12 : Data - Datas 'Le protocole du MC14499 est le suivant : 'La ligne ENB est mise a l'etat bas (LOW 14) 'les digit, sur 4 bits, sont envoyés vers le MC14499 en serie 'par l'intruction SHIFTOUT 12,13,1,[digitx\4] dans l'ordre suivant : 'Points decimaux, milliers, centaines, dizaines et unités 'La ligne ENB est mise a l'etat haut (HIGH 14) pour latcher les valeurs. ' 'Notez que les lignes P12, P13 et P14 sont communes avec des boutons poussoirs 'Cela veut dire que quoi que l'on fasse, les manipulations sur les boutons 'poussoirs aurront pour effet d'envoyer "n'importe quoi" au MC14499. 'Il faudra donc raffraichir celui-ci de manière régulière. '************************************************************************** 'Description de l'électronique utilisée 'P0 : Led à travers Résistance de 330 Ohms 'P1 : Led à travers Résistance de 330 Ohms 'P2 : Led à travers Résistance de 330 Ohms 'P3 : Led à travers Résistance de 330 Ohms 'P4 : Led à travers Résistance de 330 Ohms 'P5 : Led à travers Résistance de 330 Ohms 'P6 : Led à travers Résistance de 330 Ohms 'P7 : Led à travers Résistance de 330 Ohms 'P8 : 47 nF à +5V et Pot de 10K Ohms à la Masse à travers 10 Ohms 'P9 : 47 nF à la Masse et Pot de 10K Ohms à +5V à travers 10 Ohms 'P10 : Intérupteur à +5V ou Masse à travers 10K Ohms 'P11 : Haut-parleur à travers condensateur de 10 æF 'P12 : Résistance 100K Pull-UP avec poussoir à la Masse à travers 10K Ohms 'P13 : Résistance 100K Pull-UP avec poussoir à la Masse à travers 10K Ohms 'P14 : Résistance 100K Pull-Down avec poussoir à +5V à travers 10K Ohms 'P15 : Résistance 100K Pull-Down avec poussoir à +5V à travers 10K Ohms 'Définition des entrées-sorties OUTPUT 0 OUTPUT 1 OUTPUT 2 OUTPUT 3 OUTPUT 4 OUTPUT 5 OUTPUT 6 OUTPUT 7 OUTPUT 8 OUTPUT 9 INPUT 10 OUTPUT 11 INPUT 12 INPUT 13 INPUT 14 INPUT 15 'Initialisation du système INS = 0 OUTS = 0 'Début du programme 'Definition des variables Affi1 VAR Nib 'Digit "Dizaines de minutes" Affi2 VAR Nib 'Digit "Unités de minutes" Affi3 VAR Nib 'Digit "Dizaines de secondes" Affi4 VAR Nib 'Digit "Unités de secondes" Temps VAR Word 'Temps exprimé en secondes Oldtemps VAR Word 'Temps précédent en secondes Touche VAR Nib 'Touche appuyée (0,2,3,4,5 ou 6) Etatin VAR Nib 'Valeur de l'état d'entrée (0,2,3,4,5 ou 6) 'Initialisation des variables Temps = 180 'Initialisation du temps à 3 minutes Touche = 0 'Début du programme principal GOSUB Affi 'Affichage sur le MC14499 Pri0: GOSUB Lecture 'Début de la boucle "infinie" IF Touche <> 2 THEN Pri1 'Si touche <> de l'intérupteur GOSUB Decompte 'Envoi vers la routine décompte GOTO Pri0 'Bouclage après décompte Pri1: IF Touche > 4 THEN Pri2 'Si touche =5 ou 6 IF Touche = 4 THEN Pri3 'Saut si touche = 4 Temps = Temps + 10 'Condition touche = 3 GOTO Pri4 'Saut vers test de dépassement Pri3: Temps = Temps +1 'Condition touche = 4 Pri4: IF Temps < 6000 THEN Pri5 'Test de dépassement supérieur Temps = 5999 'Limitation si dépassement GOTO Pri5 'Saut vers la fin de la boucle Pri2: IF Touche = 6 THEN Pri6 'Saut si touche = 6 Temps = Temps - 10 'Condition touche = 5 GOTO Pri7 'Saut vers test de dépassement Pri6: Temps = Temps - 1 'Condition touche = 6 Pri7: IF Temps < 5999 THEN Pri5 'Test de dépass. inférieur (!!pas de négatif) Temps = 0 'Limitation si dépassement Pri5: GOSUB Affi 'Affichage de la valeur calculée PAUSE 200 'Pause pour "anti-rebond" GOTO Pri0 'Bouclage "infini" STOP 'FIN DU PROGRAMME PRINCIPAL 'Routine d'affichage sur le MC14499 '********************************** affi: Affi1=Temps/600 'Calcul dizaine minutes Affi2=(Temps-(Affi1*600))/60 'Calcul unité minutes Affi3=(Temps-(Affi1*600)-(Affi2*60))/10 'Calcul dizaine secondes Affi4=Temps-(Affi1*600)-(Affi2*60)-(Affi3*10) 'Calcul unité secondes LOW 14 'Mise a zero de ENB SHIFTOUT 12,13,1,[0\4] 'Envoi des points decimaux (rien) SHIFTOUT 12,13,1,[Affi1\4] 'Envoi des dizaines de minutes SHIFTOUT 12,13,1,[Affi2\4] 'Envoi des unités de minutes SHIFTOUT 12,13,1,[Affi3\4] 'Envoi des dizaines de secondes SHIFTOUT 12,13,1,[Affi4\4] 'Envoi des unités de secondes HIGH 14 'Mise à 1 de ENB et LATCH RETURN 'FIN DE ROUTINE AFFICHAGE 'Routine de Lecture '****************** Lecture: Touche = 0 'Initialisationde touche Lec1: GOSUB Entree 'Appel de la routine de lecture clavier IF Etatin = 0 THEN Lec1 'Bouclage si pas de touche IF Etatin <> 2 THEN Lec3 'Si pas intérupteur S2, alors "saut" Lec2: GOSUB Entree 'Relecture et bouclage pour attendre IF Etatin = 2 THEN Lec2 'le relachement de l'intérupteur Etatin = 2 'Simulation de l'intérupteur S2 Lec3: Touche = Etatin 'Mise à jour de la variable Touche RETURN 'FIN DE ROUTINE LECTURE 'Routine Entrée '************** Entree: Etatin=0 'Initialisation de la variable de lecture INPUT 10 'Mise en entrée de la pin connectée à S2 INPUT 12 'Mise en entrée de la pin connectée à S6 INPUT 13 'Mise en entrée de la pin connectée à S5 INPUT 14 'Mise en entrée de la pin connectée à S3 INPUT 15 'Mise en entrée de la pin connectée à S4 IF IN10 = 0 THEN Entr1 'Lecture de l'intérupteur S2 Etatin = 2 'et mise à jour de Etatin GOTO Entr5 'Puis saut vers la fin de la routine Entr1: IF IN14 = 0 THEN Entr2 'Lecture du poussoir S3 Etatin = 3 'et mise à jour de Etatin GOTO Entr5 'Puis saut vers la fin de la routine Entr2: IF IN15 = 0 THEN Entr3 'Lecture du poussoir S4 Etatin = 4 'et mise à jour de Etatin GOTO Entr5 'Puis saut vers la fin de la routine Entr3: IF IN13 = 1 THEN Entr4 'Lecture du poussoir S5 Etatin = 5 'et mise à jour de Etatin GOTO Entr5 'Puis saut vers la fin de la routine Entr4: IF IN12 = 1 THEN Entr5 'Lecture du poussoir S6 Etatin = 6 'et mise à jour de Etatin Entr5: RETURN 'FIN DE LA ROUTINE ENTREE 'Routine de décompte '******************* Decompte: Oldtemps = Temps 'Mise ne mémoire du temps HIGH 0 'Allumage de la première LED FOR Temps=Oldtemps to 0 'Début de la boucle de décomptage GOSUB Affi 'Affichage de la valeur If Temps <> 10 THEn Dcp1 'Test pour le bip à 10 secondes FREQOUT 11,600,2000 'Biiip PAUSE 350 'Pause réduite pour compenser le bip GOTO Dcp2 'Saut au bouclage du décompte Dcp1: PAUSE 970 'Pause à ajuster pour la précision Dcp2: NEXT 'Bouclage du décompte LOW 0 'Extinction de la première LED Etatin=0 'Mise à zéro de la lecture clavier Dcp3: GOSUB Entree 'Début de la boucle de sonnerie de FIN IF Etatin > 0 THEN Dcp4 'Si appuis touche sortie de la boucle FREQOUT 11,200,2400 'Dii GOSUB Entree 'Lecture du "clavier" IF Etatin > 0 THEN Dcp4 'Si appuis touche sortie de la boucle PAUSE 100 'Pause entre les deux sons GOSUB Entree 'Lecture du "clavier" IF Etatin > 0 THEN Dcp4 'Si appuis touche sortie de la boucle FREQOUT 11,200,2000 'Daa GOSUB Entree 'Lecture du "clavier" IF Etatin > 0 THEN Dcp4 'Si appuis touche sortie de la boucle PAUSE 1300 'Pause pour faire + ou - 2 secondes GOTO Dcp3 'Bouclage de l'attente d'une touche Dcp4: Temps=Oldtemps 'Remise de Temps à sa valeur précédente GOSUB Affi 'Affichage de cette valeur PAUSE 2000 '"Anti-rebond" RETURN 'FIN DE LA ROUTINE DECOMPTE