Problème d'exécution de boucle

Fermé
deadangel04 Messages postés 112 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 2 août 2015 - 23 mai 2015 à 11:29
pp25770 Messages postés 15 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 11 juin 2015 - 28 mai 2015 à 22:26
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:

#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(){
  
}
//---------------------




1 réponse

pp25770 Messages postés 15 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 11 juin 2015 1
28 mai 2015 à 22:26
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.
0