Mobiltelefoner och prylar

Mobiltelefoner och prylar

» 8x8 matriskontroll

8x8 matriskontroll


Kina tillhandahåller för ett litet pris en enorm mängd av inte bara elektroniska enheter utan också deras komponenter. En liten uppsättning lysdioder kan visa den information du behöver, förmodligen siffror, eftersom upplösningen inte är särskilt hög, 8 gånger 8 lysdioder, varje diameter 3 mm. Denna matris lyser i rött, eftersom den är den mest synliga och drar till sig uppmärksamhet mer än andra färger.


Det är mest bekvämt att använda denna matris för att styra Arduino eftersom det är digitalt. Om du skriver ett enkelt program kan du visa nödvändig information på denna LED-skärm. Det finns dyrare trefärgsmatriser till försäljning, där du genom att kombinera de tre huvudsakliga färgerna kan skapa nästan vilka som helst.


Denna matris har 16 stift, ett diagram tillhandahålls ovan, som tydligt visar hur de elementära komponenterna i matrisen är anslutna - lysdioder, styrda av den, kan du korrekt ansluta modulen för att återge information av både digitala och analoga enheter. Glöm inte de nuvarande begränsningsmotstånden, det kommer att vara tråkigt om någon av pixlarna brinner ut. Den nominella kontinuerliga strömmen för en punkt är lika med 20 mA, toppframström 100 mA, matningsspänning 2,1-2,1V, våglängd 625-630 nm, den maximala effektförlusten är 40 mW, anoden är vanlig här, det vill säga ett plus. Övergripande mått på LED-matrisen 37 37 8 mm. Du måste löda noggrant, rör inte lödkolven med en temperatur på 260 grader i mer än 5 s, den rekommenderade driftstemperaturen är -40 - +70 Celsius.

Om du har flera sådana matriser på lysdioder kan du koppla ihop dem för att skapa stora informationstavlor.

Matrisdisplay - en enhet som består av en 8x8 LED-matris och ett styrkort baserat på MAX7219-chippet med minsta nödvändiga rörledning. På bilden kan du redan se den färdiga enheten, men den kom till mig via post i det här formuläret, så jag var tvungen att plocka upp en lödkolv och löda allt på rätt sätt.

Den grundläggande anslutningen till Arduino Nano-kortet visas i kretsschemat.

Som du kan se från diagrammet är allt enkelt, du behöver bara ansluta kontakterna på båda korten med ledningar i följande ordning:

Arduino NanoMatrix 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN-kod GNDPIN-kod GND

Så, äntligen är det dags att arbeta med koden, och för att köra LED-matrisen måste du ladda ner och installera LedControl-biblioteket. Biblioteket stöder mikrokretsar MAXIM 7221 och 7219. LED-matrisen använder MAX7219 som drivrutin, detta är vad vi behöver. Jag tycker att vi ska börja med en liten skiss som visar de grundläggande funktionerna i detta bibliotek. I skissen används funktionen setRow() för att slå på/stänga av lysdioderna. Syntaxen för att anropa funktionen setRow() är:

matrix.setRow(0, rad, kol, set);

Var matris- klassobjekt LedControl

0 - enhetens adress på SPI-bussen, i detta fall finns det bara en enhet, och numreringen börjar från adress noll

rad- rad (möjliga värden från 0 till 7)

kol- kolumn (möjliga värden är från 0 till 7)

uppsättning- inställningsvärde( Sann- sätta på, falsk- Stäng av)

matrix.setRow(0, 1, 4, true)

Slå på lysdioden på matrisen, placerad i den första raden och i den fjärde kolumnen.

Ett annat exempel:

int x = 1;

int y = 4;

matrix.setRow(0, x, y, sant);

matrix.setRow(0, x, y, false);

Detsamma är endast med användningen av variabler, och efterföljande släckning av den tända lysdioden vid de givna koordinaterna. Så i skissen spelas flera animationer upp med funktionen setRow ().

