const unsigned char SSD_LUT[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
// DECIMAL FORMAT, SO THESE ARE NOT NECESSARY!
// 0b01110111, // A
// 0b01111100, // b
// 0b00111001, // C
// 0b01011110, // d
// 0b01111001, // E
// 0b01110001 // F
};
// As per the lab documentation for the PmodSSD
const int DELAY_IN_MILLISECONDS = 8;
// The first (tens) digit
const byte TENS_DIGIT_PIN = 39;
// The second (unit) digit
const byte UNIT_DIGIT_PIN = 37;
byte count = 0; // Where to start counting from
int startTime, endTime;
void setup() {
// setting port A as output
DDRA = 0b11111111;
pinMode(37, OUTPUT);
pinMode(39, OUTPUT);
}
void loop() {
displayNumber(count);
// "Manually" increment the number every second
endTime = millis();
if ((endTime - startTime) >= 1000) {
if (count > 99) {
count = 0;
} else {
count++;
}
startTime = endTime;
}
}
void enableDigits(const uint8_t tens, const uint8_t unit) {
digitalWrite(TENS_DIGIT_PIN, tens);
digitalWrite(UNIT_DIGIT_PIN, unit);
}
void displayNumber(const byte NUMBER_TO_DISPLAY) {
// Tens digit + remainder
// "cz" in the lab documentation
const byte DIGIT_TENS = NUMBER_TO_DISPLAY / 10;
// "cu" in the lab documentation
const byte DIGIT_UNITS = NUMBER_TO_DISPLAY % 10;
PORTA = SSD_LUT[DIGIT_UNITS];
// Turn off first (tens) digit
enableDigits(HIGH, LOW);
delay(DELAY_IN_MILLISECONDS);
// TURN OFF BOTH DIGITS
enableDigits(HIGH, HIGH);
// Only display first digit if greater than zero
if (DIGIT_TENS > 0) {
PORTA = SSD_LUT[DIGIT_TENS];
// Turn off second (unit) digit
enableDigits(LOW, HIGH);
delay(DELAY_IN_MILLISECONDS);
// TURN OFF BOTH DIGITS
enableDigits(HIGH, HIGH);
}
}