Selbst gebaute Siebensegmentanzeige Code Optimierung.

ich habe folgendes problem.
ich möchte auf selbstgebauten sieben segment display mit schiebenregister 74hc595 einen zähler programieren.

nun das ist was ich habe

//Led Siebensegmentdisplay von mir hahahha muhhhahahah

int latchPin = 6;  //74HC595
int clockPin = 5;  //74HC595
int dataPin = 7;   //74HC595
int var;
int count = 100;


int eins = B01010000;
int zwei = B01101101;
int drei = B01111001;
int vier = B01110010;
int fuenf = B00111011;
int sechs = B00111111;
int sieben = B01010001;
int acht = B01111111;
int neun = B01111011;
int nulle = B01011111;
int punkt = B10000000;
int aus = B00000000;


void setup()
{

  //Serial.begin(9600); //Serial Monitor

  pinMode(latchPin, OUTPUT);  //74HC595
  pinMode(clockPin, OUTPUT);  //74HC595
  pinMode(dataPin, OUTPUT);   //74HC595

}

void n0()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n1()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n2()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n3()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, drei);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n4()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, vier);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n5()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, fuenf);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n6()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sechs);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n7()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sieben);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n8()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, acht);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n9()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, neun);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n10()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n11()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n12()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n13()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, drei);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n14()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, vier);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n15()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, fuenf);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n16()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sechs);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n17()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sieben);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n18()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, acht);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n19()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, neun);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n20()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n21()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, eins);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n22()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n23()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, drei);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n24()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, vier);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n25()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, fuenf);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n26()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sechs);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n27()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sieben);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

void n28()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, acht);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n29()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, neun);
    shiftOut(dataPin, clockPin, MSBFIRST, zwei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void n30()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, drei);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}
void loop()
{
  n0();
  n1();
  n2();
  n3();
  n4();
  n5();
  n6();
  n7();
  n8();
  n9();
  n10();
  n11();
  n12();
  n13();
  n14();
  n15();
  n16();
  n17();
  n18();
  n19();
  n20();
  n21();
  n22();
  n23();
  n24();
  n25();
  n26();
  n27();
  n28();
  n29();
  n30();

}

nun meine frage :
geht das auch kürzer bzw eleganter ?
ich bin für jede hilfe dankbar .
ach noch am rande ich bin blutiger anfäger in sachen arduino.

hallo schleby,

du kannst die schleifen aufjeden fall vereinfachen

void n0()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

durch

void n0()
{
  for (int var = 0; var < count; var++){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
  }
}

ersetzen

gruß ratlos

Okay Danke .

mir gehts es hauptsächlich darum bei einem zähler von 0 bis 99 nicht jede einzelnde zahlt so in der art
programmieren zu müssen .da wir es doch sicher eine bessere lösung geben oder nicht ?
so das 0 bis 9 vorhanden ist und der rest entsprechent zusammen gesetzt wird nur da hapert es dann bei mir .

grüße

hallo schleby,

leider habe ich noch nie mit arduino Programmieren können.
Meine Platine ist noch nicht da, aber die Logik dahinter verstehe ich schon gut.

Probier mal bitte diesen Code aus.
Musste ein bisschen um denken da bei dir die hintere Ziffer zuerst kommt.

Sollte aber funktionieren.

Gruß Ratlos

//Led Siebensegmentdisplay

int latchPin = 6;  //74HC595
int clockPin = 5;  //74HC595
int dataPin = 7;   //74HC595
int var;
int count = 100;

int zahl[] = {B00000000,B01010000,B01101101,B01111001,B01110010,B00111011,B00111111,B01010001,B01111111,B01111011,B10000000}; //Array von 0-9 und nen Punkt am ende.

void setup()
{

  //Serial.begin(9600); //Serial Monitor
  pinMode(latchPin, OUTPUT);  //74HC595
  pinMode(clockPin, OUTPUT);  //74HC595
  pinMode(dataPin, OUTPUT);   //74HC595

}

