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
}