Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-13 06:58
MAX7219-styrenheten är tillverkad av Maxim Integrated är en kompakt, seriell ingång/utgång gemensam-katod-bildskärmsdrivrutin som kan ansluta mikrokontroller till 64 individuella lysdioder, 7-segment numeriska LED-displayer med upp till 8 siffror, stapeldiagram, etc. Ingår på -chip är en BCD-kod-B-avkodare, multiplexskanningskretsar, segment- och sifferdrivrutiner och ett 8 × 8 statiskt RAM-minne som lagrar varje siffra.
MAX7219 -modulerna är mycket praktiska att använda med mikrokontroller som ATtiny85, eller i vårt fall Tinusaur Board.
Steg 1: Hårdvaran
MAX7219 -modulerna ser vanligtvis ut så här. De har en ingångsbuss på ena sidan och utgångsbuss på den andra. Detta gör att du kan kedja 2 eller flera moduler, dvs en efter en, för att skapa mer komplicerade inställningar.
De moduler som vi använder kan anslutas i en kedja med 5 små hoppare. Se bilden nedan.
Steg 2: Pinout och signaler
MAX7219 -modulen har 5 stift:
- VCC - effekt (+)
- GND-mark (-)
- DIN - Datainmatning
- CS - Chip select
- CLK - Klocka
Det betyder att vi behöver 3 stift på ATtiny85 -mikrokontrollersidan för att styra modulen. De kommer att vara:
- PB0 - ansluten till CLK
- PB1 - ansluten till CS
- PB2 - ansluten till DIN
Detta är tillräckligt för att ansluta till MAX7219 -modulen och programmera den.
Steg 3: Protokollet
Kommunikation med MAX7219 är relativt enkelt - det använder ett synkront protokoll som innebär att för varje databit vi skickar finns en klockcykel som betyder närvaron av den databiten.
Med andra ord skickar vi 2 parallella sekvenser till bitar - en för klockan och en annan för data. Detta är vad programvaran gör.
Steg 4: Programvaran
Så här fungerar MAX7219 -modulen:
- Vi skriver byte till dess interna register.
- MAX7219 tolkar data.
- MAX7219 styr lysdioderna i matrisen.
Det betyder också att vi inte behöver cirkla genom matrisen hela tiden för att tända dem - MAX7219 -kontrollen tar hand om det. Det kan också hantera intensiteten hos lysdioderna.
Så för att använda MAX7219 -modulerna på ett bekvämt sätt behöver vi ett bibliotek med funktioner för att tjäna det syftet.
Först behöver vi några grundläggande funktioner för att kunna skriva till MAX7219 -registren.
- Skriver en byte till MAX7219.
- Skriva ett ord (2 byte) till MAX7219.
Funktionen som skriver en byte till styrenheten ser ut så här:
void max7219_byte (uint8_t data) {för (uint8_t i = 8; i> = 1; i--) {PORTB & = ~ (1 << MAX7219_CLK); // Ställ CLK på LÅG om (data & 0x80) // Maskera MSB för data PORTB | = (1 << MAX7219_DIN); // Ställ in DIN på HIGH else PORTB & = ~ (1 << MAX7219_DIN); // Ställ in DIN till LÅG PORTB | = (1 << MAX7219_CLK); // Ställ CLK på HIGH data << = 1; // Skift till vänster}}
Nu när vi kan skicka byte till MAX7219 kan vi börja skicka kommandon. Detta görs genom att skicka 2 byes - 1: a för adressen till det interna registret och det andra för de data vi vill skicka.
Det finns mer än ett dussin register i MAX7219 -styrenheten.
Att skicka ett kommando, eller ett ord, är i princip att skicka 2 byte i rad. Funktionen som implementerar det är mycket enkel.
void max7219_word (uint8_t address, uint8_t data) {PORTB & = ~ (1 << MAX7219_CS); // Ställ in CS på LÅG max7219_byte (adress); // Skicka adressen max7219_byte (data); // Skicka data PORTB | = (1 << MAX7219_CS); // Ställ in CS på HIGH PORTB & = ~ (1 << MAX7219_CLK); // Ställ CLK på LÅG}
Det är viktigt att notera här linjen där vi tar tillbaka CS -signalen till HIGH - detta markerar slutet på sekvensen - i detta fall slutet av kommandot. En liknande teknik används för att styra mer än en matris ansluten i en kedja. Nästa steg, innan vi börjar slå på och av lysdioderna, är att initiera MAX7219 -styrenheten. Detta görs genom att skriva vissa värden till vissa register. För enkelhets skull, medan vi kodar det kan vi sätta initialiseringssekvensen i en array.
uint8_t initseq = {0x09, 0x00, // Decode-Mode Register, 00 = No decode 0x0a, 0x01, // Intensity Register, 0x00.. 0x0f 0x0b, 0x07, // Scan-Limit Register, 0x07 för att visa alla rader 0x0c, 0x01, // Avstängningsregister, 0x01 = Normal drift 0x0f, 0x00, // Display-Test Register, 0x00 = Normal Operation};
Vi behöver bara skicka de fem kommandona ovan i en sekvens som adress/datapar. Nästa steg - lysa upp en rad lysdioder.
Detta är väldigt enkelt - vi skriver bara ett kommando där 1: a byte är adressen (från 0 till 7) och 2: a byten är de 8 bitarna som representerar de 8 lysdioderna i raden.
void max7219_row (uint8_t address, uint8_t data) {if (address> = 1 && address <= 8) max7219_word (address, data); }
Det är viktigt att notera att detta endast fungerar för en matris. Om vi ansluter fler matriser i en kedja visar de alla samma data. Anledningen till detta är att efter att ha skickat kommandot tar vi tillbaka CS -signalen till HIGH vilket får alla MAX7219 -styrenheter i kedjan att låsa och visa vad det sista kommandot var.