You are on page 1of 5

#include

#include
#include
#include
boolean

<WProgram.h>
<Wire.h>
<DS1307.h>
<Debounce.h>
pinstate = true;

byte num_array[11]={//This array has all of the number codes


B00111111,B0000110,B01011011,B01001111,B01100110,B01101101,B01111101,B00000111
,B01111111,B01101111,0};
int rtc[7];//this array is for the data from the RTC
/*Some output definitions*/
int dots_1 = 8;
int dots_2 = 9;
int reset_pin = 10;
int clock_pin = 11;
int date = 14;
int up = 15;
int down = 16;
int set = 17;
int dummy[7];
int display_time[6];
int display_date[6];
int position = 0;
int blink_dots = 0;
/*For buttom debouncing*/
Debounce DATE = Debounce(20,date);
Debounce SET = Debounce (20,set);
Debounce UP = Debounce(20,up);
Debounce DOWN = Debounce(20,down);
void setup(){
/*Setting outputs*/
DDRD=B11111111;
pinMode(clock_pin,OUTPUT);
pinMode(reset_pin,OUTPUT);
pinMode(dots_1,OUTPUT);
pinMode(dots_2,OUTPUT);
digitalWrite(reset_pin,HIGH);//reseting the 4017 counter
digitalWrite(reset_pin,LOW);
digitalWrite(dots_1,HIGH);//turning on the dots
digitalWrite(dots_2,HIGH);
}
void loop(){
RTC.get(rtc,true);//get the data form the RTC IC
for(int x = 0; x < 7; x++)
dummy[x] = rtc[x];//store it in the dummy array for modification
dummy[6]=dummy[6]-2000;//Changing to year so that it will be displayed in 2 di
gits
display_time[0] = dummy[2]/10;//Getting the hours (LOW number)
display_time[1] = dummy[2] - (display_time[0] * 10) ;//Getting the hours (HIGH
number)
display_time[2] = dummy[1]/10;//Getting the minutes (LOW number)
display_time[3] = dummy[1] - (display_time[2] * 10) ;//Getting the minutes (HI
GH number)
display_time[4] = dummy[0]/10;//Getting the seconds (LOW number)
display_time[5] = dummy[0] - (display_time[4] * 10) ;//Getting the seconds (HI
GH number)
if(blink_dots != display_time[5]){//blink the dots every second
pinstate = !pinstate;// toggle the dots state

digitalWrite(dots_1,pinstate);
digitalWrite(dots_2,pinstate);
blink_dots = display_time[5] ;//update the seconds
}
for(int y = 0; y < 6; y++){//The main display loop(goes over the 6 digits
DATE.update();//read the DATE button
SET.update();//read the SET button
if(SET.read() == HIGH)//If set is pressed go to the setting time mode
set_time();
if(DATE.read() == HIGH)//If data is pressed show the data
show_date();
if(position == 6){//If the counter gets to the sixth output reset it
digitalWrite(reset_pin,HIGH);//utputing a reset signal to the 4017 counter
digitalWrite(reset_pin,LOW);
position = 0;//staring the count over
}
PORTD = num_array[display_time[y]];//outout the digit to be displayed
delayMicroseconds(800);//wait so that the human eye can see the lights
PORTD = 0;//turn off the display to make sure we don't have a ghosting effec
t
digitalWrite(clock_pin,HIGH);//give a pulse to the clock pin of the 4017
digitalWrite(clock_pin,LOW);
position++;//increment the position
}
}
void show_date(){//this function show the date if the DATA button was pressed
int position_3 = 0;
/*Turn off the upper dots so that the user will know he is in the date mode*/
digitalWrite(reset_pin,HIGH);
digitalWrite(reset_pin,LOW);
digitalWrite(dots_1,HIGH);
digitalWrite(dots_2,LOW);
RTC.get(rtc,true);//get the current time data, same as in the main loop
for(int a = 0; a < 7; a++)
dummy[a] = rtc[a];
dummy[6]=dummy[6]-2000;
display_date[0] = dummy[4]/10;//lower day
display_date[1] = dummy[4] - (display_date[0] * 10) ;//upper day
display_date[2] = dummy[5]/10;//lower month
display_date[3] = dummy[5] - (display_date[2] * 10) ;//upper month
display_date[4] = dummy[6]/10;//uuper year
display_date[5] = dummy[6] - (display_date[4] * 10) ;//lower year
for(int DELAY = 0; DELAY < 400; DELAY++){//This loop , loops over the same dat
a to get a delay
for(int y = 0; y < 6; y++){//This loops is the same as the in the main loop
if(position_3 == 6){
digitalWrite(reset_pin,HIGH);
digitalWrite(reset_pin,LOW);
position_3 = 0;
}
PORTD = num_array[display_date[y]];
delayMicroseconds(800);
PORTD = 0;
digitalWrite(clock_pin,HIGH);
digitalWrite(clock_pin,LOW);
position_3++;
}
}

digitalWrite(dots_2,HIGH);
}
void set_time(){//This function is for setting the time and date
int set_array[6];
int tag=0;
byte pinmode = LOW;
int time_mode = 0;
delay(500);//A small delay so the user wouldn't exit the function if he still
presses the button
digitalWrite(dots_1,HIGH);//turn on both of the dots
digitalWrite(dots_2,HIGH);
RTC.get(rtc,true);//get the RTC data
for(int g = 0; g < 7; g++)
dummy[g] = rtc[g];//put it in to a dummy array
dummy[6]=dummy[6]-2000;//get the year in 2 numbers and not 4
while(pinmode == LOW){//while the set button wasn't pressed again stay in this
loop
DATE.update();//read the DATE button
if(DATE.read() == HIGH){
time_mode++;//If it was pressed go over the modes (seconds,mins,hours etc.
.)
delay(250);//a small delay so you wouldn't go over all of the modes
}
switch (time_mode){//goes to the right setting
case 0://This is for the hours
digitalWrite(dots_2,HIGH);//makes sure the upper dots are on so that the u
ser will know he is in the time mode and not the data
UP.update();//read the buttons
DOWN.update();
if(UP.read() == HIGH){
dummy[2]++;//increment the time if the up button was pressed
}
if(DOWN.read() == HIGH){
dummy[2]--;//decrement the time if the down button was pressed
}
if(dummy[2] == -1)//makes sure you stay in the 24 hours range
dummy[2] = 23;
if(dummy[2] == 24)
dummy[2] = 0;
set_array[0] = dummy[2]/10;//update the display
set_array[1] = dummy[2] - (set_array[0] * 10) ;
set_array[2] = 10;//turn off the other digits
set_array[3] = 10;
set_array[4] = 10;
set_array[5] = 10;
time_set_display(set_array);//displays the time on the dispay
break;
case 1: // same as case 0 but for the minuts
UP.update();
DOWN.update();
if(UP.read() == HIGH){
dummy[1]++;
}
if(DOWN.read() == HIGH){
dummy[1]--;
}
if(dummy[1] == -1)
dummy[1] = 59;

if(dummy[1] == 60)
dummy[1] = 0;
set_array[0] = 10;
set_array[1] = 10;
set_array[2] = dummy[1]/10;
set_array[3] = dummy[1] - (set_array[2]
set_array[4] = 10;
set_array[5] = 10;
time_set_display(set_array);
break;
case 2://this is for the day of the month
digitalWrite(dots_2,LOW);//turn off the
now he is the date setting mode
UP.update();
DOWN.update();
if(UP.read() == HIGH){
dummy[4]++;
}
if(DOWN.read() == HIGH){
dummy[4]--;
}
if(dummy[4] == -1)
dummy[4] = 32;
if(dummy[4] == 33)
dummy[4] = 0;
set_array[0] = dummy[4]/10;
set_array[1] = dummy[4] - (set_array[0]
set_array[2] = 10;
set_array[3] = 10;
set_array[4] = 10;
set_array[5] = 10;
time_set_display(set_array);
break;
case 3://months here
UP.update();
DOWN.update();
if(UP.read() == HIGH){
dummy[5]++;
}
if(DOWN.read() == HIGH){
dummy[5]--;
}
if(dummy[5] == -1)
dummy[5] = 12;
if(dummy[5] == 13)
dummy[5] = 0;
set_array[0] = 10;
set_array[1] = 10;
set_array[2] = dummy[5]/10;
set_array[3] = dummy[5] - (set_array[2]
set_array[4] = 10;
set_array[5] = 10;
time_set_display(set_array);
break;
case 4://years here
UP.update();
DOWN.update();
if(UP.read() == HIGH){
dummy[6]++;
}

* 10);

upper dots so that the user will k

* 10);

* 10);

if(DOWN.read() == HIGH){
dummy[6]--;
}
if(dummy[6] == -1)
dummy[6] = 99;
if(dummy[6] == 100)
dummy[6] = 0;
set_array[0] = 10;
set_array[1] = 10;
set_array[2] = 10;
set_array[3] = 10;
set_array[4] = dummy[6]/10;
set_array[5] = dummy[6] - (set_array[4] * 10);
time_set_display(set_array);
break;
case 5:
time_mode = 0;//loop the modes over
break;
}
SET.update();//update the SET button
pinmode = SET.read();If it was pressed you will exit the while loop
}
//This is the function to update the RTC
RTC.stop();
RTC.set(DS1307_MIN,dummy[1]);
RTC.set(DS1307_HR,dummy[2]);
RTC.set(DS1307_DATE,dummy[4]);
RTC.set(DS1307_MTH,dummy[5]);
RTC.set(DS1307_YR,dummy[6]);
RTC.start();
digitalWrite(dots_2,HIGH);
delay(200);
}
void time_set_display(int data_array[]){//This fnction just displays 2 digits an
d it's pretty much the same as the display loop in the main function
int position_2 = 0;
digitalWrite(reset_pin,HIGH);
digitalWrite(reset_pin,LOW);
for(int xlk=0;xlk<25;xlk++){//a delay loop
for(int j = 0; j < 6; j++){
if(position_2 == 6){
digitalWrite(reset_pin,HIGH);
digitalWrite(reset_pin,LOW);
position_2 = 0;
}
PORTD = num_array[data_array[j]];
delayMicroseconds(800);
PORTD = 0;
digitalWrite(clock_pin,HIGH);
digitalWrite(clock_pin,LOW);
position_2++;
}
}
}

You might also like