Code pour controler moteur DC

Nous avons trouvé comment faire un flag.
Mais nous avons toujours le même problème, c'est a dire que lorsque l'on appuie sur une autre touche de "Z" pour avancer par exemple, les moteurs continuent à avancer et on reste dans la boucle qui a mémoriser la valeur de la variable binaire sans pouvoir changer la valeur de la variable binaire (on a une boucle infini :~ )
Je vous remet le code avec la variable:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

boolean flag=false;

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *moteurGauche = AFMS.getMotor(1);
Adafruit_DCMotor *moteurDroit = AFMS.getMotor(3);

char touche;

void setup() 
{
  Serial.begin(9600);
  Serial.println("Robot curiosity TS6 SI");

  AFMS.begin();


  moteurGauche->setSpeed(250);
  moteurDroit->setSpeed(250);
  moteurGauche->run(FORWARD);
  moteurDroit->run(BACKWARD);
 
  moteurGauche->run(RELEASE);
  moteurDroit->run(RELEASE);
}

void loop() 
{
  uint8_t i;

  if (Serial.available() > 0) // On detecte un appui sur une touche
  {
    touche = Serial.read(); // On lit la valeur de la touche appuyée
    
    if (touche == 'Z')
    { flag= true;
      while (flag=true)
      {
        Serial.print("Avancer");

        moteurGauche->run(FORWARD);
        moteurDroit->run(FORWARD);
          for (i=0; i<255; i++) 
          {
            moteurGauche->setSpeed(i);
            moteurDroit->setSpeed(i);
          }
          for (i=255; i!=0; i--) 
          {
            moteurGauche->setSpeed(i);
            moteurDroit->setSpeed(i);
          }
         if (touche=='S'|| touche=='Q' || touche=='D'|| touche=='W')
         {
          flag=false;
         }   
        }  
      }
    }

    if (touche == 'S')
    { flag=false;
      delay(10);
      flag=true;
      while(flag=true){
      Serial.print("Reculer");

      moteurGauche->run(BACKWARD);
      moteurDroit->run(BACKWARD);
      for (i=0; i<255; i++) {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
      }
      for (i=255; i!=0; i--) 
      {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
       }
      }


    }    
    if (touche == 'Q')
    {
      Serial.print("Tourner a gauche");

      moteurGauche->run(BACKWARD);
      moteurDroit->run(FORWARD);
      for (i=0; i<255; i++) 
      {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
      }
      for (i=255; i!=0; i--) 
      {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
      }
    }
    if (touche == 'D')
    {
      Serial.print("Tourner a droite");

      moteurGauche->run(FORWARD);  
      moteurDroit->run(BACKWARD);
      for (i=0; i<255; i++) 
      {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
      }
      for (i=255; i!=0; i--) 
      {
        moteurGauche->setSpeed(i);
        moteurDroit->setSpeed(i);  
      }   
      if (touche == 'W')
      {
        Serial.print("Pause");
        moteurGauche->run(RELEASE);
        moteurDroit->run(RELEASE);
        delay(1000);
      }
      if (touche==0)
      {
        moteurGauche->run(RELEASE);
        moteurDroit->run(RELEASE);
      }
    }
  }