1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| // Déclaration du tableau définissant l'image
// Un bit à '0' correspont à une LED éteinte, un bit à '1' à une LED allumée
byte bitmapEcran[8]; // 8 octets, initialisé à zéro par défaut
// pour faire "lisible" on ne condense pas les 15 bits sur 2 octets, on va en utiliser 5. à optimiser plus tard
// les chiffres de 0 à 9 dans une matrice de 3x5
const byte lesChiffres[][5] =
{
{0b111, 0b101, 0b101, 0b101, 0b111}, // 0
{0b010, 0b110, 0b010, 0b010, 0b010}, // 1
{0b111, 0b001, 0b010, 0b100, 0b111}, // 2
{0b111, 0b001, 0b011, 0b001, 0b111}, // 3
{0b101, 0b101, 0b111, 0b001, 0b001}, // 4
{0b111, 0b100, 0b111, 0b001, 0b111}, // 5
{0b100, 0b100, 0b111, 0b101, 0b111}, // 6
{0b111, 0b001, 0b011, 0b001, 0b001}, // 7
{0b111, 0b101, 0b111, 0b101, 0b111}, // 8
{0b111, 0b101, 0b111, 0b001, 0b001}, // 9
};
// Déclaration des pins utilisées pour le branchement de la matrice
const int columnPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int rowPins[] = {10, 11, 12, 15, 16, 17, 18, 19};
// on remplit les bit 7 6 5 des octets 0,1,2,3 et 4 de bitmapEcran en fonction des bits 2 1 et 0 des octets lesChiffres[valeur][0->4]
void scoreJoueurGauche(byte valeur)
{
for (int8_t ligne = 0; ligne < 5; ligne++) {
for (int8_t bit = 7; bit > 4; --bit) {
// à faire en utilisant bitRead, bitSet ou bitClear
}
}
}
// on remplit les bit 2 1 0 des octets 3,4,5,6 et 7 de bitmapEcran en fonction des bits 2 1 et 0 des octets lesChiffres[valeur][0->4]
void scoreJoueurDroite(byte valeur)
{
for (int8_t ligne = 3; ligne < 8; ligne++) {
for (int8_t bit = 2; bit >= 0; --bit) {
// à faire en utilisant bitRead, bitSet ou bitClear
}
}
}
// Sous-routine pour la commande des LEDs à partir des données du tableau
void afficherEcran(byte * bitmap)
{
for (byte row = 0; row < 8; row++) { // Première itération (boucle for) sur les lignes
digitalWrite(rowPins[row], LOW); // Connexion de la ligne au GND
for (byte col = 0; col < 8; col++) { // Seconde itération sur les colonnes
byte situ = 7 - col; // Miroir sur le poids du bit pour avoir le bon numéro de colonne
if (bitRead(bitmap[row], col) == 1) digitalWrite(columnPins[situ], HIGH); // si bit à 1 on allume cette LED
delayMicroseconds(300); // On attend un peu entre chaque LED (délai total ~20ms pour 64 LEDs)
digitalWrite(columnPins[situ], LOW); // Et on reconnecte la colonne de la masse...
}
digitalWrite(rowPins[row], HIGH); // et en fin, la ligne de l'alimentation
}
}
void setup()
{
// On met toutes les pins en sortie
for (byte i = 0; i < 8; i++) {
pinMode(rowPins[i], OUTPUT); // lignes en sorties
pinMode(columnPins[i], OUTPUT); // colonnes en sorties
}
// par exemple mettre des scores
scoreJoueurGauche(2);
scoreJoueurDroite(5);
}
void loop()
{
afficherEcran(bitmapEcran); // à effectuer souvent, c'est la persistence rétinienne qui permet de voir les chiffres
// vous pouvez coder autre chose ici mais il ne faut pas que ce soit bloquant
} |
Partager