Le MAX7219

L’aspect le plus important du MAX7219 est de pouvoir être contrôlé par un bus compatible SPI, QSPI et MICROWIRE.
Il n'utilise que trois fils pour la communication, pour un affichage sur de multiples leds.


Transmission des données série du MAX7219 Le MAX7219 est un composant spécialisé qui prend en charge le multiplexage avec la fréquence de rafraichissement est de 1500 Hz, soit 30 Hz par colonne , largement suffisante pour jouer avec la persistance rétinienne.
Consommation électrique La consommation se limite au maximum à l'allumage de 7 LED. En optant pour un courant de 20 mA par LED, cela nous fait au maximum 140 mA, ce qui est très raisonnable ! Me MAX7219 utilise un format de transmission sur 16Bits de D0 à D15:
D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0
XXXXAdresseDATA

L'adressage

RegistreAdresseHEX
D15
D12
D11D10D9D8
No-OpX0000 0xX0
Digit 0X00010xX1
Digit 1X00100xX2
Digit 2X00110xX3
Digit 3X01000xX4
Digit 4X01010xX5
Digit 5X01100xX6
Digit 6X01110xX7
Digit 7X00000xX8
Decode modeX10010xX9
IntensitéX10100xXA
Scan LimitX10110xXB
SchutdownX11000xXC
Display TestX11110xXF
Les bits sont envoyés du bit de poids fort au bit de poids faible.
Cycle d'initialisation
AdrDataDésignation
0x090x00decoding :BCD off
0x0a0x03brightness 0.3.F
0x0b0x07scanlimit → 8 LEDs
0x0c0x01power-down mode:0,normal mode:1
0x0f0x00test display:1;EOT,display:0
Ordre d'allumage
RegistreAdrData
hexbin
Digit 010x100b00010000
Digit 120x280b00101000
Digit 230x440b01000100
Digit 340x440b01000100
Digit 450x7C0b01111100
Digit 560x440b01000100
Digit 670x440b01000100
Digit 780x000b00000000
Matrices multiples Dans le cas de matrices multiples :

AdrDataAdrDataAdrDataAdrData
10x10 0b0001000010x78 0b0111100010x38 0b0011100010x78 0b01111000
20x28 0b0010100020x44 0b0100010020x44 0b0100010020x44 0b01000100
30x44 0b0100010030x44 0b0100010030x40 0b0100000030x44 0b01000100
40x44 0b0100010040x78 0b0111100040x40 0b0100000040x44 0b01000100
50x7C 0b0111110050x44 0b0100010050x40 0b0100000050x44 0b01000100
60x44 0b0100010060x44 0b0100010060x44 0b0100010060x44 0b01000100
70x44 0b0100010070x78 0b0111100070x38 0b0011100070x78 0b01111000
80x00 0b0000000080x00 0b0000000080x00 0b0000000080x00 0b00000000
L'ordre des informations est le suivant :
0x10,0x78,0x38,0x78,0x28,0x44,0x44,0x44,
0x44,0x44,0x40,0x44,0x44,0x78,0x40,0x44,
0x7C,0x44,0x40,0x44,0x44,0x44,0x44,0x44,
0x44,0x78,0x38,0x78,0x00,0x00,0x00,0x00


En résumé, le balayage se fait d'un block à l'autre.
A chaque ligne envoyer CS=LOW (Selectionner) envoyer adresse,data (x4) puis envoyer CS=HIGH.

CS=LOW, Block 0 (0x01,DATA) → Block 1 (0x01,DATA) → Block 2 (0x01,DATA) → Block 3 (0x01,DATA) → CS=HIGH

CS=LOW,Block 0 (0x02,DATA) → Block 1 (0x02,DATA) → Block 2 (0x02,DATA) → Block 3 (0x02,DATA) → CS=HIGH
CS=LOW,Block 0 (0x03,DATA) → Block 1 (0x03,DATA) → Block 2 (0x03,DATA) → Block 3 (0x03,DATA) → CS=HIGH


CS=LOW,Block 0 (0x08,DATA) → Block 1 (0x08,DATA) → Block 2 (0x08,DATA) → Block 3 (0x08,DATA) → CS=HIGH
Avec son interface serie à 10MHz, avec un arduino nano à 16MHz, pas besoin de temporisation...
Programmation

max7219.ino

     unsigned char i;

#define Max7219_pinCLK 10
#define Max7219_pinCS 11
#define Max7219_pinDIN  12

void setup() {
  pinMode(Max7219_pinCLK,OUTPUT);
  pinMode(Max7219_pinCS,OUTPUT);
  pinMode(Max7219_pinDIN,OUTPUT);
  delay(50);  //Initialiser
  Init_MAX7219();
}

void loop() {

  Write_Max7219(1,0x10);
  Write_Max7219(2,0x30);
  Write_Max7219(3,0x50);
  Write_Max7219(4,0x10);
  Write_Max7219(5,0x10);
  Write_Max7219(6,0x10);
  Write_Max7219(7,B10101010);
  Write_Max7219(8,B01010101);
  delay(500);
  Write_Max7219(8,B10101010);
  Write_Max7219(7,B01010101);
  delay(500);

}


void Init_MAX7219(void)
{
 Write_Max7219(0x09, 0x00);       //decoding :BCD off
 Write_Max7219(0x0a, 0x03);       //brightness 3
 Write_Max7219(0x0b, 0x07);       //scanlimit 8 LEDs
 Write_Max7219(0x0c, 0x01);       //power-down mode:0; normal mode:1
 Write_Max7219(0x0f, 0x00);       //test display:1; EOT display:0
}



 
//Ecriture sur une rangee
void Write_Max7219(unsigned char address,unsigned char dat)
{
        digitalWrite(Max7219_pinCS,LOW);
        Write_Max7219_byte(address);           //addresse LED
        Write_Max7219_byte(dat);               //data  LED 
        digitalWrite(Max7219_pinCS,HIGH);
}

// Ecriture sur un 8x8
void Write_Max7219_byte(unsigned char DATA) 
{   
            unsigned char i;
       digitalWrite(Max7219_pinCS,LOW);      
       for(i=8;i>=1;i--)
          {        
             digitalWrite(Max7219_pinCLK,LOW);
             digitalWrite(Max7219_pinDIN,DATA&0x80);// Extracting a bit data
             DATA = DATA<<1;
             digitalWrite(Max7219_pinCLK,HIGH);
           }                                 
}