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
}