Code für Siebensegmentanzeige geht nicht

Hi,
ich bin grade dabei eine Siebensegmentanzeige zu Programmieren.
Dazu habe ich die Segent a-g an die Pins A0 - A5 und Pin 13 gehängt, da Pin A6 leider an keinem Arduino Nano bei mir gefuntzt hat. Ich habe Siebensegmentanzeigen, wo man an die Pins a-g Masse anlegen muss, also LOW ssetzten muss, damit sie leuchten. Ich habe die Pins die auf Low geschaltet werden müssen, in Arrays gespeichert, die dann mit einer For schleife durchlaufen wird. Die auszugebenen Zahlen, werden per Serial empfangen. Aber leider leuchten immer alle Segmente, lediglich, bei der 9 geht das Segment unten links aus, sodass eine 9 dargestellt wird. Ich kann leider keinen Fehler finden. Ich hoffe ihr könnt mir helfen.

int za[] = {14,15,16,17,18,19,13};
int z0[] = {14,15,16,17,18,19};
int z1[] = {15,16};
int z2[] = {14,15,17,18,13};
int z3[] = {14,15,16,17,13};
int z4[] = {15,16,19,13};
int z5[] = {14,16,17,19,13};
int z6[] = {14,16,17,18,19,13};
int z7[] = {14,15,16};
int z8[] = {14,15,16,17,18,19,13};
int z9[] = {14,15,16,17,19,13};

void setup(){
  Serial.begin(9600);
  for(int i=0;i<7;i++){
    pinMode(za[i], OUTPUT);
    digitalWrite(za[i], LOW);
  }
  delay(1000);
}

void loop(){
  if(Serial.available()){
    int x = (int) Serial.read()-48; //Zahl wird aus ASCI in eine Zahl gewandelt
    disp(x);
    Serial.println(x);
  }
}


void disp(int x){
  for(int i=0;i<7;i++){                      
    digitalWrite(za[i], HIGH);            //Erstmal alle auf HIGH
  }
  switch(x){
  case 0:
    for(int i=0;i<6;i++){
      digitalWrite(z0[i], LOW);
    }
  case 1:
    for(int i=0;i<1;i++){
      digitalWrite(z1[i], LOW);
    }
  case 2:
    for(int i=0;i<5;i++){
      digitalWrite(z2[i], LOW);
    }
  case 3:
    for(int i=0;i<5;i++){
      digitalWrite(z3[i], LOW);
    }
  case 4:
    for(int i=0;i<4;i++){
      digitalWrite(z4[i], LOW);
    }
  case 5:
    for(int i=0;i<5;i++){
      digitalWrite(z5[i], LOW);
    }
  case 6:
    for(int i=0;i<6;i++){
      digitalWrite(z6[i], LOW);
    }
  case 7:
    for(int i=0;i<3;i++){
      digitalWrite(z7[i], LOW);
    }
  case 8:
    for(int i=0;i<7;i++){
      digitalWrite(z8[i], LOW);
    }
  case 9:
    for(int i=0;i<6;i++){
      digitalWrite(z9[i], LOW);
    }
  }
}

Philipp

Hmm, folgendes ist mir vollkommen unbekannt:

int x = (int) Serial.read()-48; //Zahl wird aus ASCI in eine Zahl gewandelt

Ich kenne zur Umwandlug in Integerzahlen nur int(x), also in deinem Fall wäre das

int x = int(Serial.read()-48); //Zahl wird aus ASCI in eine Zahl gewandelt

Allerdings mag es ja auch sein dass deine Integerumwandlung funktioniert, ich kenn es halt nur nicht, also keine Gewähr auf diese Aussage.

Was mir noch aufgefallen ist, ist, dass bei deinen cases überall der break fehlt. Normalerweise ist es (auch nach Reference):
switch (var) {
case 1:
//do something when var equals 1
break;
case 2:
//do something when var equals 2
break;
default:
// if nothing else matches, do the default
// default is optional
}

Also müsstest du schreiben:

case 0:
    for(int i=0;i<6;i++){
      digitalWrite(z0[i], LOW);
        }
        break;
  case 1:
    for(int i=0;i<1;i++){
      digitalWrite(z1[i], LOW);
        }
        break;
  case 2:
    for(int i=0;i<5;i++){
      digitalWrite(z2[i], LOW);
        }
        break;

usw. usf.

Ich würde auf die Fehler in der Break-Konstruktion tippen, das würde auch erklären, warum er immer nur die 9 richtig anzeigt, denn da kommt er vor dem delay als letztes vorbei und überspringt alle anderen Zahlen einfach in einem Wahnsinnstempo.

Hi,
ja jetzt gehts. Danke.
Meine Wariante des Umweandelns funtzt auch.

Philipp