Hallo liebe Community,

erstmal ein Überblick über mein Projekt:

Ich will eine Orgel midifizieren. In dieser Orgel sind unter jeder Tasten ein offener Kontakt.

Jetzt will ich, dass wenn eine Taste gedrückt wird ein Midisignal gesendet wird.
Ich habe schonmal eine funktionsfähige Schaltung aufgebaut, wo ich das anhand von drei Tastern getestet habe.
Da habe ich die Taster an drei ganz normale Eingänge am Atmega8 angeschlossen.
Hat super funktioniert.
Mein Code:
Code:
#include <avr/io.h> 
#define F_CPU 1000000              // 1 MHz
#define BAUD 31250                // MIDI-Baudrate (31,25kBit)
#include <util/setbaud.h>

#define Taster PD2
uint8_t Keydown;
 
void uart_init(void){
  UBRRH = UBRRH_VALUE;
  UBRRL = UBRRL_VALUE;
  #if USE_2X                  // U2X-Modus erforderlich
    UCSRA |= (1 << U2X);
  #else                    // U2X-Modus nicht erforderlich
    UCSRA &= ~(1 << U2X);
  #endif
  UCSRB |= (1<<TXEN);              // UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1  
}

void uart_putc(unsigned char c){
    while (!(UCSRA & (1<<UDRE))){}        // warten bis Senden moeglich
    UDR = c;                  // sende Zeichen
}

void Sendmidinoteon(void){
  uart_putc(145);                // NOTE-ON-Command
  uart_putc(65);                // Tasten-Nummer 69 (A4)
  uart_putc(100);                // Key-Down-Velocity 100
}
void Sendmidinoteoff(void){
  uart_putc(129);                // NOTE-OFF-Command
  uart_putc(65);                // Tasten-Nummer 69 (A4)
  uart_putc(0);                // Release-Velocity 0 (Default)
}

int main(void){
  uart_init();                // UART initialisieren
  DDRD |= (1<<PD1);              // PD1 Output
  PORTD |= (1<<Taster);            // am Tastereingang Pullup an 
  while(1){                  // Endlosschleife
    if(!(PIND & (1<<Taster))){        // wenn Taste gedrueckt
      if( Keydown ){
        Sendmidinoteon();
        Keydown = 0;
      }
    }
    else{                  // wenn Taste nicht gedrueckt
      if( !Keydown ){
        Sendmidinoteoff();
        Keydown = 1;
      }
    }
  }                      // Ende Endlosschleife
}
Nachdem ich das aber für ca. 224 Taster machen muss, reichen meine I/O Pins natürlich nicht mehr aus.
Tastenmatrix geht auch nicht, da die ja alle auf die gleiche "Masse-Stange" tasten.

Also habe ich mich für Schieberegister entschieden.
Ich hätte noch sehr viele MC14021 daheim.
Würde das gerne damit lösen.

Jetzt zu meiner Frage, wie schließ ich das denn eigentlich an??
Empfehlt ihr mir eine SPI Ansteuerung oder eine Software mäsige.
Am Atmega8 wären die SPI Pins frei.

Ich Suche jetzt schon seit längerem nach einem Code im Internet.
Habe des Tutorial von mikrocontroller.net über Schieberegister durchgearbeitet, doch die verwenden ein anderes Schieberegister. Mächte aber meins hernehmen.
Habe mir jetzt mal die Pins angeschaut:

Klicke auf die Grafik für eine größere Ansicht

Name:	MC14021.jpg
Hits:	3
Größe:	5,8 KB
ID:	27673

Wie muss ich es anschließe??
P1-------|
P2-------|
P3-------|
P4-------|- Die 8 Eingänge, wo die Taster hinkommen
P5-------|
P6-------|
P7-------|
P8-------|


C--------?
P/S------?
Ds-------?
Q6-------?
Q7-------?
Q8-------?

VDD------+5V
VSS------Ground

Müsste natürlich dann auch mehrer Schiebereegister in Reihe schalten.

Wäre super nett, wenn mir jemand Links schicken könnte, oder mir einfach Tipps geben könnte, Codeschnipsel oder irgendwas.
Vielen lieben Dank für eure Unterstützung!!!