#include <LiquidCrystal_I2C.h>
// Adapted Seven-segment display pin definitions
#define A PB_13
#define B PB_12
#define C PB_11
#define D PB_10
#define E PB_9
#define F PB_8
#define G PB_7
#define H PB_6 // DP (decimal point)
const int buttonPin = PA_2; // Pin for push button (adjusted to STM32)
bool isPaused = false; // Flag to indicate pause state
int currentNumber = 0; // Track the current number to display
unsigned long lastUpdateTime = 0; // Time of the last number update
unsigned long blinkTime = 0; // Timer for blinking DP
bool dpState = false; // State of DP LED for blinking
const unsigned long interval = 500; // Interval for updating display (0.5 second)
const unsigned long dpInterval = 1000; // Interval for DP LED blinking (1 second)
// Initialize LCD
LiquidCrystal_I2C lcd(0x20, 16, 2);
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(H, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Set button pin with internal pull-up
Serial.begin(9600);
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0); // Set cursor to the beginning of the first line
lcd.print("Current No: "); // Print initial message
}
void loop() {
// Check button press and toggle pause/resume immediately
if (digitalRead(buttonPin) == LOW) { // Button pressed
delay(50); // Debounce delay
if (digitalRead(buttonPin) == LOW) { // Confirm button press
togglePause();
while (digitalRead(buttonPin) == LOW); // Wait for button release
}
}
// Pause display and handle messages when paused
if (isPaused) {
if (currentNumber == 8) {
lcd.setCursor(0, 1); // Move cursor to the second line of the LCD
lcd.print("You Win! "); // Display win message
Serial.println("You Win!");
} else {
lcd.setCursor(0, 1); // Move cursor to the second line of the LCD
lcd.print("You Lose! "); // Display lose message
Serial.println("You Lose!");
}
// Blink DP if paused and current number is not 8
if (currentNumber == 8) {
digitalWrite(H, LOW); // Ensure DP LED is off when winning
} else {
if (millis() - blinkTime >= dpInterval) { // Toggle DP LED every second
dpState = !dpState; // Toggle DP LED state
digitalWrite(H, dpState ? HIGH : LOW); // Set DP LED
blinkTime = millis();
}
}
return; // Exit loop to keep display paused
}
// Update display if not paused and the interval has passed
if (!isPaused && (millis() - lastUpdateTime >= interval)) {
lastUpdateTime = millis(); // Update time of last number update
displayNumber(currentNumber);
digitalWrite(H, LOW); // Ensure DP LED is off when not paused
// Print the current number to the first line of the LCD
lcd.setCursor(13, 0); // Move cursor to the end of the first line
lcd.print(currentNumber); // Print current number to LCD
Serial.print("Current No: ");
Serial.println(currentNumber);
currentNumber = (currentNumber + 1) % 10; // Increment and wrap around after 9
}
}
// Functions to display numbers on the seven-segment display
void displayNumber(int num) {
switch (num) {
case 0: zero(); break;
case 1: one(); break;
case 2: two(); break;
case 3: three(); break;
case 4: four(); break;
case 5: five(); break;
case 6: six(); break;
case 7: seven(); break;
case 8: eight(); break;
case 9: nine(); break;
}
}
void togglePause() {
isPaused = !isPaused; // Toggle the pause state
}
// Number display functions for seven-segment display
void zero() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, LOW); digitalWrite(H, LOW);
}
void one() {
digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, LOW); digitalWrite(H, LOW);
}
void two() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, LOW);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void three() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void four() {
digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, HIGH);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void five() {
digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(F, HIGH);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void six() {
digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void seven() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, LOW); digitalWrite(H, LOW);
}
void eight() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
void nine() {
digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH);
digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(F, HIGH);
digitalWrite(G, HIGH); digitalWrite(H, LOW);
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6