void zaehlen()
{
	int erstesZeichen = 0;		//hier wird das vordere Zeichen gezählt
	int zweitesZeichen = 0;		//hier wird das hintere Zeichen gezählt
	while(true){						//endlosschleife	
		digitalWrite(latchPin, LOW);	//Schalte pin aus
		if(zweitesZeichen < 9){			//wenn das hintere Zeichen kleiner als 9 ist wird nur die Zahl ausgegeben
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[zweitesZeichen]);
		}else{							//wenn das hintere Zeichen den Wert 9 hat wird die Zahl 9 ausgegeben und das hintere Zeichen wieder auf 0 gesetzt und das vordere Zeichen um 1 erhöht
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[zweitesZeichen]);
			zweitesZeichen = 0;
			erstesZeichen++;
		}
		if(erstesZeichen < 9){			//wenn das vordere Zeichen kleiner als 9 ist wird nur die Zahl ausgegeben
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[erstesZeichen]);
		}else{							//wenn das vordere Zeichen den Wert 9 hat wird die Zahl 9 ausgegeben und das vordere Zeichen wieder auf 0 gesetzt
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[erstesZeichen]);
			erstesZeichen = 0;
		}
		digitalWrite(latchPin, HIGH); 	//Schalte pin ein
		delay(1000);					//Warte eine Sekunde
	}
}


void loop()
{
  zaehlen();
}

Danke für die antwort werde ich sofort probieren
gruß

Schon nicht schlecht aber es gibt da ein paar probleme

die 9 und die null können nich dargestellt werden da bleibt alles dunkel

gruß

ah sorry mein fehler XD
hab die zahlen falsch kopiert

//Led Siebensegmentdisplay

int latchPin = 6;  //74HC595
int clockPin = 5;  //74HC595
int dataPin = 7;   //74HC595

int zahl[] = {B01011111,B01010000,B01101101,B01111001,B01110010,B00111011,B00111111,B01010001,B01111111,B01111011,B00000000,B10000000}; //Array von 0-9 und nen Punkt am ende.

void setup()
{

  //Serial.begin(9600); //Serial Monitor
  pinMode(latchPin, OUTPUT);  //74HC595
  pinMode(clockPin, OUTPUT);  //74HC595
  pinMode(dataPin, OUTPUT);   //74HC595

}

void zaehlen()
{
	int erstesZeichen = 0;		//hier wird das vordere Zeichen gezählt
	int zweitesZeichen = 0;		//hier wird das hintere Zeichen gezählt
	while(true){						//endlosschleife	
		digitalWrite(latchPin, LOW);	//Schalte pin ein
		if(zweitesZeichen < 9){			//wenn das hintere Zeichen kleiner als 9 ist wird nur die Zahl ausgegeben
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[zweitesZeichen]);
		}else{							//wenn das hintere Zeichen den Wert 9 hat wird die Zahl 9 ausgegeben und das hintere Zeichen wieder auf 0 gesetzt und das vordere Zeichen um 1 erhöht
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[zweitesZeichen]);
			zweitesZeichen = 0;
			erstesZeichen++;
		}
		if(erstesZeichen < 9){			//wenn das vordere Zeichen kleiner als 9 ist wird nur die Zahl ausgegeben
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[erstesZeichen]);
		}else{							//wenn das vordere Zeichen den Wert 9 hat wird die Zahl 9 ausgegeben und das vordere Zeichen wieder auf 0 gesetzt
			shiftOut(dataPin, clockPin, MSBFIRST, zahl[erstesZeichen]);
			erstesZeichen = 0;
		}
		digitalWrite(latchPin, HIGH); 	//Schalte pin ein
		delay(1000);					//Warte eine Sekunde
	}
}


void loop()
{
  zaehlen();
}

EDIT 20:35

so jetzt sollte es stimmen

