Stap 3: Vier cijfers 7 Segment Display en manipulatie van de poort
Het toevoegen van een 4-cijferige zeven segment display de waarden worden gewijzigd met encoders wilt weergeven. Ik besloot om de eerste twee cijfers gebruiken om weer te geven van het aantal stappen per octaaf en Let op de laatste twee cijfers de basis MIDI.
Ik heb verworven een viercijferige gemeenschappelijk anode zeven segment display. Volgens het gegevensblad zijn pinnen 6, 9, 10 en 12 de cijfers pinnen. Deze pennen worden gebruikt voor het selecteren van elk van de vier cijfers. De andere 8 pinnen zijn voor de zeven segmenten plus een decimaalteken.
Ik leg huidige beperkende weerstanden op elk van de cijfers pinnen want er slechts 4 zijn. (Ik zou 8 weerstanden nodig als ik leg ze op de pinnen segment.) Het informatieblad geeft een max gestage stroom van 25 mA met een typische 2.2 volt naar voren. Ik gebruik gemaakt van 220 ohm weerstanden. Vervolgens met behulp van de wet van Ohm de weerstanden Beperk de huidige tot (5-2.2) volt / 220 Ohm = 12,7 mA, die binnen het toegestane bereik.
Ik aangesloten de zeven segment pinnen op de 12 digitale enige Arduino pinnen 2-13. Ik heb verbonden hen gewoon in de volgorde die maakte het gemakkelijk om draad omhoog. Vervolgens met behulp van de pin toewijzing van het veiligheidsinformatieblad die ik heb opgegeven de Arduino pin toewijzen in mijn code met een heleboel #define verklaringen. Ik dacht dat het is makkelijker om aan te passen de code dan om een verwarde puinhoop van draden lopen tussen het beeldscherm en de Arduino.
// arduino pin numbers for the seven segments and decimal point #define PIN_A 12 #define PIN_B 8 #define PIN_C 4 #define PIN_D 6 #define PIN_E 7 #define PIN_F 11 #define PIN_G 3 #define PIN_DP 5
// arduino pin numbers for the 4 digits #define PIN_1 13 #define PIN_2 10 #define PIN_3 9 #define PIN_4 2
Ik oorspronkelijk begonnen met behulp van de bibliotheek van de SevSeg van arduino.cc. Het werkte goed voor het weergeven van getallen, maar ik vond dat het een significante hoeveelheid ingevoerd van latentie met alle digitalWrite() aanroepen--7 segmenten plus decimaalteken keer 4 = 32 totaal. Dus heb ik besloten om mijn eigen code schrijven om te schrijven naar de pinnen efficiënter.
Voor die ik nodig had om te leren over manipulatie van de poort. De twee data-registers PORTD en PORTB toewijzen aan Arduino pinnen 0-7 en 8-15, respectievelijk. Als de pin-modus is ingesteld als uitgang, resulteert dan het schrijven van een 0 of 1 deze registers in het instellen van de pin, laag of hoog. Dus schreef ik de volgende code als u wilt snel instellen pinnen hoog of laag schrijven rechtstreeks naar de corresponderende poort zonder enige foutcontrole.
pinHigh(int pin) { if (pin >= 2 && pin <= 7) { PORTD |= 1 << pin; } else if (pin >= 8 && pin <= 13) { PORTB |= 1 << (pin - 8); } }
pinLow(int pin) { if (pin >= 2 && pin <= 7) { PORTD &= ~(1 << pin); } else if (pin >= 8 && pin <= 13) { PORTB &= ~(1 << (pin - 8)); } }