Drehimpulsgeber / BIN Ausbabe - Fehler beim Abwärtz Zählen

Schöne Idee, eventuell so?

void ausgabe(uint8_t w) {
  uint8_t p = 0x80;
  while (p > 0) {
    if (w & p) {
      Serial.print('1');
    } else {
      Serial.print('0');
    }
    p = p >> 1;
  }
}

Unter Berücksichtigung der LED-Pins auch so:

void ausgabe(uint8_t w) {
  uint8_t p = 0x80;
  for (const byte lp : LED_PIN) {
    if (w & p) {
      Serial.print('1');
      digitalWrite(lp, HIGH);
    } else {
      Serial.print('0');
      digitalWrite(lp, LOW);
    }
    p = p >> 1;
  }
}

Im Zusammenhang:

// Quelle: https://github.com/pinae/Knob-Louder
// Beschreibung: c't 18/2020
const byte LED_PIN[] = {2, 3, 4, 5, 6, 7, 8, 9};
const byte ENCODER_A_PIN = A0;
const byte ENCODER_B_PIN = A1;

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  pinMode(ENCODER_A_PIN, INPUT);
  pinMode(ENCODER_B_PIN, INPUT);
  for (const byte lp : LED_PIN) pinMode(lp, OUTPUT);
}

void loop() {
  static uint8_t wert = 127;
  int8_t state = 0;
  rotaryEncoder(state);
  if (state == -1) {
    if (wert > 0) wert--;
    Serial.print("<-- \t");
    ausgabe (wert);
    Serial.print('\t');
    Serial.print(wert);
    Serial.println();
  }
  if (state == 1) {
    if (wert < 255) wert++;
    Serial.print(" --> \t");
    ausgabe (wert);
    Serial.print('\t');
    Serial.print(wert);
    Serial.println();
  }
}

void ausgabe(uint8_t w) {
  uint8_t p = 0x80;
  for (const byte lp : LED_PIN) {
    if (w & p) {
      Serial.print('1');
      digitalWrite(lp, HIGH);
    } else {
      Serial.print('0');
      digitalWrite(lp, LOW);
    }
    p = p >> 1;
  }
}

void rotaryEncoder(int8_t &delta) {
  delta = 0;
  enum {STATE_LOCKED, STATE_TURN_RIGHT_START, STATE_TURN_RIGHT_MIDDLE, STATE_TURN_RIGHT_END, STATE_TURN_LEFT_START, STATE_TURN_LEFT_MIDDLE, STATE_TURN_LEFT_END, STATE_UNDECIDED};
  static uint8_t encoderState = STATE_LOCKED;
  bool a = !digitalRead(ENCODER_A_PIN);
  bool b = !digitalRead(ENCODER_B_PIN);
  switch (encoderState) {
    case STATE_LOCKED:
      if (a && b) {
        encoderState = STATE_UNDECIDED;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_LEFT_START;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_RIGHT_START;
      }
      else {
        encoderState = STATE_LOCKED;
      };
      break;
    case STATE_TURN_RIGHT_START:
      if (a && b) {
        encoderState = STATE_TURN_RIGHT_MIDDLE;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_RIGHT_END;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_RIGHT_START;
      }
      else {
        encoderState = STATE_LOCKED;
      };
      break;
    case STATE_TURN_RIGHT_MIDDLE:
    case STATE_TURN_RIGHT_END:
      if (a && b) {
        encoderState = STATE_TURN_RIGHT_MIDDLE;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_RIGHT_END;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_RIGHT_START;
      }
      else {
        encoderState = STATE_LOCKED;
        delta = -1;
      };
      break;
    case STATE_TURN_LEFT_START:
      if (a && b) {
        encoderState = STATE_TURN_LEFT_MIDDLE;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_LEFT_START;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_LEFT_END;
      }
      else {
        encoderState = STATE_LOCKED;
      };
      break;
    case STATE_TURN_LEFT_MIDDLE:
    case STATE_TURN_LEFT_END:
      if (a && b) {
        encoderState = STATE_TURN_LEFT_MIDDLE;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_LEFT_START;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_LEFT_END;
      }
      else {
        encoderState = STATE_LOCKED;
        delta = 1;
      };
      break;
    case STATE_UNDECIDED:
      if (a && b) {
        encoderState = STATE_UNDECIDED;
      }
      else if (!a && b) {
        encoderState = STATE_TURN_RIGHT_END;
      }
      else if (a && !b) {
        encoderState = STATE_TURN_LEFT_END;
      }
      else {
        encoderState = STATE_LOCKED;
      };
      break;
  }
}