void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
for (byte i = 1 ; i <= 6 ; i++) {
zeigeG(i);
delay(500);
}
}
/*
Die Anzeige von Würfel-Augenzahlen mit Leuchtdioden kann unterschiedlich programmiert werden.
Einige Varianten der Programmierung sind hier in den Funktionen "zeigeA" bis "zeigeG" ausgeführt.
Die Aufgabe und der für Menschen sichtbare Effekt sind immer gleich.
Beim lesbaren Programmcode gibt es offensichtlich voneinander abweichende Merkmale.
Einige Funktionsvarianten sind sehr ausführlich geschrieben und benötigen viele Zeilen Code.
Andere sind zwar deutlich kürzer, lassen sich jedoch vielleicht nicht so einfach gedanklich nachvollziehen.
Auch beim kompillierten Maschinencode und dessen Ausführung in Hardware gibt es vergleichbare Unterschiede.
Einerseits ist der Speicherbedarf des Programms abhängig von den unterschiedlich ausgeführten Funktionen.
Andererseits gibt es gravierende Unterschiede in der Zeit, die der Prozessor zu deren Ausführung braucht.
Mehrere teilweise konkurrierende Aspekte können also in die Bewertung von Programmcode einfließen:
- Lesbarkeit für Menschen
- logische Verständlichkeit
- Speicherbedarf für Maschinen
- Ausführungsgeschwindigkeit
Programmspeicher dynamischer Speicher Ausführungsdauer zeige-Schleife
zeigeA 1312 Bytes 9 Bytes 224 Mikrosekunden
zeigeB 1292 Bytes 9 Bytes 224 Mikrosekunden
zeigeC 1098 Bytes 9 Bytes 324 Mikrosekunden
zeigeD 1040 Bytes 9 Bytes 180 Mikrosekunden
zeigeE 1072 Bytes 9 Bytes 180 Mikrosekunden
zeigeF 926 Bytes 23 Bytes 52 Mikrosekunden
zeigeG 822 Bytes 9 Bytes 12 Mikrosekunden
Die Speicherangaben beziehen sich auf eine Kompillierung mit der Arduino IDE für den Arduino Nano.
Für jede Variante der zeige-Funktion wurde dieses Programm mit ihr jeweils einzeln kompilliert.
Die Zeitmessung erfolgte separat mit einem Programm mit folgender Hauptschleife:
void loop() {
unsigned long startMicros = micros();
for (byte i = 1 ; i <= 6 ; i++) {
zeige(i);
}
unsigned long endMicros = micros();
Serial.println(endMicros - startMicros);
delay(5000);
}
*/
void zeigeG(byte wurf) {
byte byteD = PORTD & 0b00001111;
byte byteB = PORTB & 0b11100000;
if (wurf > 1) {
byteB += 0b00000100;
byteD += 0b01000000;
if (wurf > 3) {
byteB += 0b00010000;
byteD += 0b00010000;
if (wurf > 5) {
byteB += 0b00001000;
byteD += 0b00100000;
}
}
}
if (wurf % 2 == 1) {
byteB += 0b00000001;
}
PORTB = byteB;
PORTD = byteD;
}
void zeigeF(byte wurf) {
const byte musterB[] = {0b00000000,0b00000001,0b00000100,0b00000101,0b00010100,0b00010101,0b00011100};
const byte musterD[] = {0b00000000,0b00000000,0b01000000,0b01000000,0b01010000,0b01010000,0b01110000};
PORTB = (PORTB & 0b11100000) | musterB[wurf];
PORTD = (PORTD & 0b00001111) | musterD[wurf];
}
void zeigeE(byte wurf) {
if (wurf > 3) {
digitalWrite(4, HIGH);
digitalWrite(12, HIGH);
} else {
digitalWrite(4, LOW);
digitalWrite(12, LOW);
}
if (wurf > 5) {
digitalWrite(5, HIGH);
digitalWrite(11, HIGH);
} else {
digitalWrite(5, LOW);
digitalWrite(11, LOW);
}
if (wurf > 1) {
digitalWrite(6, HIGH);
digitalWrite(10, HIGH);
} else {
digitalWrite(6, LOW);
digitalWrite(10, LOW);
}
if (wurf % 2 == 1) {
digitalWrite(8, HIGH);
} else {
digitalWrite(8, LOW);
}
}
void zeigeD(byte wurf) {
digitalWrite(4, wurf > 3 ? HIGH : LOW);
digitalWrite(5, wurf > 5 ? HIGH : LOW);
digitalWrite(6, wurf > 1 ? HIGH : LOW);
digitalWrite(8, wurf % 2 == 1 ? HIGH : LOW);
digitalWrite(10, wurf > 1 ? HIGH : LOW);
digitalWrite(11, wurf > 5 ? HIGH : LOW);
digitalWrite(12, wurf > 3 ? HIGH : LOW);
}
void zeigeC(byte wurf) {
for (byte i = 4 ; i <= 12 ; i++) {
digitalWrite(i, LOW);
}
if (wurf == 1){
digitalWrite(8, HIGH);
}
else if (wurf == 2){
digitalWrite(6, HIGH);
digitalWrite(10, HIGH);
}
else if (wurf == 3){
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
digitalWrite(10, HIGH);
}
else if (wurf == 4){
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
digitalWrite(10, HIGH);
digitalWrite(12, HIGH);
}
else if (wurf == 5){
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
digitalWrite(10, HIGH);
digitalWrite(12, HIGH);
}
else if (wurf == 6){
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
}
}
void zeigeB(byte wurf) {
if (wurf == 1){
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
else if (wurf == 2){
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
else if (wurf == 3){
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
else if (wurf == 4){
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
else if (wurf == 5){
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
else if (wurf == 6){
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
}
}
void zeigeA(byte wurf) {
switch (wurf) {
case 1:
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 2:
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 3:
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
break;
case 4:
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
break;
case 5:
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
break;
case 6:
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
break;
}
}