7 Segment Clock

Thanks.

Here is the code. I don't really have a schematic - I built it on some strip board, because it made the wiring to all the LED segments so easy. It's nothing specil though - a standalone arduino, and a MA7219 connected to six 7 segment displays. The MAX7219 has an example schematic for this.

Code part I

/*              Alex's 7 Segment LED Clock 

                Requires 32.768kHz watch crystal in place of arduino's typical 16 MHz crystal
                
                HEAVILY based on mtbf0's code from
                http://forums.ladyada.net/viewtopic.php?t=4418&start=0
                Massive thank you
                
                Use a programmer to program the fuses, use...
                avrdude -p m168 -cusbtiny -U lfuse:w:0xf2:m 
                ... assuming you are using the awesome USBTiny ISP
                
                When programming from Arduino IDE use Target = Lilypad
                
                Uses Wayoda's exellent LedControl library. Library and excellent examples at 
                http://www.wayoda.org/arduino/ledcontrol/index.html
                
                LED 7 segments are connected to MAX7219 chip segs A-G and digits 0-5

                
*/
#include "LedControl.h"        // Include the LedControl library
LedControl lc=LedControl(12,11,10,1); // Set up an LED object on pins 12,11,10 

#define hours_adjust 14        // Input pin for hours adjust button
#define mins_adjust 15         // Input pin for minutes adjust button

int seconds_ones;
int minutes_ones;
int hours_ones;
int seconds_tens;              // Initialise values for tens and ones units of h,m,s 
int minutes_tens;              // these are the values actually sent to the LEDs
int hours_tens;
volatile unsigned char tick;
unsigned char seconds = 0;
unsigned char minutes = 0;     // Inititialise actual values for h,m,s
unsigned char hours = 0;
int hours_increase = 0;
int mins_increase = 0;

ISR (TIMER2_OVF_vect) {        // When timer2 overflows...
  tick++;                      // increment tick
  display_time ();             // send the time to the LEDs to be displayed
  
}

void set_time() {              // Function for setting the time
  
  pinMode(hours_adjust,INPUT);  // Set the adjust buttons as inputs
  pinMode(mins_adjust,INPUT);
  
  hours_increase = digitalRead(hours_adjust);  // Read the adjust buttons
  mins_increase = digitalRead(mins_adjust);
  
  while(hours_increase==HIGH || mins_increase==HIGH){  // If either of the adjust buttons are high
    
    if (hours_increase==HIGH){            // Increase hours if hours button pressed
      hours = hours + 1;
    }
    if (mins_increase==HIGH){            // Increase minutes if minutes button pressed
      minutes = minutes + 1;
    }
    
    display_time();                      // Send the time to the LEDs 
    
    delay(750);
    hours_increase = digitalRead(hours_adjust);   // Increase the values of hours and/or mins as necessary
    mins_increase = digitalRead(mins_adjust);
  }
}

void display_time () {                     // Function to display the time
     
    seconds_ones = seconds % 10;           // Get the 1's digit of seconds
    if (seconds>=10){                      // If seconds greater than 10
     seconds_tens = seconds / 10;}         // Get 10's digit of seconds
    else {
      seconds_tens = 0;}                   // Otherwise 10s is 0
      
    minutes_ones = minutes % 10;           // Repeat for minutes
    if (minutes>=10){
     minutes_tens = minutes / 10 ;}
    else {
      minutes_tens = 0;} 
   
    hours_ones = hours % 10;               // Repeat for seconds
    if (hours>=10){
     hours_tens = hours / 10 ;}
    else {
      hours_tens = 0;}  
      
    lc.setDigit(0,0,(byte)seconds_ones,false);  // Send digits to LEDs
    lc.setDigit(0,1,(byte)seconds_tens,false);
    lc.setDigit(0,2,(byte)minutes_ones,false);
    lc.setDigit(0,3,(byte)minutes_tens,false);
    lc.setDigit(0,4,(byte)hours_ones,false);
    lc.setDigit(0,5,(byte)hours_tens,false);
}
  

void setup_timer2 () {                  // Set up function
  TCCR2A = 0;
  TCCR2B = 0;                           // stop timer
  TCNT2 = 0;                            // reset timer2 counter
  ASSR = (1 << AS2);                    // select external clock source
  TIMSK2 = (1 << TOIE2);                // enable timer2 overflow interrupt
  TCCR2B = (1 << CS22) | (1 << CS20);   // prescaler = 128, restarts timer
}

void setup () {

   setup_timer2 ();                     // Set up the timer options 
   lc.shutdown(0,false);                // Turn on the LEDs
   lc.setIntensity(0,15);               // Set intensity to full
   set_time();                          // Run the time set function
}