Sockerbit MIDI Controller (24 / 38 steg)
Steg 24: Testa knappar
KNAPPEN TEST / 74HC595 och 74HC165
Amanda Ghassaei 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 2 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
denna firmware kommer att orsaka knapparna till ljus upp tillfälligt medan de trycks.
PIN-anslutningar
int ledLatchPin = 6;
int ledClockPin = 5;
int ledDataPin = 7.
int buttonLatchPin = 4;
int buttonClockPin = 3;
int buttonDataPin = 2;
looping variabler
byte i.
byte j;
byte k;
lagring för ledde staterna, 4 byte
byte ledData [] = {0, 0, 0, 0};
lagring för knappar, 4 byte
byte buttonCurrent [] = {0,0,0,0}.
byte buttonLast [] = {0,0,0,0}.
byte buttonEvent [] = {0,0,0,0}.
byte buttonState [] = {0,0,0,0}.
knappen Dämpningstid counter - 16 byte
byte buttonDebounceCounter [4] [4].
void setup() {
DDRD = 0xFA; //set stift D7-D4 som D2 som indata-utdata
}
buttonCheck - kontrollerar status för en viss knapp.
denna buttoncheck funktion är i stort sett kopierade från monome 40h firmware brian crabtree och joe sjö
void buttonCheck (byte rad, byte index)
{
om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) & & / / om det aktuella fysiska knapp läget skiljer sig från den
((buttonCurrent [rad] ^ buttonState[row]) & (1 << index))) {/ / last fysisk knapp staten och nuvarande debounced staten
om (buttonCurrent [rad] & (1 << index)) {/ / om nuläget fysisk knapp trycks
buttonEvent [rad] = 1 << index; köa upp en ny knapp händelse omedelbart
buttonState [rad] | = (1 << index); och ställa in debounced ner.
}
annat {
buttonDebounceCounter [rad] [index] = 12.
} / / annars knappen tidigare var deprimerad och nu
har släppts så vi våra debounce counter.
}
annars om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) == 0 & & / / om det aktuella fysiska knapp läget är samma som
(buttonCurrent [rad] ^ buttonState[row]) & (1 << index)) {/ / den senaste fysiskt knappen stat men den nuvarande fysiskt
knappläge skiljer sig från den nuvarande debounce
statliga...
om (buttonDebounceCounter [rad] [index] > 0 & &--buttonDebounceCounter [rad] [index] == 0) {/ / om den räknaren debounce har
varit minskas till 0 (menande den
knappen har varit upp i
kButtonUpDefaultDebounceCount
iterationer / / /
buttonEvent [rad] = 1 << index; köa en knapp staten change-händelse
om (buttonCurrent [rad] & (1 << index)) {/ / och växla knapparna debounce staten.
buttonState [rad] | = (1 << index);
}
annat {
buttonState [rad] & = ~ (1 << index);
}
}
}
}
{Ogiltig shift()
för (jag = 0; jag < 4; i ++) {
buttonLast [i] = buttonCurrent [i];
byte dataToSend = (1 << (jag + 4)) | (15 & ~ ledData[i]);
ställa in spärren pin låg så lysdioderna inte ändra samtidigt skickas i bitar
digitalWrite (ledLatchPin, låg);
flytta ut bitarna av dataToSend
shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);
ställa in spärren pin hög så lysdioderna kommer att få nya uppgifter
digitalWrite (ledLatchPin, hög);
När en rad har ställts in hög, ta emot data från knappar
ställa in spärren pin hög
digitalWrite (buttonLatchPin, hög);
skifta i data
buttonCurrent [i] = shiftIn (buttonDataPin, buttonClockPin, LSBFIRST) >> 3.
latchpin låg
digitalWrite (buttonLatchPin, låg);
för (k = 0; k < 4; k ++) {
buttonCheck(i,k);
}
}
}
void updateLEDs() {//update lysdioder att spegla tillståndet i knapparna
för (j = 0; j < 4; j ++) {
ledData [j] = buttonState [j];
}
}
void loop() {
Shift();
updateLEDs();
}