const int countScores = 10; // DEBUG // const int countScores = 9; const int scores[][countScores] = { {8, 10, 8, 8, 9, 9, 9, 10, 9}, {8, 10, 7, 9, 5, 7, 9, 10, 9}, {8, 10, 9, 9, 9, 9, 9, 10, 9}, {8, 10, 2, 4, 7, 7, 7, 10, 7} }; // end scores definition #define segOn HIGH #define segOff LOW #define digitOn HIGH #define digitOff LOW #define PUSHED false #define NOT_PUSHED true #define WATCH_BUTTON true #define IGNORE_BUTTON false unsigned long buttonWaitInterval = 5000; // in MICROSECONDS unsigned long digitDisplayTime = 1; // pause per digit, in us const int BUTTONpin = 2; unsigned long previousMicros = 0; boolean previousButtonState = NOT_PUSHED; boolean debouncedButtonState = NOT_PUSHED; boolean bounceState = false; const int a = 0; const int b = 1; const int c = 2; const int d = 3; const int e = 4; const int f = 5; const int g = 6; const int digits[][7] = { {segOn, segOn, segOn, segOn, segOn, segOn, segOff}, // 0 {segOff, segOn, segOn, segOff, segOff, segOff, segOff}, // 1 {segOn, segOn, segOff, segOn, segOn, segOff, segOn}, // 2 {segOn, segOn, segOn, segOn, segOff, segOff, segOn}, // 3 {segOff, segOn, segOn, segOff, segOff, segOn, segOn}, // 4 {segOn, segOff, segOn, segOn, segOff, segOn, segOn}, // 5 {segOn, segOff, segOn, segOn, segOn, segOn, segOn}, // 6 {segOn, segOn, segOn, segOff, segOff, segOff, segOff}, // 7 {segOn, segOn, segOn, segOn, segOn, segOn, segOn}, // 8 {segOn, segOn, segOn, segOff, segOff, segOn, segOn}, // 9 {segOff, segOff, segOff, segOff, segOff, segOff, segOff}, // Off }; // end segment definitions const int segmentBase = 40; const int digitselectBase = 4; const boolean Forever = true ; #define Halt while(true) void setup() { Serial.begin(9600); pinMode(BUTTONpin, INPUT_PULLUP); // Serial.println("Control initialized"); for (int Pin = segmentBase; Pin <= segmentBase + g; Pin++) { pinMode(Pin, OUTPUT); digitalWrite(Pin, segOff); } // Serial.println("Segment control initialized"); for (int Pin = digitselectBase; Pin <= digitselectBase + 3; Pin++) { pinMode(Pin, OUTPUT); digitalWrite(Pin, digitOff); } // Serial.println("All segments off"); } // end setup ======================================================= void loop() { int score = 0; int lastdigit = 0; int digit = 0; int segment = 0; while (Forever) { // multiplex digits // Display all digits for (digit = 0; digit < 4; digit++) { lastdigit = digit - 1; // calculate last digit displayed if (lastdigit < 0) lastdigit = 3; // Serial.print("Digit "); // Serial.print(digit); // Serial.print(" (last digit "); // Serial.print(lastdigit); // Serial.println(")"); // turn off lastdigit digitalWrite(digitselectBase + lastdigit, digitOff); // turn off last digit // output next digit's segments // Serial.print("Score digit "); // Serial.println(scores[digit][score]); for (segment = a; segment <= g; segment++) { digitalWrite(segmentBase + segment, digits[scores[digit][score]][segment]); Serial.print(digits[scores[digit][score]][segment]); } // end output next digit's segments // Serial.println(); // turn on digit digitalWrite(digitselectBase + digit, digitOn); // turn on digit delay(digitDisplayTime); delayMicroseconds(digitDisplayTime); // See if a command to change score was received updateButton(); if (! debouncedButtonState) { while (debouncedButtonState == LOW) updateButton(); score++; // activate next score if ( score == countScores) { // all scores have been shown AllSegmentsOff(); AllDigitsOff(); Halt; } } } // end loop through digits } // end multiplexing digits } // end void loop ====================================================== void updateButton() { if (bounceState == WATCH_BUTTON) { boolean currentButtonState = digitalRead(BUTTONpin); if (previousButtonState != currentButtonState) { bounceState = IGNORE_BUTTON; previousMicros = micros(); } previousButtonState = currentButtonState; } if (bounceState == IGNORE_BUTTON) { unsigned long currentMicros = micros(); if ((unsigned long)(currentMicros - previousMicros) >= buttonWaitInterval) { debouncedButtonState = digitalRead(BUTTONpin); bounceState = WATCH_BUTTON; } } } void AllSegmentsOff() { for (int Pin = segmentBase; Pin <= segmentBase + g; Pin++) { digitalWrite(Pin, segOff); } } void AllDigitsOff() { for (int Pin = digitselectBase; Pin <= digitselectBase + 3; Pin++) { digitalWrite(Pin, digitOff); } }