Problem mit "New Multi-Function Shield" am Uno

Das Falschherum eingelötete Display ist kein Weltuntergang. Um es Ansteuern zu können mußt Du es gar nicht mal auslöten. Wir sind schließlich alle hier Hacker die die uns zur Verfügung stehende Hardware einfach anders benutzen.

Hab mir mal den Beispielsketch mfs_display1.ino, der im Artikel von Make verlinkt ist, angeschaut und auch mal die Platine genauer betrachtet. Dazunoch das Datenblatt des KYX-3461AS7BS , das Du uns verlinkt hattest. Und noch das Bildchen im Make Artikel.
Beispielsketch:

/*
 * Make-Magazin, https://www.heise.de/make/
 * 
 * Demo fuer Multi Function Shield
 * 
 * 7-Segment-Display
 */

const uint8_t LATCH = 4;
const uint8_t CLK = 7;
const uint8_t DATA = 8;
 
const uint8_t SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};    // Segmente, die leuchten sollen pro Zahlwert (Low-Aktiv), & 0x7F Verknüpfen fuer Dezimalpunkt
const uint8_t SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};                               // Ziffernposition (gemeinsame Anode, LSB)

/*
 * @brief   Schiebt 8 Bits, MSB first raus. Als einfachere Ersatz fuer ShiftOut() von Arduino
 * @param   Datenpin
 *          Taktpin
 *          Wert
 * @return  none
 */
void MyShiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t val)
{
  uint8_t i;

  for (i = 0; i < 8; i++)  
  {
    digitalWrite(dataPin, !!(val & (1 << (7 - i))));

    digitalWrite(clockPin, HIGH);
    digitalWrite(clockPin, LOW);        
  }
}

/*
 * @brief   Ausgabe einer Zahl an einer Position auf dem Display
 * @param   welche Position (0= links, 3=rechts)
 *          Zahlwert (0..9)
 * @return  none
 */
void WriteNumberToSegment(uint8_t digit, uint8_t value)
{
  digitalWrite(LATCH,LOW);                        // Uebernahme-Takt: Ausgang Aus
  MyShiftOut(DATA, CLK, SEGMENT_MAP[value]);      // Segmente passend zum Zahlwert rausschieben. MSB zuerst
  MyShiftOut(DATA, CLK, SEGMENT_SELECT[digit]);   // Welche Stelle leuchten soll hinterher schieben
  digitalWrite(LATCH,HIGH);                       // Uebernahme-Takt: Ausgang Ein
}

/*
 * @brief   Ausgabe einer Zahl auf dem Display
 * @param   Zahl 0..9999
 * @return  none
 */
void DisplayNumber (uint16_t value)
{
  WriteNumberToSegment(0, value / 1000);          // Tausender
  WriteNumberToSegment(1, (value / 100) % 10);    // Hunderter (Modulo)
  WriteNumberToSegment(2, (value / 10) % 10);     // Zehner
  WriteNumberToSegment(3, value % 10);            // Einer
}
 
void setup ()
{
  pinMode(LATCH,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DATA,OUTPUT);
}
 
void loop()
{
  DisplayNumber (3210);
}

Meine Annahmen / Erkenntnisse.

Um das Display und die 2 ICs (Bezeichnung "Schieberegister für 7-Segment-Display") sind keine Transistoren vorhanden. Daraus schließe ich das die 4 7-Segment-Anzeigen gemultiplext und alle Pins (die 4 Anoden (DIG1 bis DIG4) und die 8 Kathoden) direkt mit den Schieberegistern verbunden sind.

Darum kann man mit etwas Hacking die Pins herausfinden an denen die Kathoden und Anoden angeschlossen sind und diese durch die neuen Positionen ersetzen.

Im Beispielsketch steht:

const uint8_t SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};    // Segmente, die leuchten sollen pro Zahlwert (Low-Aktiv), & 0x7F Verknüpfen fuer Dezimalpunkt
const uint8_t SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};                               // Ziffernposition (gemeinsame Anode, LSB).

Hieraus kann man den Anschlußplan der Segmente zu den Ausgängen des Schiberegisters bzw Bits des übertragenen Werts herleiten.

Außerdem gibt diese Funktion Auskunft:

/*
 * @brief   Ausgabe einer Zahl an einer Position auf dem Display
 * @param   welche Position (0= links, 3=rechts)
 *          Zahlwert (0..9)
 * @return  none
 */
void WriteNumberToSegment(uint8_t digit, uint8_t value)
{
  digitalWrite(LATCH,LOW);                        // Uebernahme-Takt: Ausgang Aus
  MyShiftOut(DATA, CLK, SEGMENT_MAP[value]);      // Segmente passend zum Zahlwert rausschieben. MSB zuerst
  MyShiftOut(DATA, CLK, SEGMENT_SELECT[digit]);   // Welche Stelle leuchten soll hinterher schieben
  digitalWrite(LATCH,HIGH);                       // Uebernahme-Takt: Ausgang Ein
}

Daß das erste Schieberegister die Segmente zuständig ist und das zweite für die aktive Stelle

Der Dezimalpunkt ist eingeschaltet wenn Bit7 LOW ist (erkenne ich aus "& 0x7F Verknüpfen fuer Dezimalpunkt")
Die Null hat nur Segment - ausgeschaltet. Also ist Segment G bei Mappingwert 0XC0 oder B11000000 also Bit6
Die 6 hat nur Segment B ausgeschaltet Also 0x82 oder B10000010 also Bit1
Die 9 hat Segmente E ausgeschaltet. Also 0x90 oder B10010000 also bit4
Die 5 hat die Segmente B und E ausgeschaltet. Also 0x92 oder B10010010 B = Bit1 und E hatten wir schon.

Daraus sind einige Segmente ersichtlich und daß A = Bit0, B= bit1 ecc ergibt sich die Tabelle:

A = Bit0
B = Bit1
E = Bit4
G = Bit6
Dp = Bit7

Wobei ein LOW das jeweilige Segment Aufleuchten macht.

Da sich ein lineares Verhältnis von A B C D E F G zu 0 1 2 3 4 5 6 7 herauszustellen scheint, mache ich nicht weiter sondern nehme das mal für die restlichen Segmente an.

Des weiteren ist für die DIGITS:
1000-stelle ist Bit0 HIGH
100-stelle ist Bit1 HIGH
10-stelle ist Bit2 HIGH
1-stelle ist Bit3 HIGH

Die Bits4-Bit7 sind nicht beschaltet ( nehme ich mal so an).

Mal was zu lesen.