come convertire il seguente codice in uno utilizzando la manipolazione diretta della porta

Aug 19 2020

Di seguito è riportato il programma per la scansione di una tastiera per il trasferimento MIDI. Al momento il codice funziona bene, ma potrebbe essere più veloce. Ho bisogno di sapere come utilizzare la manipolazione diretta della porta all'interno del ciclo for.

boolean keypressed[6][6]; //for storing key states
int midinote[6][6] ={ 60 ,61 ,62 ,63 ,64 ,65
                 ,66 ,67 ,68 ,69 ,70 ,71
                 ,72 ,73 ,74 ,75 ,76 ,77
                 ,78 ,79 ,80 ,81 ,82 ,83
                 ,84 ,85 ,86 ,87 ,88 ,89
                 ,90 ,91 ,92 ,93 ,94 ,95  }; //code for various midi notes C3 to C6


void setup() {

   Serial.begin(38400);
   for(int i=0; i<6; i++){
      pinMode(i+2,OUTPUT);
      digitalWrite(i+8,HIGH);
   }
   for(int i=0; i<6; i++){
      pinMode(i+8,INPUT);
      digitalWrite(i+8,HIGH);
   }
   for(int i=0; i<6; i++){
      for(int j=0; j<6; j++){
          keypressed[i][j] = false;
          }
      }
   }
void loop() {

   for(int i=0; i<6; i++){
      digitalWrite(i+2, LOW);
      for(int j =0; j<6; j++){
         if ((digitalRead(j+8) == LOW) && !keypressed[i][j]){
            Serial.write(0x91);
            Serial.write(midinote[i][j]);
            Serial.write(127);
            keypressed[i][j] = true;
           }
         if ((digitalRead(j+8) == HIGH) && keypressed[i][j]){
            Serial.write(0x91);
            Serial.write(midinote[i][j]);
            Serial.write(0);
            keypressed[i][j] =false;
         } 
      }
digitalWrite(i+2, HIGH);
   }

 }

Risposte

1 SaeedMirshams Aug 19 2020 at 18:27

È meglio usare gli interrupt invece di mettere in comune i pin. ma questo è correlato al tuo controller arduino. cos'è il tuo core controller arduino? se puoi selezionare preferisco "Nano 33 IoT" che ha 9 pin (2, 3, 9, 10, 11, 13, 15, A5, A7) disponibili per l'interruzione. questa pagina potrebbe essere utilizzabile:https://playground.arduino.cc/Main/PinChangeInterrupt/