Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
MAX7219-kontrolleren er produsert av Maxim Integrated er en kompakt, seriell inngang/utgang felles-katodeskjermdriver som kan koble mikrokontrollere til 64 individuelle lysdioder, 7-segment numeriske LED-skjermer på opptil 8 sifre, stolpediagrammer osv. Inkludert på -chip er en BCD-kode-B-dekoder, multiplex skannekretser, segment- og sifferdrivere og en 8 × 8 statisk RAM som lagrer hvert siffer.
MAX7219 -modulene er veldig praktiske å bruke med mikrokontrollere som ATtiny85, eller i vårt tilfelle Tinusaur Board.
Trinn 1: Maskinvaren
MAX7219 -modulene ser vanligvis slik ut. De har en inngangsbuss på den ene siden og utgangsbuss på den andre. Dette lar deg kjede 2 eller flere moduler, dvs. etter hverandre, for å lage mer kompliserte oppsett.
Modulene vi bruker er i stand til å koble til en kjede ved hjelp av 5 små hoppere. Se bildet nedenfor.
Trinn 2: Pinout og signaler
MAX7219 -modulen har 5 pinner:
- VCC - effekt (+)
- GND-bakken (-)
- DIN - Datainngang
- CS - Chip select
- CLK - Klokke
Det betyr at vi trenger 3 pinner på ATtiny85 -mikrokontrollersiden for å kontrollere modulen. De vil være:
- PB0 - koblet til CLK
- PB1 - koblet til CS
- PB2 - koblet til DIN
Dette er tilstrekkelig for å koble til MAX7219 -modulen og programmere den.
Trinn 3: Protokollen
Kommunikasjon med MAX7219 er relativt enkelt - den bruker en synkron protokoll som betyr at for hver databit vi sender er det en klokkesyklus som betyr tilstedeværelsen av den databiten.
Med andre ord sender vi 2 parallelle sekvenser til biter - en for klokken og en annen for dataene. Dette er hva programvaren gjør.
Trinn 4: Programvaren
Slik fungerer denne MAX7219 -modulen:
- Vi skriver byte til det interne registeret.
- MAX7219 tolker dataene.
- MAX7219 styrer lysdiodene i matrisen.
Det betyr også at vi ikke trenger å sirkle gjennom en rekke LED -er hele tiden for å lyse dem - MAX7219 -kontrolleren tar seg av det. Det kan også styre intensiteten til lysdiodene.
Så for å bruke MAX7219 -modulene på en praktisk måte trenger vi et bibliotek med funksjoner for å tjene dette formålet.
Først trenger vi noen grunnleggende funksjoner for å skrive til MAX7219 registre.
- Skriver en byte til MAX7219.
- Skriver et ord (2 byte) til MAX7219.
Funksjonen som skriver en byte til kontrolleren ser slik ut:
void max7219_byte (uint8_t data) {for (uint8_t i = 8; i> = 1; i--) {PORTB & = ~ (1 << MAX7219_CLK); // Sett CLK til LAV hvis (data & 0x80) // Masker MSB for dataene PORTB | = (1 << MAX7219_DIN); // Sett DIN til HIGH else PORTB & = ~ (1 << MAX7219_DIN); // Sett DIN til LAV PORTB | = (1 << MAX7219_CLK); // Sett CLK til HIGH data << = 1; // Skift til venstre}}
Nå som vi kan sende byte til MAX7219 kan vi begynne å sende kommandoer. Dette gjøres ved å sende 2 byes - første for adressen til det interne registeret og det andre for dataene vi ønsker å sende.
Det er mer enn et dusin register i MAX7219 -kontrolleren.
Å sende en kommando, eller et ord, er i utgangspunktet å sende 2 påfølgende byte. Funksjonen som implementerer det er veldig enkel.
void max7219_word (uint8_t address, uint8_t data) {PORTB & = ~ (1 << MAX7219_CS); // Sett CS til LOW max7219_byte (adresse); // Sender adressen max7219_byte (data); // Sende dataene PORTB | = (1 << MAX7219_CS); // Sett CS til HIGH PORTB & = ~ (1 << MAX7219_CLK); // Sett CLK til LAV}
Det er viktig å merke seg linjen der vi tar CS -signalet tilbake til HIGH - dette markerer slutten på sekvensen - i dette tilfellet slutten av kommandoen. En lignende teknikk brukes for å kontrollere mer enn én matrise som er koblet til en kjede. Neste trinn, før vi begynner å slå på og av lysdiodene, er å initialisere MAX7219 -kontrolleren. Dette gjøres ved å skrive visse verdier til visse registre. For enkelhets skyld, mens vi koder det, kan vi sette initialiseringssekvensen i en matrise.
uint8_t initseq = {0x09, 0x00, // Decode-Mode Register, 00 = No decode 0x0a, 0x01, // Intensity Register, 0x00.. 0x0f 0x0b, 0x07, // Scan-Limit Register, 0x07 for å vise alle linjer 0x0c, 0x01, // Shutdown Register, 0x01 = Normal drift 0x0f, 0x00, // Display-Test Register, 0x00 = Normal Operation};
Vi trenger bare å sende de fem kommandoene ovenfor i en sekvens som adresse/datapar. Neste trinn - lyser opp en rad lysdioder.
Dette er veldig enkelt - vi skriver bare en kommando der 1. byte er adressen (fra 0 til 7) og 2. byte er de 8 bitene som representerer de 8 lysdiodene i rekken.
void max7219_row (uint8_t address, uint8_t data) {if (address> = 1 && address <= 8) max7219_word (address, data); }
Det er viktig å merke seg at dette bare vil fungere for 1 matrise. Hvis vi kobler flere matriser i en kjede, viser de alle de samme dataene. Grunnen til dette er at etter at vi har sendt kommandoen, bringer vi CS -signalet tilbake til HIGH som får alle MAX7219 -kontrollerne i kjeden til å låse seg og vise hva den siste kommandoen var.