Moteur pas à pas ne tourne plus dans une boucle ?

Bonjour à vous, grands spécialistes Duino en tous genre,
J'essaie de faire un petit programme pour gérer un vieux moteur pas à pas destiné a faire tourner un appareil photo pour des time-lapse.
Un bouton poussoir fait tourner le moteur dans un sens, un 2eme BP le fait tourner dans l’autre sens, en vitesse rapide, pour positionner l’appareil, et un 3eme BP démarre un cycle de rotation avec des paramètres pré-définis(vitesse de rotation et sens de rotation). Jusque là, tout va bien, les taches sont parfaitement effectuées. Mais je souhaite que le 4eme bouton me permettre d’entrer dans un sous menu pour modifier éventuellement le temps de rotation et le sens.
Dans la phase setup(), le moteur se comporte parfaitement, mais dès que je rentre dans la boucle MenuA(), le moteur s'agite bien un peu, et les boucles de lecture du tableau correspondant aux 8 1/2 pas sont effectuées, mais le moteur refuse d'avancer ou de reculer. En quoi le fait de tourner dans une boucle while() impacterait le déroulement du programme ?
Autrement dit, les petites routines Avant(), Arriere, et Cycle() tournent très bien seules, mais refusent de faire leur office dans la boucle menuA(), sans que je sache pourquoi ?? Merci beaucoup si quelqu'un peut m'éclairer

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,9,8,7);  
/************************************* Concerne le moteur et le pont en H **************************/
const int nb_pas_par_tour = 2592;  // 27 X 48 X 2 car 1/2 pas
int nb_sec_par_tour = 60;
int nbpas = 162;  // le nombre de pas a effectuer
int mot[4] = {2,4,3,5}; // les quatre broches utilisées
int delai = 2;           // delai utilisé parfois:  5/1000 sec
char val_bt;              // U pour Up ou Retour, L pour Low ou Retour ou Moins, D pour PLus , S pour select 
int delai_moteur = 10;

boolean P[8][4] =  {
                    {1,1,0,0},  //1  // fonctionne bien en 1/2 pas, soit 96 1/2 pas par tour
                    {1,1,1,0},  //2
                    {0,1,1,0},  //3
                    {0,1,1,1},  //4
                    {0,0,1,1},  //5
                    {1,0,1,1},  //6
                    {1,0,0,1},  //7
                    {1,1,0,1}   //8
                   };  

int i =0;
int j =0;
int cpt = 0; //compteur de 1 a 8 (cases du tableau)

/******** Concerne les differents menus*****************/

int Broche_Bp = A0;  // broche analogique pour lecture des boutons
int val_Bp = 0;
int val_Bp_old = 0;

char Bp_pousse = ' ';

byte PageMenuPrincipal = 1;
byte PageMenuPrincipal_prec = 1;
byte Nb_menus = 4;

void setup()
    {
    Serial.begin(115200);
    lcd.begin(16,2);  //Initialize a 2x16 type LCD
    for(int i = 2; i < 6; i++)  // --> 2,3,4,5
      {
       mot[i]=i;pinMode(mot[i],OUTPUT); //on déclare les broches 2 3 4 et 5 pour le moteur 
      }
    for (i = 0; i < 200; i++) {Avant();delay(5);} 
    delay(500);
    for (i = 0; i < 200; i++) {Arriere();delay(5);}  
   
    Affichage_menu_principal();
    delay(1000);
    }
    
