// Laufrichtung initialisieren
bool shiftRight = true;

void setup() {
    // Konfiguration der Pins PA0 bis PA7 als Ausgänge für LEDs
    GPIOA->MODER &= ~(0xFFFF);  // Setzt PA0 bis PA7 auf 0 (Input)
    GPIOA->MODER |= 0x5555;     // Konfiguriert PA0 bis PA7 als Output (01 in jedem MODER-Bitpaar)

    // Konfiguration der Pins PB0 und PB1 als Eingänge für Taster
    GPIOB->MODER &= ~(0xF);   // MODER-Bits für PB0 und PB1 löschen
    GPIOB->MODER |= 0x0;     // Setzt PB0 und PB1 auf 0 (Input)
    
    GPIOB->PUPDR &= ~(0xF);     // Löscht Pull-up/down-Konfiguration
    GPIOB->PUPDR |= 0xA;        // Aktiviert Pull-Down-Widerstände für PB0 und PB1 (10 in jedem PUPDR-Bitpaar)

    // Initialisiere die LEDs mit nur der ersten LED eingeschaltet
    GPIOA->ODR = 0x80;
}

void loop() {
    // Prüfe Tasterstatus zur Laufrichtungssteuerung
    if ((GPIOB->IDR & 0x01) != 0) {  // PB0 gedrückt -> Rechtsverschiebung
        shiftRight = true;
    }
    else if ((GPIOB->IDR & 0x02) != 0) {  // PB1 gedrückt -> Linksschiebung
        shiftRight = false;
    }

    // LED-Steuerung: Laufrichtung abhängig von shiftRight
    if (shiftRight) {
        // Rechtsverschiebung
        GPIOA->ODR >>= 1;
        if (GPIOA->ODR == 0) {
            GPIOA->ODR = 0x80;  // Setzt das höchste Bit bei Ende des Zyklus
        }
    } else {
        // Linksschiebung
        GPIOA->ODR <<= 1;
        if (GPIOA->ODR == 0x80) {
            GPIOA->ODR = 0x01;  // Setzt das niedrigste Bit bei Ende des Zyklus
        }
    }

    // Wartezeit für die Sichtbarkeit des Lauflichts
    delay(200);
}
Loading
st-nucleo-c031c6