Problème d'exécution de boucle
deadangel04
Messages postés
112
Date d'inscription
Statut
Membre
Dernière intervention
-
pp25770 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
pp25770 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
alors voila mon problème j'ai créé un programme en langage C et en parallèle cablé un microcontroleur relié a un écran lcd 16*2 et a 4 bouton que j'ai nommé b1,b2,b3 et b4. ,dans mon programme je souhaite que lorsque mon programme propose les différents type de jeu , qui sont proposés grace a une boucle, qu'au moment ou j'appuie sur b1 je sorte de la boucle. J'arrive a le faire mais apres, je reviens directement dans ma première boucle je ne sais pas si vous avez compris voila le programme concerné, merci de votre aide:
alors voila mon problème j'ai créé un programme en langage C et en parallèle cablé un microcontroleur relié a un écran lcd 16*2 et a 4 bouton que j'ai nommé b1,b2,b3 et b4. ,dans mon programme je souhaite que lorsque mon programme propose les différents type de jeu , qui sont proposés grace a une boucle, qu'au moment ou j'appuie sur b1 je sorte de la boucle. J'arrive a le faire mais apres, je reviens directement dans ma première boucle je ne sais pas si vous avez compris voila le programme concerné, merci de votre aide:
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int b1 = 0; int b2 = 0; int b3 = 0; int b4 = 0; int j = 2; int led = 13; //------------------------ //Type de jeu? void jeu(){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Type de Jeu ? "); delay(2000); while(b1 == LOW || b2 == LOW || b3 == LOW || b4 == LOW){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("1) BATAILLE"); lcd.setCursor(0, 1); lcd.print("2) POKER"); delay(2500); lcd.clear(); lcd.setCursor(0, 0); lcd.print("3) UNO"); lcd.setCursor(0, 1); lcd.print("4) PRESIDENT"); delay(2500); lcd.clear(); if(b1 == HIGH) bataille(); if(b2 == HIGH) poker(); if(b3 == HIGH) uno(); if(b4 == HIGH) president(); } } //----------------------- //----------------------- //increment sous programmes void increment(){ lcd.setCursor(0, 0); lcd.print("Nbre de joueurs?"); lcd.setCursor(0, 1); lcd.print("-"); lcd.setCursor(15, 1); lcd.print("+"); lcd.setCursor(7, 1); lcd.print(j); if (b2 == HIGH){ j --; lcd.setCursor(7, 1); lcd.print(j); delay(500); if (b2 == HIGH && j == 1){ j ++; }} if (b4 == HIGH){ j ++; lcd.setCursor(7, 1); lcd.print(j); delay(500); if (b4 == HIGH && j == 7){ j --; }}} //------------------------- //-------------------------- //CORPS DU PROGRAMME void setup(){ pinMode(led, OUTPUT); lcd.begin(16, 2); pinMode(5,INPUT); pinMode(4,INPUT); pinMode(3,INPUT); pinMode(2,INPUT); } void loop() { b1 = digitalRead(5); b2 = digitalRead(4); b3 = digitalRead(3); b4 = digitalRead(2); increment(); if (b1 == HIGH){ jeu(); } } //--------------------- //--------------------- void bataille (){ while(b1 == LOW || b2 == LOW || b3 == LOW || b4 == LOW){ lcd.clear(); lcd.setCursor(0, 0); lcd.print("BATAILLE"); delay(3000); lcd.clear(); lcd.print("lancement des cartes...") } } //--------------------- //--------------------- void poker(){ } //--------------------- //--------------------- void uno(){ } //--------------------- //--------------------- void president(){ } //---------------------
A voir également:
- Problème d'exécution de boucle
- Boucle excel sans macro - Forum Excel
- Au démarrage de l’ordinateur, le d' se lance. il permet l’exécution des logiciels applicatifs et gère l’utilisation des ressources matérielles (mémoire, processeur, périphériques). - Forum Windows 10
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Microsoft excel attend la fin de l'exécution d'une action ole d'une autre application ✓ - Forum Word
- Vlc lire en boucle ✓ - Forum Lecteurs et supports vidéo
1 réponse
Bonsoir,
Je suppose que c'est un Arduino qui est connecté.
Pour rappel, la fonction setup() est appelée une et une seule fois lorsque le programme se lance.
Ensuite, et tu ne le vois pas dans ton programme final compilé, il y a en quelque sorte une seconde boucle qui va appeler TOUT le temps la fonction loop().
Donc à priori, b2 et b4 permettent de fixer un nombre de joueur et cela devrait fonctionner.
Ensuite si tu appuies sur b1, tu entres dans la fonction jeu() qui va afficher le texte "Type de jeu ?" et attendre 2 secondes.
La condition while(b1 == LOW || b2 == LOW || b3 == LOW || b4 == LOW) est vrai car b2 est LOW. Mais à ce moment b1 est toujours sur HIGH même si tu as relâché b1. Donc tu vas aller dans bataille() et y rester tout le temps puisque tu ré-utilises les mêmes valeurs des boutons.
Tu as tout simplement oublié de relire l'état des 4 boutons dans jeu() mais également dans bataille().
Il faudrait remplacer les while() par
do
{
b1 = digitalRead(5);
b2 = digitalRead(4);
b3 = digitalRead(3);
b4 = digitalRead(2);
// toutes les instructions lcd....
}while (b1 == LOW && b2 == LOW && b3 == LOW && b4 == LOW);
//et ensuite
if (b1 == HIGH) bataille();
if (b2 == HIGH) poker();
...
Et cette boucle te servira dans tes autres fonctions de jeu. En faire une fonction.
Bon développement et bon jeu.
Je suppose que c'est un Arduino qui est connecté.
Pour rappel, la fonction setup() est appelée une et une seule fois lorsque le programme se lance.
Ensuite, et tu ne le vois pas dans ton programme final compilé, il y a en quelque sorte une seconde boucle qui va appeler TOUT le temps la fonction loop().
Donc à priori, b2 et b4 permettent de fixer un nombre de joueur et cela devrait fonctionner.
Ensuite si tu appuies sur b1, tu entres dans la fonction jeu() qui va afficher le texte "Type de jeu ?" et attendre 2 secondes.
La condition while(b1 == LOW || b2 == LOW || b3 == LOW || b4 == LOW) est vrai car b2 est LOW. Mais à ce moment b1 est toujours sur HIGH même si tu as relâché b1. Donc tu vas aller dans bataille() et y rester tout le temps puisque tu ré-utilises les mêmes valeurs des boutons.
Tu as tout simplement oublié de relire l'état des 4 boutons dans jeu() mais également dans bataille().
Il faudrait remplacer les while() par
do
{
b1 = digitalRead(5);
b2 = digitalRead(4);
b3 = digitalRead(3);
b4 = digitalRead(2);
// toutes les instructions lcd....
}while (b1 == LOW && b2 == LOW && b3 == LOW && b4 == LOW);
//et ensuite
if (b1 == HIGH) bataille();
if (b2 == HIGH) poker();
...
Et cette boucle te servira dans tes autres fonctions de jeu. En faire une fonction.
Bon développement et bon jeu.