#include "LedControl.h" //Syntax för att skapa LedControl-klassen(dataPin,clockPin,csPin,numDevices) //Där LedControl är ett objekt i klassen //dataPin är stiftet på Arduino-kortet som DIN-stiftet kommer till vara ansluten //clockPin är stiftet på kortet Arduino som CLK-stiftet kommer att anslutas till //csPin - stiftet på Arduino-kortet som CS-stiftet kommer att anslutas till //numDevices - antalet enheter på bussen / /Skapa ett objekt av matrisklassen i vårt fall med en ansluten enhet LedControl matrix = LedControl(12, 11 , 10, 1); //Fördröjningstid för att slå på/av lysdioden på matrisen const int delayValue = 100; //Funktionsprototyper //Sekventiell på/av void PointSerialSet(); //Snake från höger till vänster void PointRigthToLeft(); //Snake från botten till toppen void PointDownToUp(); //Snake från vänster till höger void PointLeftToRigth(); //Snake från topp till botten void PointUpToDown(); //Effekt - fading puls void PointFading(); //Effekt - pulsvoid PointPulse(); //Effekt - växande impulsvoid PointClimbing(); //Effekt av att vrida spiralen inuti void PointToSpiralIn(); //Effekt av att snurra spiralen utåt tomrummet PointToSpiralOut(); void setup() ( // Enhet med adress 0 väcks som standard matrix.shutdown(0, false); //Ställ in ljusstyrkan på LED-matrisen till 8 //Möjliga värden är från 0 till 15 matrix.setIntensity( 0, 8); //Clear display matrix.clearDisplay(0); ) void loop() ( //Call-funktioner en efter en PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse(); PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Funktionskroppar void PointSerialSet() ( //Använd funktionen setLed(adress, rad, kol, set) //Sekventiell påslagning av rader för(int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( för(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från botten till toppen för (int i = 7; i >= 0; i --) ( för(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från vänster till höger för (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Använd funktionen setLed(adress, rad, kol, set) //Snake från topp till botten för (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Använd funktionen setLed(address, row, col, set) //Fadningseffekt int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= uppVärde; n --) ( matrix.setLed(0, n, i, sant); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= uppVärde; n --) ( matrix.setLed(0, n, i, sant); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; climb --) ( matrix.setLed(0, climb, i, true); delay(delayValue / 4); matrix.setLed(0, climb, i, false); ) for(int fade = 1; fade< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= längdX - 1 - offset) ( dir = 1; ) fortsätt; ) if(dir == 1) (punkt Y ++; om(punkt Y ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= längdX - 1 - offset) ( dir = 1; ) fortsätt; ) if(dir == 1) (punktY ++; if(punktY >= längdY - 1 - offset) (dir = 2; ) fortsätt; ) if(dir == 2) (punktX --; if(punktX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }

Video på sketchen:


Vänligen aktivera javascript för att kommentarer ska fungera.

Den här artikeln skapades för dem som köpte en bar 8x8 matris och 74hc595 skiftregister och inte vet hur man kopplar ihop allt.

Jag sökte länge på Internet efter instruktioner om hur man ansluter ovanstående komponenter, men jag hittade antingen inte för mina register eller med icke-fungerande skisser, så jag bestämde mig för att jag fortfarande måste arbeta med mina händer och huvud för att behaga mig själv med 8 * 8 bilder.

Efter att ha hittat datablad för matrisen och skiftregistren på Internet ritade jag följande diagram:

Det 12:e benet på båda mikrokretsarna (låsstift) för att spara portar är vanligt, eftersom det inte är meningsfullt att låsa registren vid olika tidpunkter. Vissa av matrisstiften (anoderna) är anslutna via strömbegränsande motstånd med ett nominellt värde på 220 ohm. Allt annat enligt schemat är extremt enkelt. För säkerhets skull, bilder med pinout av matrisen.

Bilder måste visas rad för rad (annars med liknande matriser finns det ingen möjlighet), med en liten fördröjning (det mänskliga ögat skiljer praktiskt taget inte mellan en fördröjning på 1 ms).

Jag försökte förklara allt i skissen. När du laddar upp till tavlan kommer displayen att visa siffrorna som vi skickar till arduino portmonitorn. (Se video)

Foto av den färdiga enheten (sick-sack på skärmen, i skissen lagras dess bild i bildmatrisen)

I framtiden kommer jag att försöka göra något intressant på denna display.

Äntligen kom matrismoduler från Kina. Varje modul består av ett MAX7219-chip (), en LED-matris, en kondensator och ett motstånd finns i kabelnätet.


Styrs av MAX7219 via SPI-gränssnitt.


Mikrokretsar i ett kluster är seriekopplade. Jag läste på Internet att den maximala seriella anslutningen tillåter endast 8 stycken MAX7219. Tro inte. 16 moduler anslutna, och allt fungerar bra.

Modulerna som presenteras på Ali finns i flera versioner. De mest populära är 2 typer: med en mikrokrets i DIP och i SOIC-paket. DIP-chipmodulen är större och inte lika bekväm när den är ansluten i ett kluster. Du måste ansluta ett gäng ledningar.


