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

Une touche est appuyée
(matrice carrée)?

Test si un bouton est appuyé ou non

Reprenons notre matrice avec un pavé 12 touches (le raisonnement sera le même quel que soit la taille de la matrice):

Schéma pour la matrice carrée simple

Pour savoir si une touche est appuyée ou pas, il suffit de mettre par exemple les lignes L1 à L4 en sortie à LOW, et de lire les colonnes (qui sont en INPUT_PULLUP). Si une des colonnes est à LOW, une touche est appuyée. On ne peut pas savoir laquelle, vu que toutes les colonnes sont "sélectionnées".

Attention toutefois à utiliser digitalWrite(ligne, LOW); avant pinMode(ligne, OUTPUT); et pas l'inverse. Dans le cas contraire si L1 (ou L4) est déjà en sortie à LOW, pinMode(L2, OUTPUT); mettrait L2 en sortie à HIGH, le "INPUT_PULLUP" correspond à une entrée à HIGH. Et on pourrait avoir un court-circuit entre L à LOW et L2 à HIGH si les boutons & et * (ou certains autres) était appuyés à ce moment.

Bien entendu si les colonnes sont sur un même port, une seule lecture et un masque éventuel serait encore plus rapide.

Exemple de programme

En utilisant les fonctions standards:

// Matrice carrée, 12 boutons,
// Colonnes broches 2 à 4, lignes broches 5 à 8

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  // Colonnes en entrées
  for (byte broche = 2; broche <= 4; broche++) pinMode(broche, INPUT_PULLUP); // Repos pour toutes les colonnes
  // Lignes à LOW
  for (byte ligne = 5; ligne <=  8; ligne++) // Pour toutes les lignes de la matrice
  {
    digitalWrite(ligne, LOW); // Par précaution, à faire avant
    pinMode(ligne, OUTPUT);
  }
}


void loop()
{
  // Test des colonnes
  for (byte colonne = 2; colonne <= 4; colonne++) // Pour toutes les colonnes
    if (digitalRead(colonne) == LOW) // Une touche est appuyée
    {
      Serial.print("Une touche est appuyée");
      break; // Pas la peine de continuer
    }
  Serial.println(); // "touche appuyée" ou ligne vide
  delay(1000); // Pas trop souvent
}

En utilisant le fait que les colonnes sont sur un même port:

// Matrice carrée, 12 boutons,
// Colonnes broches 2 à 4, lignes broches 5 à 8

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  // Colonnes en entrées
  DDRD &= 0b11100011; // Broches 2 à 4 en entrée
  PORTD |= 0b00011100; // Avec pull-up
  // Lignes à LOW
  for (byte ligne = 5; ligne <= 8; ligne++) // Pour toutes les lignes de la matrice
  {
    digitalWrite(ligne, LOW); // Par précaution, à faire avant
    pinMode(ligne, OUTPUT);
  }
}


void loop()
{
  // Test des colonnes
  // Les broches 2 à 4 sont sur PD2..PD4 
  if ((PIND & 0b00011100) != 0b00011100) // une touche est appuyée
    Serial.print("Une touche est appuyée");
  Serial.println(); // "touche appuyée" ou ligne vide
  delay(1000); // Pas trop souvent
}