gabbyshimoni

7segWithDelay

Dec 11th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.60 KB | None | 0 0
  1. // This clock engine is based of of code from nootropicdesign.com - thanks!
  2. // Jeremy Saglimbeni 2011 - thecustomgeek.com
  3. // These are indexes into the groundPins array
  4. #define MIDDLE 0 // G
  5. #define UPPER_L 1 // F
  6. #define LOWER_L 2 // E
  7. #define BOTTOM 3 // D
  8. #define LOWER_R 4 // C
  9. #define UPPER_R 5 // B
  10. #define TOP 6 // A
  11. // pin 13 is the colon between the hours and minutes
  12. int groundPins[7] = {2, 3, 4, 5, 6, 7, 8}; // G, F, E, D, C, B, A
  13. int digitPins[4] = {17, 18, 19, 16}; // positive voltage supply for each of the 4 digits --17 is RIGHT most digit--
  14. int ON = HIGH; // HIGH for CA, LOW for CC
  15. int OFF = LOW; // LOW for CA, HIGH for CC
  16. int number[10][7]; // holds information about which segments are needed for each of the 10 numbers
  17. int digit[4]; // holds values for each of the 4 display digits
  18.  
  19. int hours = 12;
  20. int minutes = 00;
  21. int elapsedMinutes = 0;
  22. int seconds = 0;
  23. int secon;
  24. int hourset = 14;
  25. int hoursetv = 0;
  26. int minuteset = 15;
  27. int minutesetv = 0;
  28. int showsw = 12;
  29. int showswv = 0;
  30. unsigned long prevtime;
  31. int showtime = 16380;
  32. int delaytime = 200;
  33. void setup()
  34. {
  35.   digitalWrite(13, HIGH);
  36.   pinMode(hourset, INPUT);
  37.   pinMode(minuteset, INPUT);
  38.   pinMode(showsw, INPUT);
  39.   digitalWrite(hourset, HIGH);
  40.   digitalWrite(minuteset, HIGH);
  41.   digitalWrite(showsw, HIGH);
  42.   initNumber();
  43.   for(int i=0; i < 7; i++) {
  44.     pinMode(groundPins[i], OUTPUT);
  45.     digitalWrite(groundPins[i], HIGH); // HIGH for CA, LOW for CC
  46.   }
  47.   for(int i=0; i < 4; i++) {
  48.     pinMode(digitPins[i], OUTPUT);
  49.     digitalWrite(digitPins[i], LOW); // LOW for CA, HIGH for CC
  50.   }
  51. }
  52.  
  53. void loop() {
  54.   int n = 0;
  55.   unsigned long time = millis() - (elapsedMinutes * 60000);
  56.   seconds = (time / 1000);
  57.   if (seconds > 60) {
  58.     seconds = 0;
  59.     minutes++;
  60.     elapsedMinutes++;
  61.     if (minutes >= 60) {
  62.       minutes = 0;
  63.       hours++;
  64.       if (hours > 12) {
  65.         hours = 1;
  66.       }
  67.     }
  68.   }
  69.   n = (hours * 100) + minutes;
  70.   setDigit(n);
  71.  
  72.   for(int g=0; g < 7; g++) {
  73.     digitalWrite(groundPins[g], LOW); // LOW for CA, HIGH for CC
  74.     for(int i=0; i < 4; i++) {
  75.       if (digit[i] < 0) {
  76.         continue;
  77.       }
  78.       digitalWrite(digitPins[i], number[digit[i]][g]);
  79.     }
  80.     getDelay(); // delay multiplexing function
  81.     digitalWrite(groundPins[g], HIGH); // HIGH for CA, LOW for CC
  82.   }
  83.   if (time - prevtime > 500) { // toggle a second flag to blink the colon
  84.     prevtime = time;
  85.     if (secon == 1) {
  86.       secon = 0;
  87.       return;
  88.     }
  89.     if (secon == 0) {
  90.       secon = 1;
  91.       return;
  92.     }
  93.   }
  94. if (secon == 1) {
  95.   digitalWrite(13, HIGH);
  96. }
  97. if (secon == 0) {
  98.   digitalWrite(13, LOW);
  99. }
  100. hoursetv = digitalRead(hourset); // hour set button
  101. if (hoursetv == LOW) {
  102. hours++;
  103. delay(40);
  104. if (hours > 12) {
  105.   hours = 1;
  106. }
  107. }
  108. minutesetv = digitalRead(minuteset); // minute set button
  109. if (minutesetv == LOW) {
  110. minutes++;
  111. delay(40);
  112. if (minutes > 59) {
  113.   minutes = 0;
  114. }
  115. }
  116. showswv = digitalRead(showsw); // button to slow the multiplexing down
  117. if (showswv == LOW) {
  118. showtime = 16380;
  119. delaytime = 200;
  120. }
  121. }
  122.  
  123. void setDigit(int n) {
  124.   n = n % 2000;
  125.   digit[0] = n % 10;
  126.   digit[1] = (n / 10) % 10;
  127.   if ((digit[1] == 0) && (n < 10)) {
  128.     digit[1] = -1;
  129.   }
  130.   digit[2] = (n / 100) % 10;
  131.   if ((digit[2] == 0) && (n < 100)) {
  132.     digit[2] = -1;
  133.   }
  134.   digit[3] = (n / 1000) % 10;
  135.   if (digit[3] == 0) {
  136.     digit[3] = -1;
  137.   }
  138. }
  139.  
  140. void getDelay() { //stutter the multiplexing refresh
  141.   if (delaytime >= 7) {
  142.   delay(delaytime);
  143.   delaytime -= 1;
  144. }
  145.   if (delaytime < 7) {
  146.   delayMicroseconds(showtime);
  147.   showtime -= 35;
  148.   if (showtime <= 1501) {
  149.   showtime = 1500;
  150.   }
  151.   }
  152. }
  153.  
  154. void initNumber() {
  155.   number[0][MIDDLE]  = OFF;
  156.   number[0][UPPER_L] = ON;
  157.   number[0][LOWER_L] = ON;
  158.   number[0][BOTTOM]  = ON;
  159.   number[0][LOWER_R] = ON;
  160.   number[0][UPPER_R] = ON;
  161.   number[0][TOP]     = ON;
  162.  
  163.   number[1][MIDDLE]  = OFF;
  164.   number[1][UPPER_L] = OFF;
  165.   number[1][LOWER_L] = OFF;
  166.   number[1][BOTTOM]  = OFF;
  167.   number[1][LOWER_R] = ON;
  168.   number[1][UPPER_R] = ON;
  169.   number[1][TOP]     = OFF;
  170.  
  171.   number[2][MIDDLE]  = ON;
  172.   number[2][UPPER_L] = OFF;
  173.   number[2][LOWER_L] = ON;
  174.   number[2][BOTTOM]  = ON;
  175.   number[2][LOWER_R] = OFF;
  176.   number[2][UPPER_R] = ON;
  177.   number[2][TOP]     = ON;
  178.  
  179.   number[3][MIDDLE]  = ON;
  180.   number[3][UPPER_L] = OFF;
  181.   number[3][LOWER_L] = OFF;
  182.   number[3][BOTTOM]  = ON;
  183.   number[3][LOWER_R] = ON;
  184.   number[3][UPPER_R] = ON;
  185.   number[3][TOP]     = ON;
  186.  
  187.   number[4][MIDDLE]  = ON;
  188.   number[4][UPPER_L] = ON;
  189.   number[4][LOWER_L] = OFF;
  190.   number[4][BOTTOM]  = OFF;
  191.   number[4][LOWER_R] = ON;
  192.   number[4][UPPER_R] = ON;
  193.   number[4][TOP]     = OFF;
  194.  
  195.   number[5][MIDDLE]  = ON;
  196.   number[5][UPPER_L] = ON;
  197.   number[5][LOWER_L] = OFF;
  198.   number[5][BOTTOM]  = ON;
  199.   number[5][LOWER_R] = ON;
  200.   number[5][UPPER_R] = OFF;
  201.   number[5][TOP]     = ON;
  202.  
  203.   number[6][MIDDLE]  = ON;
  204.   number[6][UPPER_L] = ON;
  205.   number[6][LOWER_L] = ON;
  206.   number[6][BOTTOM]  = ON;
  207.   number[6][LOWER_R] = ON;
  208.   number[6][UPPER_R] = OFF;
  209.   number[6][TOP]     = ON;
  210.  
  211.   number[7][MIDDLE]  = OFF;
  212.   number[7][UPPER_L] = OFF;
  213.   number[7][LOWER_L] = OFF;
  214.   number[7][BOTTOM]  = OFF;
  215.   number[7][LOWER_R] = ON;
  216.   number[7][UPPER_R] = ON;
  217.   number[7][TOP]     = ON;
  218.  
  219.   number[8][MIDDLE]  = ON;
  220.   number[8][UPPER_L] = ON;
  221.   number[8][LOWER_L] = ON;
  222.   number[8][BOTTOM]  = ON;
  223.   number[8][LOWER_R] = ON;
  224.   number[8][UPPER_R] = ON;
  225.   number[8][TOP]     = ON;
  226.  
  227.   number[9][MIDDLE]  = ON;
  228.   number[9][UPPER_L] = ON;
  229.   number[9][LOWER_L] = OFF;
  230.   number[9][BOTTOM]  = ON;
  231.   number[9][LOWER_R] = ON;
  232.   number[9][UPPER_R] = ON;
  233.   number[9][TOP]     = ON;
  234. }
Add Comment
Please, Sign In to add comment