Die Funktion für die Ausgabe der Zahl auf die Anzeige mußt Du nicht für jede Zahl schreiben sondern Du kannst die Darzustellende Zahl der Funktion als Übergabewert mitgeben. Ich verstehe nicht wieso Du den Wert 100 mal hintereinander an die Anzeige sendest. Die Schieberegister behalten die Daten bis neue gesendet werden.

void n7()
{
  var = 0;
  while(var < count){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, sieben);
    shiftOut(dataPin, clockPin, MSBFIRST, nulle);
    digitalWrite(latchPin, HIGH);  
    delay(1);
    var++;
  }
}

wird

void anzeige(int wert)
{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, wert%10); /Einser-Stelle
    shiftOut(dataPin, clockPin, MSBFIRST, wert/10);  /Zehner-Stelle
    digitalWrite(latchPin, HIGH);  
}

Grüße Uwe

Hallo Uwe

Das war genau das was ich suchte nun funktioniert es ich danke dir sehr
der code sieht nun folgendermaßen aus

//Led Siebensegmentdisplay

int latchPin = 6;  //74HC595
int clockPin = 5;  //74HC595
int dataPin = 7;   //74HC595
int var;
int count = 100;

int zahl[] = {B01011111,B01010000,B01101101,B01111001,B01110010,B00111011,B00111111,B01010001,B01111111,B01111011,B10000000}; //Array von 0-9 und nen Punkt am ende.

int wert;
  



void setup()
{

  Serial.begin(9600); //Serial Monitor
  pinMode(latchPin, OUTPUT);  //74HC595
  pinMode(clockPin, OUTPUT);  //74HC595
  pinMode(dataPin, OUTPUT);   //74HC595

}





void anzeige()
{
  for(int time=99;time>=0;){
    wert=time;
    Serial.println(wert);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert%10]); //Einser-Stelle
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert/10]);  //Zehner-Stelle
    digitalWrite(latchPin, HIGH); 
    delay(1000);
    time--;
}
}

void loop(){

anzeige();

}

Danke an alle die ander lösungsfindung beteiligt waren.
grüße

Nun hab ich doch noch eine Frage dazu

was genau bedeutet das Prozent zeichen hier,welchen effekt hat das?

zahl[wert%10]

Das ist der sogenannte "Modulo" Operator. Damit berechnest Du den Rest einer ganzzahligen Division.
Ein "wert % 10" liefert Dir damit immer die "Einer-Stelle" von "wert"

Beispiel

12 % 10 = 2 ( denn 12 / 10 ist 1 Rest 2)
27 % 10 = 7 ( denn 27 / 10 ist 2 Rest 7)

Nun noch eine frage
Wie müsste das ganze ausehen wenn es für vier stellen funktionieren soll
weil einfach noch eine zeile mit shiftout und dann /100 bzw /1000 funktioniert nich ?

schleby:
weil einfach noch eine zeile mit shiftout und dann /100 bzw /1000 funktioniert nich ?

Jeweils eine Zeile mit %1000 und %100 sollte funktionieren.

hab ich probiert funktioniert nich in der mitte die beide stellen werden dann nicht mehr angezeigt
gruß

SO ich habs,das müsste dann so aussehen

void anzeige()
{
  for(int time=9999;time>=0;){
    wert=time;
    Serial.println(wert%10000/1000);
    Serial.println(wert);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert%10]); //Einser-Stelle
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert%100/10]);  //Zehner-Stelle
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert%1000/100]);  //Hunderter-Stelle
    shiftOut(dataPin, clockPin, MSBFIRST, zahl[wert%10000/1000]);  //Tausender-Stelle
    digitalWrite(latchPin, HIGH); 
    delay(50);
    time--;
}
}

das funktioniert einwandfrei

besten dank an alle

Du kannst jeweils durch 10 teilen und dann modulo ausführen.

eins = Wert%10;
Wert/=10;
zehn = Wert%10;
Wert/=10;
hundert = Wert%10;
Wert/=10;
Tausend = Wert;

Grüße Uwe