gabbyshimoni icon

7segWithDelay

gabbyshimoni | PRO | 12/11/18 06:57:18 AM UTC | 0 ⭐ | 300 👁️ | Never ⏰ | []
C++ |

5.6 KB

|

None

|

0 👍

/

0 👎

// This clock engine is based of of code from nootropicdesign.com - thanks!
// Jeremy Saglimbeni 2011 - thecustomgeek.com
// These are indexes into the groundPins array
#define MIDDLE 0 // G
#define UPPER_L 1 // F
#define LOWER_L 2 // E
#define BOTTOM 3 // D
#define LOWER_R 4 // C
#define UPPER_R 5 // B
#define TOP 6 // A
// pin 13 is the colon between the hours and minutes
int groundPins[7] = {2, 3, 4, 5, 6, 7, 8}; // G, F, E, D, C, B, A
int digitPins[4] = {17, 18, 19, 16}; // positive voltage supply for each of the 4 digits --17 is RIGHT most digit--
int ON = HIGH; // HIGH for CA, LOW for CC
int OFF = LOW; // LOW for CA, HIGH for CC
int number[10][7]; // holds information about which segments are needed for each of the 10 numbers
int digit[4]; // holds values for each of the 4 display digits
 
int hours = 12;
int minutes = 00;
int elapsedMinutes = 0;
int seconds = 0;
int secon;
int hourset = 14;
int hoursetv = 0;
int minuteset = 15;
int minutesetv = 0;
int showsw = 12;
int showswv = 0;
unsigned long prevtime;
int showtime = 16380;
int delaytime = 200;
void setup()
{
  digitalWrite(13, HIGH);
  pinMode(hourset, INPUT);
  pinMode(minuteset, INPUT);
  pinMode(showsw, INPUT);
  digitalWrite(hourset, HIGH);
  digitalWrite(minuteset, HIGH);
  digitalWrite(showsw, HIGH);
  initNumber();
  for(int i=0; i < 7; i++) {
    pinMode(groundPins[i], OUTPUT);
    digitalWrite(groundPins[i], HIGH); // HIGH for CA, LOW for CC
  }
  for(int i=0; i < 4; i++) {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], LOW); // LOW for CA, HIGH for CC
  }
}
 
void loop() {
  int n = 0;
  unsigned long time = millis() - (elapsedMinutes * 60000);
  seconds = (time / 1000);
  if (seconds > 60) {
    seconds = 0;
    minutes++;
    elapsedMinutes++;
    if (minutes >= 60) {
      minutes = 0;
      hours++;
      if (hours > 12) {
        hours = 1;
      }
    }
  }
  n = (hours * 100) + minutes;
  setDigit(n);
 
  for(int g=0; g < 7; g++) {
    digitalWrite(groundPins[g], LOW); // LOW for CA, HIGH for CC
    for(int i=0; i < 4; i++) {
      if (digit[i] < 0) {
        continue;
      }
      digitalWrite(digitPins[i], number[digit[i]][g]);
    }
    getDelay(); // delay multiplexing function
    digitalWrite(groundPins[g], HIGH); // HIGH for CA, LOW for CC
  }
  if (time - prevtime > 500) { // toggle a second flag to blink the colon
    prevtime = time;
    if (secon == 1) {
      secon = 0;
      return;
    }
    if (secon == 0) {
      secon = 1;
      return;
    }
  }
if (secon == 1) {
  digitalWrite(13, HIGH);
}
if (secon == 0) {
  digitalWrite(13, LOW);
}
hoursetv = digitalRead(hourset); // hour set button
if (hoursetv == LOW) {
hours++;
delay(40);
if (hours > 12) {
  hours = 1;
}
}
minutesetv = digitalRead(minuteset); // minute set button
if (minutesetv == LOW) {
minutes++;
delay(40);
if (minutes > 59) {
  minutes = 0;
}
}
showswv = digitalRead(showsw); // button to slow the multiplexing down
if (showswv == LOW) {
showtime = 16380;
delaytime = 200;
}
}
 
