Sélection fichier sur carte SD

Bonsoir, et merci pour l'idée !

J'ai donc écrit un petit programme réduit à son strict minimum :
Test de 2 boutons + et - câblés pour la circonstance, lancement de la fonction incriminée à l'initialisation puis à chaque appui sur les touches. Le module LCD a été retiré.

Le problème est identique, sauf que maintenant le dysfonctionnement survient au 20ème appel de la fonction (au lieu de 11 en fonctionnement normal). J'appuie de manière aléatoire sur les 2 boutons et à chaque essai c'est toujours au bout de 20 appels que la variable fichier se bloque sur 0 (donc boucle while ignorée). J'ai essayé d'ajouter des fichiers, idem, toujours blocage à 20 !
Je n'arrive pas à trouver ce qui cloche.... La variable openNextFile() est-elle bien utilisée ?

Voici mon sketch d'essai :

// Programme de test
// Défilement des fichiers de la carte SD (en partant du dernier) avec 2 boutons + et -

#include <SPI.h>                        // bibliothèque bus SPI
#include <SD.h>                         // bibliothèque carte SD

const int chipSelect = 10;  // D10 = signal CS (chip select) de la carte SD en SPI
const int pinPlus = 8; // fil bleu
const int pinMoins = 9; // fil jaune

String nomFichier = "";         // nom du fichier courant
uint8_t nbFichiers = 0;         // nombre de fichiers sur la carte SD
uint8_t noFichier = 0;          // n° de fichier dans la liste

uint8_t etatAvantP = 0;          // état du bouton + : état antérieur
uint8_t etatActuelP = 0;         //                    état courant
uint8_t etatAvantM = 0;          // état du bouton - : état antérieur
uint8_t etatActuelM = 0;         //                    état courant

void setup() {

  pinMode(pinPlus, INPUT);
  pinMode(pinMoins, INPUT);

  // Debugging output
  Serial.begin(9600);

  // test carte SD
  if (!SD.begin(chipSelect)) {
    Serial.println("SD absente ou HS");
    return;
  }
  Serial.println("Choisir un fichier");
  nomFichier = affiFichier(0);  // affichage nom dernier fichier 
                                // et initialisation du nombre de fichiers dans nbFichiers
}

void loop() {

  // TEST DES BOUTONS (boutons + et - à 1 au repos, à 0 en appuyant)

  etatActuelP = digitalRead(pinPlus);
  if (etatActuelP != etatAvantP) {
    if (!etatActuelP) { // bouton + appuyé
      noFichier++;
      if (noFichier > nbFichiers) {
        noFichier--;
      }
      Serial.println(noFichier);
      nomFichier = affiFichier(noFichier);  // affichage nom fichier indexé par noFichier > 0
      Serial.print("+ ");
      Serial.println(nomFichier);
      Serial.println("Retour boucle d'attente");
    }
    etatAvantP = etatActuelP;
    delay(10);
  }

  etatActuelM = digitalRead(pinMoins);
  if (etatActuelM != etatAvantM) {
    if (!etatActuelM) { // bouton - appuyé
      noFichier--;
      if (noFichier < 1) { 
        noFichier = 1;
      }
      Serial.println(noFichier);
      nomFichier = affiFichier(noFichier);  // affichage nom fichier indexé par noFichier > 0
      Serial.print("- ");
      Serial.println(nomFichier);
      Serial.println("Retour boucle d'attente");
    }
    etatAvantM = etatActuelM;
    delay(10);
  }
}

// **********************************************************************


String affiFichier(uint8_t num) { // affiche un fichier de la carte SD
  Serial.print("Fonction avec valeur ");
  Serial.println(num);
  File dossier = SD.open("/");
  File fichier = dossier.openNextFile();
  String fic;
  uint8_t n = 0;
  bool x = false;
  if (num == 0) {  // (voir ci-dessous)
    x = true;
  }
  Serial.println(nbFichiers);
  Serial.println(fichier);
  while (fichier & ((n < num) | x)) { // x à 1 masque la condition (n < num) si num = 0
    n++;
    fic = fichier.name();
    fichier.close();
    fichier = dossier.openNextFile();
    Serial.print(n);
    Serial.println(fic);
  }
  fichier.close();
  if (num == 0) {   // au 1er lancement mémorise le nombre de fichiers
    nbFichiers = n;
    noFichier = n;  // commence par le dernier fichier
  }

  Serial.println("Resultat :");
  Serial.print(num);
  Serial.println(fic);
  Serial.println("Fin fonction");
  return fic;
}

// **********************************************************************