Here is an image and some video footage of the BCDLEDCGM:

Here is the code:
////Pin connected to DS of 74HC595
const int dataPin = 11;
//Pin connected to SH_CP of 74HC595
const int clockPin = 12;
//Pin connected to ST_CP of 74HC595
const int latchPin = 13;
const int switchModeButton = 2;
const int actionButton = 6;
const int hourButton = 4;
const int minuteButton = 5;
const int buzzer = 10;
int minuteSetNum;
int hourSetNum;
int setMinutes;
int setHours;
int shiftAlarmSeconds;
int shiftAlarmMinutes;
int shiftAlarmHours;
int alarmMinutes;
int alarmHours;
int alarmSet;
int hourMode = 0;
int clockMode = 1;
#define SECS_PER_MIN (60UL)
#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN)
void setup()
{
Serial.begin(9600);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(switchModeButton, INPUT);
pinMode(actionButton,INPUT);
pinMode(hourButton, INPUT);
pinMode(minuteButton, INPUT);
}
void loop()
{
if (clockMode == 1)
{
int modeButtonState = digitalRead(switchModeButton);
if (modeButtonState == 1)
clockMode = 0;
int actionButtonState = digitalRead(actionButton);
if (actionButtonState == 1)
if (hourMode == 1)
hourMode = 0;
else
hourMode = 1;
int seconds = shiftSeconds();
int minutes = shiftMinutes(seconds);
int hours = shiftHours(seconds, minutes, hourMode);
if (alarmSet == 1)
if((minutes == shiftAlarmMinutes) && (hours == shiftAlarmHours))
tone(buzzer, 880, 500);
showTime(hours, minutes, seconds);
}
else
{
int modeButtonState = digitalRead(switchModeButton);
if (modeButtonState == 1)
clockMode = 1;
int actionButtonState = digitalRead(actionButton);
if (actionButtonState == 1)
if (alarmSet == 1)
alarmSet = 0;
else
alarmSet = 1;
int seconds = shiftSeconds();
shiftAlarmSeconds = alarmShiftSeconds();
shiftAlarmMinutes = alarmShiftMinutes(seconds);
shiftAlarmHours = alarmShiftHours(seconds, hourMode);
showTime(shiftAlarmHours, shiftAlarmMinutes, shiftAlarmSeconds);
}
delay(500);
}
int shiftSeconds()
{
unsigned long time = millis() / 1000;
int tenSeconds = ((numberOfSeconds(time) - (numberOfSeconds(time) % 10))/ 10);
int oneSeconds = numberOfSeconds(time) % 10 ;
return ((tenSeconds<<4) + oneSeconds);
}
int shiftMinutes(int seconds)
{
int buttonState = digitalRead(minuteButton);
if (buttonState == 1)
minuteSetNum = (minuteSetNum + 1) % 60;
if (seconds == 0)
{
setMinutes = (setMinutes + 1) % 60;
delay(750);
}
int minutes = (setMinutes + minuteSetNum) % 60;
int tenMinutes = ((minutes - (minutes % 10))/ 10);
int oneMinutes = minutes % 10 ;
return ((tenMinutes<<4) + oneMinutes);
}
int shiftHours(int seconds, int minutes, int mode)
{
int buttonState = digitalRead(hourButton);
if (buttonState == 1)
hourSetNum = (hourSetNum + 1) % 24;
if ((seconds == 0) && (minutes == 0))
{
setHours = (setHours + 1) % 24;
delay(750);
}
int hours = (setHours + hourSetNum) % 24;
if (mode == 0)
hours = (hours % 12) + 1;
int tenHours = ((hours - (hours % 10))/ 10);
int oneHours = hours % 10 ;
return ((tenHours<<4) + oneHours);
}
int alarmShiftSeconds()
{
if (alarmSet == 1)
return 255;
else
return 0;
}
int alarmShiftMinutes(int seconds)
{
int buttonState = digitalRead(minuteButton);
if (buttonState == 1)
alarmMinutes = (alarmMinutes + 1) % 60;
if (seconds == 0)
{
setMinutes = (setMinutes + 1) % 60;
delay(750);
}
int minutes = alarmMinutes % 60;
int tenMinutes = ((minutes - (minutes % 10))/ 10);
int oneMinutes = minutes % 10 ;
return ((tenMinutes<<4) + oneMinutes);
}
int alarmShiftHours(int seconds, int mode)
{
int buttonState = digitalRead(hourButton);
if (buttonState == 1)
alarmHours = (alarmHours + 1) % 24;
if ((seconds == 0) && ((setMinutes + minuteSetNum) == 0))
{
setHours = (setHours + 1) % 24;
delay(750);
}
int hours = alarmHours % 24;
if (mode == 0)
hours = (hours % 12) + 1;
int tenHours = ((hours - (hours % 10))/ 10);
int oneHours = hours % 10 ;
return ((tenHours<<4) + oneHours);
}
void showTime(int hours, int minutes, int seconds)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST,hours);
shiftOut(dataPin, clockPin, LSBFIRST,minutes);
shiftOut(dataPin, clockPin, LSBFIRST,seconds);
digitalWrite(latchPin, HIGH);
}