Stap 2:
3.3 ToetsIndrukken (KeyPress)"Scannen" is het proces waarmee ik de knop pad multiplex, zodat ik niet zou moeten gebruiken 16 pinnen op de microcontroller voor 16 knoppen. In plaats daarvan moest ik alleen gebruik van de 8 pinnen. Als u naar de stap 4 verwijst heb ik het schema voor de knop pad ik kocht van sparkfun elektronica en hebben aangegeven het signaal pad van elke pin op de knop pad PCB opgenomen. Zoals u kunt zien zijn er aparte pinnen voor het besturen van de LEDs en beheersing van de knoppen. De LED control pinnen zullen in een latere sectie worden besproken.
De microcontroller is instellen zodat alle kolommen uitgangen zijn en alle rijen ingangen zijn. Als u naar de knop pad schema verwijst, begin ik met het instellen van de eerste kolom (dat is RB4 op de pic) tot nul. Ik plaatste de rest van de kolommen aan 1(RB5,RB6,RB7). Het programma controleert vervolgens de status van alle rijen op het zelfde time(RC4,RC5,RC7,RC0). Het programma wordt onderbroken voor 1 milliseconde en controleert deze pinnen weer. Aangezien de knoppen en schakelaars vaak stuiteren, hierdoor ongewenste rimpelingen op het signaal, zodat wij dit met een proces genaamd-stuiteren elimineren. Als de waarden van de twee controles gelijk zijn dan betekent dat er een geldige knooppers op die kolom en niet een bounce. Het programma wordt ingevoerd een for-lus, die controleert de status van elk van de rijen. Als een knop is ingedrukt op die kolom, wordt het gelezen als een nul op de corresponderende rij sinds de kolom is ingesteld op nul. Aangezien elk van de pinnen op de rijen een 10 k pull-up weerstand (niet afgebeeld op de knop pad schema), heeft als een knop is niet ingedrukt worden dat rij-pin gelezen als een 1.
Zodra een knooppers op die kolom wordt gevonden verzendt een midi-bericht van 3 byte over de hardware seriële poort op de PIC. De eerste byte is 0x92 die de computer als een notitie van channel 4 op bericht detecteert. De tweede byte is welke opmerking moet worden ingeschakeld, die kunnen overal tussen de 0 en 127. Sinds ik ben met behulp van een for-lus om te controleren van elk van de rijen die ik ben met behulp van de voor lus variabele "i" om aan te geven die opmerking wil ik op. Aangezien ik ben ook met behulp van 8 banken van notities (128 totale notities) ik het toevoegen aan de huidige bank variabele die is "c". De bank switch proces zal verder worden besproken in paragraaf 3.4. De laatste byte is de snelheid die ook overal tussen de 0 en 127 kunnen, maar voor alle knoppen ik deze waarde ingesteld op 100. De volgende coderegel stuurt dezelfde commando's in ASCII-tekst naar een LCD-scherm over een microcontroller pin die ik geconfigureerd voor software seriële uit.
De microcontroller moet ook detecteren wanneer er een opmerking is vrijgegeven want op nood voor het verzenden van een andere opdracht uit te schakelen die dezelfde noot. Binnen hetzelfde for-lus die dit wordt gedaan door de dezelfde 3 bytes met uitzondering van de laatste byte(velocity) te sturen, is ingesteld op nul die deze nota wordt uitgeschakeld. Als deze opdracht niet verzonden, zou die nota blijven voor onbepaalde tijd, zelfs als die knop werd uitgebracht.
Tot dit punt hebben we alleen de status gecontroleerd en verzonden opdrachten voor de 4 knoppen in de eerste kolom. Dit hele proces is herhaalde 3 keer, één voor elke kolom. De volgende lus ik stel in de volgende kolom nul en de rest op 1 ingesteld en doe hetzelfde voor de resterende kolommen.
3.4 bank wijzigen
Aangezien er 128 verschillende midi merkt op dat kunnen worden verzonden als een midi-opdracht mij wilden voor zitten kundig voor optimaal gebruik van alle van hen, dus ik voegde de mogelijkheid aan bank tussen groepen van 16 notities tegelijk. Om dit te doen ik heb twee drukknoppen aan de voorzijde onder de LCD hebt toegevoegd (zie figuur 1.0). Om de bank omhoog, ondervraagden ik de inbreng van de pin op de microcontroller die mij troep opwaarts als invoer voor banking omhoog. Aangezien ik het opzetten van deze ingangen van de microcontroller met een pull-down weerstand ik gecontroleerd voor een lage tot hoge overgang, wanneer de schakelaar die verbinding met VDD maakt. Als die overgang werd ontdekt, voegde ik een aan de variabele "j". Ik instellen zo zodra "j" meer dan 8 was het weer terug op nul gezet. Ik wilde ook de mogelijkheid om op te slaan van de bank op de niet-vluchtig eeprom zo als voor wat voor reden ik moet verwijderen van de macht om te herschikken kabels de midi-controller zelfstart opwaarts en stelt zich automatisch terug naar de bank die het was op voordat het werd uitgeschakeld. Ik vond ook dat als ik was het bezit van een opmerking en een van de bank knoppen tegelijkertijd ingedrukt, de midi-controller spoor van die opmerking was wordt ingedrukt verloren, zodat die nota zou nooit uitschakelen. Voor positiebepaling zulks ik maakte een for-lus die uitgeschakeld alle notities op hetzelfde moment wordt wanneer ik bank omhoog of omlaag. Ik gebruikte dezelfde code voor de bank knop ingedrukt, behalve in plaats van het toevoegen van een "j" ik ene 'j afgetrokken' en op beginstand tot en met 8 zetten heeft als het ging onder 1. Ik zo "j" als een algemene variabele instellen en wordt gebruikt in verschillende delen van het programma.
Aan het einde van deze functie, ik controleren welke waarde j is en stelt u de variabele "c" dienovereenkomstig. "c" kan de midi-controller Bank omhoog 16 notities tegelijk toevoegen aan welk toetsenbord nummer u zijn te drukken. Bijvoorbeeld als ik wil midi opmerking nummer 35 op, ik moet gaan naar bank 3. "c" wordt toegevoegd naar welke sneltoets ben ik te drukken. Dus als ik knop nummer 3 te op het toetsenbord drukken ben, de midi-controller voegt de waarde "c", bedraagt die is in dit geval 32.
3.5 RGB
Ik gereserveerd 3 pinnen op de microcontroller controle van alle de RGB LED's. RA0 regelt alle de rode LEDs', RA1 regelt alle groene LEDs en RA2 controleert alle de blauwe. Elke pin bepaalt de LEDs door te verbinden naar de gate op een MOSFET gelegen op het LED driver bord (zie stap 4). De LEDs moest op deze manier worden gereden, omdat de huidige moet rijden alle de LEDs overschreden de microctrollers huidige sourcing vaardigheden.
Deze RGB functie in het programma in principe controleert welke bank van notities de midi-controller in door de waarde van de variabele "j" te controleren. Om de verschillende kleuren samen ik simpelweg verschillende sets met kleuren. Bijvoorbeeld om de kleur paars, dan kom ik op rood en blauw op hetzelfde moment door RA0 en RA2 op hoog instellen en RA1 te stellen op laag.