Super Duper mikrotonala MIDI Converter (3 / 5 steg)
Steg 3: Fyra siffran sju Segment Display och Port Manipulation
Lägga till en 4-siffrig sju segment display för att visa värdena ändras med pulsgivare. Jag beslutade att använda de två första siffrorna för att visa antalet steg per oktav och de två sista siffrorna av bas MIDI notera.
Jag fick ett fyrsiffrigt gemensam anod sju segment display. Enligt databladet är stift 6, 9, 10 och 12 siffran stiften. Dessa stift används för att välja var och en av de fyra siffrorna. De andra 8 stift är för de sju segment plus ett decimaltecken.
Jag satte strömbegränsande motstånd på varje siffra stiften eftersom det finns bara 4. (Jag skulle behöva 8 motstånd om jag sätter dem på segmentet stiften.) Databladet anger en max stadig ström av 25 mA med en typisk 2,2 volt fram. Jag använde 220 ohm motstånd. Sedan använda Ohms lag motstånd kommer att begränsa strömmen till (5-2.2) volt / 220 ohm = 12,7 mA, som är inom det godkända intervallet.
Jag kopplade sju segment stiften till 12 digitala enda Arduino stift 2-13. Jag kopplade dem helt enkelt i en ordning som gjorde det lätt att binda upp. Sedan använda pin mappningen från databladet I enlighet med Arduino pin-mappning i min kod med en massa #define uttalanden. Jag tänkte att det är lättare att anpassa koden än att ha en tangled röra av sladdar mellan display och Arduino.
Arduino pin-koder för de sju segment och decimalkommat
#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-koder för de 4 siffrorna
#define PIN_1 13
#define PIN_2 10
#define PIN_3 9
#define PIN_4 2
Jag började ursprungligen med hjälp av SevSeg biblioteket från arduino.cc. Det fungerade bra för visning av siffror, men jag fann att det infördes en betydande mängd av latens med alla digitalWrite() samtal--7 segment plus decimaltecknet gånger 4 = 32 totalt. Så jag bestämde mig att skriva min egen kod för att skriva till stiften mer effektivt.
För att jag behövde lära sig om port manipulation. Två data registren PORTD och PORTB karta till Arduino stift 0-7 och 8-15, respektive. När stift läget anges som utgång, resulterar sedan skriva en 0 eller 1 till dessa register i ställa in PIN-koden låg eller hög. Så skrev jag följande kod för att snabbt ställa in stiften högt eller lågt genom att skriva direkt till respektive PORT utan någon felkontroll.
pinHigh (int pin) {
om (pin > = 2 & & pin < = 7) {
PORTD | = 1 << stift;
}
annars om (pin > = 8 & & pin < = 13) {
PORTB | = 1 << (pin - 8);
}
}
pinLow (int pin) {
om (pin > = 2 & & pin < = 7) {
PORTD & = ~ (1 << pin);
}
annars om (pin > = 8 & & pin < = 13) {
PORTB & = ~ (1 << (pin - 8));
}
}