Moduler med ett chip i ett SOIC-paket är storleken på en LED-matris och kopplas ihop med lödning eller byglar. Det blir snyggt och snyggt.


De mest kända biblioteken för att arbeta med matriser och kluster är MAX72xx Panel av Mark Rice och Parola av MajicDesigns: Det första biblioteket är lättare att använda, det andra är mer komplext med fler funktioner. Jag ska skriva ut det mer i detalj.

MAX72xx Panel

Biblioteksinstallation krävs när du använder MAX72xx Panel Adafruit GFX.

För att russifiera texten måste du ladda ner DEN HÄR FILEN och ersätt standardfilen glcdfont.c i katalogen Arduino/Libraries/Adafruit-GFX-Library-master. Också i den här filen, förutom de nödvändiga bokstäverna och siffrorna, beskrivs en massa alla möjliga tecken. Alla kanske inte är användbara. Bilden nedan förklarar hur symbolerna bildas.

Om det behövs kan du skapa dina egna symboler och ersätta dem med eventuella oanvända i filen. Nästan alla bitmappsteckensnitt som används i olika bibliotek bildas på detta sätt.

Så, biblioteken MAX72xx Panel och Adafruit GFX är installerade, filen glcdfont.c ersätts. Starta Arduino IDE, öppna FIL. Det finns en utf8rus-funktion i skissen. Det ger omkodning av teckentabellen för det ryska språket. Det behövs bara för normal utmatning från programmet, det vill säga i programmet är den önskade texten skriven på ryska. Om texten skrivs in via COM-porten korrigeras teckenkoderna i Serial_Read-funktionen. I IDE och i konsolen använde utvecklarna olika kodningar.

I början av filen finns rader nödvändiga för att biblioteket ska fungera.

int numberOfHorizontalDisplays = 1;

int numberOfVerticalDisplays = 16;

Jag har moduler med ett chip i ett SOIC-paket. De har en liten funktion. Modulernas matris installeras roterad 90 grader. Det är en bekvämlighetsavgift. Om du kör skisserna som följer med biblioteken kommer de att mata ut text från botten till toppen i varje modul. Texten kommer att visas i sicksack. För att behandla denna åkomma behöver biblioteket "berättas" att det finns 16 vertikala displayer (de är fysiskt placerade horisontellt). Och sedan i void Setup ange raden för biblioteket

matrix.setRotation(matrix.getRotation() + 1);

Den vänder programmatiskt varje matris. Och allt kommer att visas normalt.

Moduler med ett DIP-chippaket har inte detta. Allt är vackert, förutom ett gäng sladdar.

MAX72xx Panel-biblioteket är ganska blygsamt. Det finns inga visuella uteffekter. Klustret uppfattas som en helhet. Det går mycket bättre med MD Parola.

Parola från MajicDesigns.

Ägare av moduler med ett chip i ett SOIC-paket kommer också att möta problemet med att orientera moduler i ett kluster. Bara det ser lite annorlunda ut än i MAX72xx. Här kommer modulerna att dyka upp så att säga ur tur.


HelloWorld-skiss från prover som ingår i biblioteket.

Programmässigt i skissen kunde jag inte bota denna åkomma. Jag behandlade honom annorlunda. I filen Adruino/libraries/MD_MAX72xx_lib.h i slutet behöver du hitta linjerna som på bilden.


Och fixa den valda raden från 1 till 0. Spara filen. Arduino IDE behöver inte startas om. Vi häller, vi tittar.


Nu kan du använda 24 animationseffekter. Animeringen startas med kommandot P.displayText(“Text att visa”, “textjustering”, hastighet, visningsfördröjning, intoningseffekt, uttoningseffekt). Som du kan se finns det många inställningar.

Och det mest njutbara är uppdelningen av klustret i virtuella zoner. Att arbeta med zoner är inte särskilt svårt. Jag lägger inte upp skissen, den finns i proverna som följer med biblioteket. Nu kan du nästan utan problem visa klockan i början av klustret och nyhetstickern på de återstående modulerna.

Som du kanske redan gissar är problemet med kyrilliska bokstäver. Hon är också lösbar. Bredvid föregående fil i samma katalog finns filen MD_MAX72xx_font.cpp. Detta är en teckensnittsfil. Tecknen i den är utformade på samma sätt som bibliotekets GFX-teckensnittsfil. Det finns en liten skillnad. Här kan teckenstorleken vara mindre än 5 poäng. I Adafruit GFX-biblioteket tar utropstecken till exempel upp samma 5 punkter lika breda som alla andra symboler, endast en rad med punkter används. Resten lyser inte, utan används som symbol. I Parola upptar samma utropstecken också en rad med prickar, bara det finns inga tomma prickar i närheten, men intilliggande tecken kan vara det. Det blir tydligare att förstå bilden.


