Ardu? No!Les boutons ≫ Une touche est appuyée (matrice triangulaire)?

Une touche est appuyée
(matrice triangulaire)?

Il n'y a pas grand chose à gagner si les broches ne sont pas sur le même port car la lecture d'une touche doit positionner deux broches avec des positions non régulières. Par contre si on place la matrice sur un port (ou sur deux si elle ne tient pas sur un seul), on peut lire plusieurs broches en même temps et cela peut aller plus vite. Dans la suite je supposerait donc que la matrice triangulaire est branchée sur les 6 bits libres du port D (broches 2 à 7 correspondant au port PD2 à PD7).

Test si un bouton est appuyé ou non

On va donc mettre une des 6 broches à LOW et lire le mot. Ce mot lu contiendra les deux bits de la liaison série ainsi qu'un 0 correspondant à la sortie que l'on a mis à LOW. Si les autres bits sont à 1, on ne voit pas de boutons appuyé. Le plus simple est de mettre alors les 3 bits qui nous gênent à 1, ainsi si le nouveau mot est à 0b11111111, aucun bouton correspondant n'est appuyé. On fera 5 fois cela pour les 5 premières broches, cela fera des doubles lectures dont on se moque.

Voici ce que cela peut donner:

// Matrice triangulaire, 15 boutons sont branchés entre broches:
// (2,3), (2,4), (2,5), (2,6), (2,7), (3,4), (3,5), (3,6), (3,7), (4,5), (4,6), (4,7), (5,6), (5,7) et (6,7)

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  for (byte broche=2; broche <=7; broche++) pinMode(broche, INPUT_PULLUP); // Repos, toutes les broches en INPUT_PULLUP
}

byte ligne; // Passage de la ligne en sortie à LOW
void loop()
{
  for (ligne=2; ligne &inf;7; ligne++) // Pour touts les lignes sauf la dernière qui n'apporte plus rien
  {
    digitalWrite(ligne, LOW); // Passage de la ligne en sortie à LOW
    pinMode(ligne, OUTPUT);
    if (((PIND | 0b00000011) | (1 << ligne)) != 0b11111111) break; // Arrêt si on a un bouton appuyé
    pinMode(ligne, INPUT_PULLUP); // Retour au repos de la ligne
  }
  if (ligne < 7) // Un bouton est appuyé
  {
    pinMode(ligne, INPUT_PULLUP); // Retour au repos de la ligne
    Serial.println("Un bouton est appuyé");
  }
  else Serial.println(); // Suppression du message car aucun bouton n'est appuyé
  delay(100); // Pas trop souvent
}

On y gagne un petit peu en temps, mais ce n'est pas formidable