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):
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 }