Det finns ingen tid att komplettera filen med kyrilliska tecken på samma sätt som filen från det första övervägda biblioteket. Om någon gör detta och skickar mig en fil kommer jag att lägga till den i den här artikeln, och både jag och gästerna på min sida kommer att vara dig tacksamma.

Resultat. MAX72xx Panel-biblioteket av Mark Rice är lätt att använda och förstå, men med dålig funktionalitet.

Parola-biblioteket från MajicDesigns är mer komplext och har tillräckligt med kapacitet för nästan alla applikationer.

På tidigare lektioner har vi lärt oss med hjälp av ett skiftregister. Detta visade sig vara lite svårare än direkt från stift för allmänt bruk. Problemet som vi sedan var tvungna att lösa var det begränsade antalet kontrollerade utgångar på Arduino-kontrollern. Höjdpunkten för vår forskning var användningen av dynamisk indikation för. Nu är det dags att komplicera uppgiften lite mer: vi lär oss att arbeta med LED-matrisen.

1. Matrisindikator

Som vi redan vet består segmentindikatorer, oavsett om de är skalor eller siffror, av individuella lysdioder som är sammankopplade. Till exempel kan en grupp lysdioder ha alla katoder anslutna. En sådan indikator har en efterskrift "med en gemensam katod", annars - "med en gemensam anod". Och vad händer om vi placerar lysdioderna inte i form av ett nummer eller en skala, utan i form av ett rutnät? Det kommer att visa sig vara en ganska grafisk indikator. Det vill säga en där du kan visa inte bara ett nummer utan också någon form av bild. Ett sådant rutnät kallas en matrisindikator, och i fallet med lysdioder en LED-matris. Upplösningen för en matrisindikator är antalet horisontella och vertikala punkter. Till exempel har de vanligaste indikatorerna en upplösning på 8×8 pixlar. Om en LED-matris med högre upplösning krävs, består den helt enkelt av flera 8x8-indikatorer. Hur man gör detta får vi se senare. Under tiden, låt oss ta reda på hur alla 64 lysdioder inuti matrisen är anslutna. Naturligtvis skulle det vara möjligt, som i fallet med en sjusegmentsindikator, att ansluta alla lysdioder med en gemensam katod eller anod. I det här fallet skulle vi behöva antingen 64 kontrollerstift eller 8 skiftregister. Båda alternativen är mycket slösaktiga. Ett mer korrekt alternativ är att kombinera lysdioderna i grupper om 8 delar med en gemensam katod. Låt dessa vara matrisens kolumner. Sedan kombineras parallella lysdioder i dessa kolumner igen i grupper om 8 stycken redan med en gemensam anod. Du får följande schema:
Anta att uppgiften är att tända R6C3 LED. För att göra detta måste vi applicera en hög signalnivå på stift R6 och ansluta stift C3 till jord. Utan att stänga av denna punkt, låt oss försöka tända en annan - R3C7. Anslut det positiva strömstiftet till R3 och jord till C7. Men i det här fallet kommer raderna R6 och R3 att korsa kolumnerna C3 och C7 inte på två, utan på fyra ställen! Följaktligen kommer inte två, utan fyra punkter att lysa. Problem! Uppenbarligen kan detsamma hjälpa. Om vi ​​slår på punkterna R6C3 och R3C7 i sin tur väldigt snabbt kan vi använda synens uthållighet - förmågan att tolka snabbt föränderliga bilder som en helhet.

2. LED-matris och skiftregister

I vår lektion kommer vi att ansluta den enklaste 8 × 8 röda LED-matrisen till Arduino Uno. Pinnumrering börjar från det nedre vänstra hörnet. Samtidigt är numreringen av benen 1-16 inte kopplad av någon logik med numreringen av kolumner och rader C och R.
Med fokus på lektionen om dynamisk indikering, låt oss försöka använda 8-bitars skiftregister i matrisindikatorns kontrollschema. Vi ansluter ett register till indikatorutgångarna som ansvarar för kolumnerna och det andra till radutgångarna. kretsschema
Viktig anmärkning #1. Det är nödvändigt att motstånden i denna krets är på de linjer som kommer från det första skiftregistret. Detta skiftregister ansvarar för kolumnerna. Med denna anslutning kommer varje motstånd att ställa in strömmen för endast en lysdiod vid varje steg i den dynamiska algoritmen. Därför kommer alla lysdioder att lysa jämnt. Viktig anmärkning #2. Diagrammet ovan är endast i informationssyfte. Det skulle vara mer korrekt att inkludera en extra effektmikrokrets i gapet mellan det andra registret och matrisen, till exempel ULN2003-transistorenheten.