void loop()
{
    Bp_pousse = Lect_Bp();
    affiche();
    Select_menu();
    
    if(Bp_pousse == 'S')//entrée dans le menu choisi
    {
        Attente_relache_Bp();
        switch (PageMenuPrincipal)
        {
            case 1:
              MenuA();
              break;
            case 2:
              MenuB();
              break;
            case 3:
              MenuC();
              break;
            case 4:
              MenuD();
              break;
        }

          Affichage_menu_principal();
          Attente_relache_Bp();
    }
    


    delay(10);
  
}//--------------- End of loop() loop ---------------------
void MenuA()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu A");
    
    while(Lect_Bp()!= 'R')
    {
      if(Lect_Bp() == 'U')    
                {
                  affiche();
                  Avant();delay(20);  
                  for(int i = 0 ; i < 4 ; i++) { digitalWrite(mot[i+2],LOW);  }      // on met a zero toute les broches 
                  }
      else if(Lect_Bp() == 'L') 
                {
                  affiche();
                  Arriere();delay(20);  
                  for(int i = 0 ; i < 4 ; i++) { digitalWrite(mot[i+2],LOW);  }      // on met a zero toute les broches 
                  }
      //else if(Lect_Bp() == 'R') break; // cycle();
       
    }
}
void MenuB()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu B");
    
    while(Lect_Bp()!= 'R')
    {
      cycle();
    }
}
void MenuC()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu C");
    
    while(Lect_Bp()!= 'R')
    {
        affiche();
       
    }
}
void MenuD()
{  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Inside Menu D");
    
    while(Lect_Bp()!= 'R')
    {
        affiche();
       
    }
}

void Affichage_menu_principal()
{
    lcd.clear();
    lcd.setCursor(0,0);
    switch (PageMenuPrincipal)
    {
        case 1:
          lcd.print("1. Menu A");
          break;
        case 2:
          lcd.print("2. Menu B");
          break;
        case 3:
          lcd.print("3. Menu C");
          break;
        case 4:
          lcd.print("4. Menu D");
          break;
    }
}

void Select_menu()
{
    Attente_relache_Bp();
    if(Bp_pousse == 'L') //up
    {
        PageMenuPrincipal++;
        if(PageMenuPrincipal > Nb_menus)
          PageMenuPrincipal = 1;
    }
    else if(Bp_pousse == 'U') // down
    {
        PageMenuPrincipal--;
        if(PageMenuPrincipal == 0)
          PageMenuPrincipal = Nb_menus;    
    }
    
    if(PageMenuPrincipal != PageMenuPrincipal_prec) //only update display when page change
    {
        Affichage_menu_principal();
        PageMenuPrincipal_prec = PageMenuPrincipal;
    }
}

char Lect_Bp()
{
  /* Keypad button analog Value
  no button pressed 1023
  select  741 S
  left    503  L
  down    326  D
  up      142 U
  right   0   R
  */
  val_Bp = analogRead(Broche_Bp);
    if(val_Bp < 200)
    return 'S';
  else if(val_Bp < 400)
    return 'L';
  else if(val_Bp < 600)
    return 'U';
  else if(val_Bp < 800)
    return 'R';
  else 
     return 'N';

}

void affiche()
    {
      Serial.print(Lect_Bp());
      Serial.print("      ");
   
      Serial.print(cpt);
      Serial.println();
    }

void Attente_relache_Bp()
{
    while( analogRead(Broche_Bp) < 800){} 
}

void cycle()
    { 
      
     int i = nbpas;
     while(i > 0)
          {
            i--;
           Arriere();
           //nbpas--;
            //Serial.print("  Bp : ");
            //Serial.print(numPoussoir);
           Serial.print("  nbpas : ");
            Serial.print(i);
            Serial.println(); 
            delay(20); 
          }
    }

/************************************************************************************/
void Arriere()      
      {
        
       for(int j = 0 ; j < 4; j++) {digitalWrite(mot[j+2],P[cpt][j]);}    // on affecte les quatre elements d'une ligne du tableau aux 4 broches
       cpt ++;             // selon cpt (de 0 a 7
       if(cpt > 7) cpt = 0; 
      } // fin fonction
/************************************************************************************/
void Avant()      
      {
       
       for(int j = 0 ; j < 4; j++) { digitalWrite(mot[j+2],P[cpt][j]);} // fin du for j on configure les quatres broches
       cpt --;  
       if (cpt < 0) cpt = 7; 
       } // fin fonction

hello

pourquoi ce j+2

digitalWrite(mot[j+2],P[cpt][j]);

alors que tu déclares:
int mot[4] = {2,4,3,5};

nous sommes d'accord ? mot[0]=2, mot[1]=4, mot[2]=3, mot[3]=5,