void setup() {
// GPIOA und GPIOB Takt freischalten (STM32-spezifisch)
RCC->AHBENR |= (1 << 0); // Takt für GPIOA aktivieren
RCC->AHBENR |= (1 << 1); // Takt für GPIOB aktivieren
// GPIOA-Pins PA0 bis PA7 als Ausgang konfigurieren
GPIOA->MODER &= ~0x0000FFFF; // Bits für PA0 bis PA7 löschen
GPIOA->MODER |= 0x00005555; // Bits für PA0 bis PA7 auf '01' setzen (Ausgangsmodus)
// GPIOB-Pin PB0 als Eingang konfigurieren (für den Button)
GPIOB->MODER &= ~(0x3 << (0 * 2)); // Pin PB0 als Eingang setzen
}
int speedDelay = 500; // Startgeschwindigkeit (in Millisekunden)
int minSpeedDelay = 100; // Minimale Geschwindigkeit
bool gameActive = true; // Status des Spiels
void loop() {
if (gameActive) {
for (int i = 0; i < 8; i++) {
GPIOA->ODR = (1 << i); // Setzt den aktuellen Pin PA0 bis PA7 auf HIGH
// Wenn die LED an PA7 (letzte LED) leuchtet
if (i == 7) {
if (GPIOB->IDR & (1 << 0)) { // Wenn Button PB0 gedrückt wird
increaseSpeed(); // Geschwindigkeit erhöhen
}
} else {
// Wenn der Button zu einem falschen Zeitpunkt gedrückt wird
if (GPIOB->IDR & (1 << 0)) {
gameOver(); // Spiel beenden und LEDs blinken lassen
}
}
delay(speedDelay); // Wartezeit für die aktuelle Geschwindigkeit
}
}
}
void increaseSpeed() {
speedDelay -= 100; // Geschwindigkeit erhöhen (Delay verringern)
if (speedDelay < minSpeedDelay) {
speedDelay = minSpeedDelay; // Begrenzung der Geschwindigkeit
}
}
void gameOver() {
// Alle LEDs aufleuchten lassen
GPIOA->ODR = 0xFF; // Setzt alle Pins PA0 bis PA7 auf HIGH
delay(1000); // 1 Sekunde warten
GPIOA->ODR = 0x00; // Setzt alle Pins PA0 bis PA7 auf LOW
delay(3000); // 3 Sekunden warten
// Spiel zurücksetzen
speedDelay = 500; // Startgeschwindigkeit zurücksetzen
gameActive = true; // Spiel wieder aktivieren
}
/*
// Pin-Zuordnung für die LEDs
#define LED0 A0
#define LED1 A1
#define LED2 A2
#define LED3 A3
#define LED4 A4
#define LED5 A5
#define LED6 PC13
#define LED7 PC14
#define BUTTON_PIN PA14 // Pin für den Taster
int speedDelay = 500; // Startgeschwindigkeit (in Millisekunden)
int minSpeedDelay = 100; // Minimale Geschwindigkeit
bool gameActive = true; // Spielstatus
int ledPosition = 0; // Aktuelle Position der leuchtenden LED
void setup() {
// LEDs als Ausgänge definieren
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
// Taster als Eingang definieren
pinMode(BUTTON_PIN, INPUT_PULLDOWN);
}
void loop() {
if (gameActive) {
// Schalte die LEDs in der Reihenfolge mit einem switch-case
switch (ledPosition) {
case 0:
turnOnLED(LED0);
checkButton(LED0);
break;
case 1:
turnOnLED(LED1);
checkButton(LED1);
break;
case 2:
turnOnLED(LED2);
checkButton(LED2);
break;
case 3:
turnOnLED(LED3);
checkButton(LED3);
break;
case 4:
turnOnLED(LED4); // PC7, der richtige Zeitpunkt zum Drücken
checkButton(LED4);
break;
case 5:
turnOnLED(LED5);
checkButton(LED5);
break;
case 6:
turnOnLED(LED6);
checkButton(LED6);
break;
case 7:
turnOnLED(LED7);
checkButton(LED7);
break;
}
delay(speedDelay);
// Erhöhe die LED-Position und beginne wieder bei 0, wenn sie das Ende erreicht
ledPosition++;
if (ledPosition > 7) {
ledPosition = 0;
}
}
}
void turnOnLED(int ledPin) {
// Alle LEDs ausschalten
digitalWrite(LED0, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
digitalWrite(LED7, LOW);
// Gewählte LED einschalten
digitalWrite(ledPin, HIGH);
}
void checkButton(int ledPin) {
if (digitalRead(BUTTON_PIN) == HIGH) {
if (ledPin == LED7) { // Wenn die LED an PC14 leuchtet
increaseSpeed();
} else {
gameOver();
}
}
}
void increaseSpeed() {
// Geschwindigkeit erhöhen (Delay verkleinern)
speedDelay -= 200;
if (speedDelay < minSpeedDelay) {
speedDelay = minSpeedDelay; // Begrenzung, damit es nicht zu schnell wird
}
}
void gameOver() {
// Alle LEDs blinken, um das Spielende zu signalisieren
digitalWrite(LED0, HIGH);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, HIGH);
digitalWrite(LED7, HIGH);
delay(1000); // Spiel-Ende Verzögerung
// Alle LEDs ausschalten
turnOnLED(-1);
gameActive = false; // Spiel stoppen
}
*/