3. Program

För att göra det roligare, låt oss försöka markera en smiley på indikatorn. Som redan nämnts kommer vi att använda dynamisk indikation för att visa bilden på matrisen. Vi kommer nämligen att markera vår bild rad för rad. Först tänder vi de nödvändiga kolumnerna i den översta raden, sedan i den andra, i den tredje, och så vidare för alla 8 rader. Det första skiftregistret kommer att ansvara för kolumnerna och det andra för raderna. Därför kommer utdata från en sträng att bestå av två på varandra följande skrivningar till registret: först skickar vi koden för strängen, sedan koden för punkterna i denna sträng. I det här programmet kommer vi även att använda en accelererad version av digitalWrite-funktionen. Detta är nödvändigt för att den dynamiska indikeringsprocessen ska gå mycket snabbt. Annars kommer vi att se ett märkbart flimmer i matrisen. Källa const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; unsigned long tm, next_flick; const unsigned int to_flick = 500; byte rad = 0; const byte data = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<nästa_snärtning)( nästa_snärt = tm + till_snärt; rad++; if(rad == 8) rad = 0; // pass linjekod fyll(~(1)<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flick och funktion fylla redan känt för oss från lektionerna om och om. array data lagrar åtta rader av vår bild. För att spara minne spelade vi in ​​varje kombination av punkter i binär form. Fungera haka påöppnar registerspärren. Detta bör göras först efter att båda skiftregistren har fyllts. Efter att ha laddat programmet på Arduino kommer en smiley att dyka upp på indikatorn.

4. Animation på LED-matrisen

Och nu kommer vi att slutföra programmet på ett sådant sätt att bilden på indikatorn ändras varje halv sekund. För att göra detta, låt oss komma ihåg igen. const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; unsigned long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; byte rad = 0; byte ram = 0; const byte data = ( ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ), ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10000001, 0b10111101, 0b01000010, 0b00111100 )); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<nästa_flick)( nästa_snärtning = tm + till_snärt; rad++; om(rad == 8) rad = 0; fyll(~(1)<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Vi laddar Arduino-programmet och observerar resultatet.

5. LED-matrisskalning

En 8×8 LED-matris är lämplig för att visa två siffror eller ett enkelt tecken. Om du vill visa någon mer eller mindre användbar bild på indikatorn måste du kombinera matriserna. Detta görs genom att lägga till nya skiftregister både vertikalt och horisontellt. Det bör noteras att hastigheten på Arduino Uno-kontrollern i kombination med skiftregister bara räcker för en 16 × 16-skärm. Att öka storleken på LED-skärmen ytterligare kommer att resultera i märkbart flimmer.

Uppgifter

  • Hypnos. Programmera regulatorn på ett sådant sätt att koncentriska cirklar med en ständigt ökande radie visas på LED-matrisen med en period av 1 sekund.
  • Ormspel. Implementera ett så välkänt spel som en orm på en 8×8 LED-matris. Det är nödvändigt att lägga till fyra knappar till kretsen för att styra rörelseriktningen, samt en summer för att signalera händelsen att äta äpplen (eller vad ormen äter där ...).
  • Elektronisk nivå. Lägg till en accelerometer till kretsen. Skriv ett program som visar en punkt på LED-matrisen, vars koordinater beror på lutningen av hela enheten. Till exempel, när enheten är fixerad parallellt med marken (vinkelrätt mot gravitationsvektorn), är punkten i mitten. När den elektroniska nivån lutas åt vänster förskjuts punkten proportionellt åt höger.

Slutsats

Efter att ha satt ihop matrisstyrkretsen kan många ha en fråga: "Tja, har ingen kommit på ett enklare sätt att arbeta med matrisen på 30 år?" Egentligen kom de på det. Det finns specialiserade mikrokretsar för att arbeta med olika typer av displayer, inklusive för att arbeta med en LED-matris. I en av följande lektioner kommer vi att lära oss hur man styr indikatorn med MAX7219-chippet. Denna metod gör det möjligt för oss att enkelt kombinera flera matriser med en stor skärm, utan att behöva komplicera den elektriska kretsen avsevärt.