void setDigit(int n) {
  n = n % 2000;
  digit[0] = n % 10;
  digit[1] = (n / 10) % 10;
  if ((digit[1] == 0) && (n < 10)) {
    digit[1] = -1;
  }
  digit[2] = (n / 100) % 10;
  if ((digit[2] == 0) && (n < 100)) {
    digit[2] = -1;
  }
  digit[3] = (n / 1000) % 10;
  if (digit[3] == 0) {
    digit[3] = -1;
  }
}
 
void getDelay() { //stutter the multiplexing refresh
  if (delaytime >= 7) {
  delay(delaytime);
  delaytime -= 1;
}
  if (delaytime < 7) {
  delayMicroseconds(showtime);
  showtime -= 35;
  if (showtime <= 1501) {
  showtime = 1500;
  }
  }
} 
 
void initNumber() {
  number[0][MIDDLE]  = OFF;
  number[0][UPPER_L] = ON;
  number[0][LOWER_L] = ON;
  number[0][BOTTOM]  = ON;
  number[0][LOWER_R] = ON;
  number[0][UPPER_R] = ON;
  number[0][TOP]     = ON;
 
  number[1][MIDDLE]  = OFF;
  number[1][UPPER_L] = OFF;
  number[1][LOWER_L] = OFF;
  number[1][BOTTOM]  = OFF;
  number[1][LOWER_R] = ON;
  number[1][UPPER_R] = ON;
  number[1][TOP]     = OFF;
 
  number[2][MIDDLE]  = ON;
  number[2][UPPER_L] = OFF;
  number[2][LOWER_L] = ON;
  number[2][BOTTOM]  = ON;
  number[2][LOWER_R] = OFF;
  number[2][UPPER_R] = ON;
  number[2][TOP]     = ON;
 
  number[3][MIDDLE]  = ON;
  number[3][UPPER_L] = OFF;
  number[3][LOWER_L] = OFF;
  number[3][BOTTOM]  = ON;
  number[3][LOWER_R] = ON;
  number[3][UPPER_R] = ON;
  number[3][TOP]     = ON;
 
  number[4][MIDDLE]  = ON;
  number[4][UPPER_L] = ON;
  number[4][LOWER_L] = OFF;
  number[4][BOTTOM]  = OFF;
  number[4][LOWER_R] = ON;
  number[4][UPPER_R] = ON;
  number[4][TOP]     = OFF;
 
  number[5][MIDDLE]  = ON;
  number[5][UPPER_L] = ON;
  number[5][LOWER_L] = OFF;
  number[5][BOTTOM]  = ON;
  number[5][LOWER_R] = ON;
  number[5][UPPER_R] = OFF;
  number[5][TOP]     = ON;
 
  number[6][MIDDLE]  = ON;
  number[6][UPPER_L] = ON;
  number[6][LOWER_L] = ON;
  number[6][BOTTOM]  = ON;
  number[6][LOWER_R] = ON;
  number[6][UPPER_R] = OFF;
  number[6][TOP]     = ON;
 
  number[7][MIDDLE]  = OFF;
  number[7][UPPER_L] = OFF;
  number[7][LOWER_L] = OFF;
  number[7][BOTTOM]  = OFF;
  number[7][LOWER_R] = ON;
  number[7][UPPER_R] = ON;
  number[7][TOP]     = ON;
 
  number[8][MIDDLE]  = ON;
  number[8][UPPER_L] = ON;
  number[8][LOWER_L] = ON;
  number[8][BOTTOM]  = ON;
  number[8][LOWER_R] = ON;
  number[8][UPPER_R] = ON;
  number[8][TOP]     = ON;
 
  number[9][MIDDLE]  = ON;
  number[9][UPPER_L] = ON;
  number[9][LOWER_L] = OFF;
  number[9][BOTTOM]  = ON;
  number[9][LOWER_R] = ON;
  number[9][UPPER_R] = ON;
  number[9][TOP]     = ON;
}

Comments