You are on page 1of 5

// Program to make a clock with time setting functionality.

#include<reg51.h>
sbit dig_ctrl_4=P0^0;
//Declare the control pins of the seven segment
sbit dig_ctrl_3=P0^1;
sbit dig_ctrl_2=P0^2;
sbit dig_ctrl_1=P0^3;
sbit reset=P1^4;
// Reset pin to reset the clock.
sbit start=P1^7;
//Start pin to start the clock after the time is set.
sbit incr=P1^6;
//Increment pin to increase the digits during time settin
g.
sbit set=P1^5;
// Set pin to set the time.
sbit beep=P3^0;
int sel_seg_to_incr=0;
int ret_seg_to_incre=0;
int recnt_incr_seg;
unsigned char dig_disp=0;
int min2=0;
int min1=0;
int sec2=0;
int sec1=0;
char dig_val[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};
//
to store values corresponding to digits 0 to 9
void delay(int a)
using Timer1.
{
int i;
for(i=0;i<a;i++)
{
TL1=0xFD;
TH1=0x4B;
TR1=1;
while(TF1==0);
TR1=0;
TF1=0;
}
}

// Function to provide a time delay of approx. 1 second

int setfn()
// Function to select minute and seconds digit to be set.
{
while(set==0)
{
switch(recnt_incr_seg)
{
case 1:
if(set==0)
//select the min2 digit
{
dig_ctrl_4=1;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=1;
ret_seg_to_incre=1;
P2=dig_val[min2];
delay(20);
}
case 2:
if(set==0)

// Select the min1 digit

{
dig_ctrl_4=0;
dig_ctrl_3=1;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=2;
ret_seg_to_incre=2;
P2=dig_val[min1];
delay(20);
}
case 3:
if(set==0)
//Select the sec 2 digit
{
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=1;
dig_ctrl_1=0;
recnt_incr_seg=3;
ret_seg_to_incre=3;
P2=dig_val[sec2];
delay(20);
}
case 4:
if(set==0)
//Select the sec1 digit
{
recnt_incr_seg=1;
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=1;
ret_seg_to_incre=4;
P2=dig_val[sec1];
delay(20);
recnt_incr_seg=1;
}
}
}
return(ret_seg_to_incre);
}
void increase(int a)
//Function to set the minute or seconds digit
{
while(incr==0)
{
switch(a)
{
case 1:
// To set the min2 digit.
P2=dig_val[min2];
//Display the value of min2
delay(15);
min2++;
if(min2==6)
min2=0;
P2=dig_val[min2];
delay(5);
break;
case 2:
//To set the min1 digit.
P2=dig_val[min1];

delay(15);
min1++;
if(min1==10)
min1=0;
P2=dig_val[min1];
delay(5);
break;
case 3:
// To set the sec2 digit.
P2=dig_val[sec2];
delay(15);
sec2++;
if(sec2==6)
sec2=0;
P2=dig_val[sec2];
delay(5);
break;
case 4:
//To set the sec1 digit.
P2=dig_val[sec1];
delay(15);
sec1++;
if(sec1==10)
sec1=0;
P2=dig_val[sec1];
delay(5);
break;
}
}
}
void resetfn()
// This function brings the clock to reset or set mode.
{
IE=0x80;
//Disable timer0 interrupt to stop the display of the clock
sel_seg_to_incr=1;
recnt_incr_seg=1;
dig_ctrl_4=1;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
P2=dig_val[min2];
delay(5);
while(1)
{
if(start==0)
//check if start pin is pressed
{
TMOD=0x11;
//reset the timer0
TL0=0xf6;
TH0=0xFf;
IE=0x82;
//enabling again the timer0 interrupt to start displ
aying of the clock
TR0=1;
break;
// break loop and return to main program
}
if(set==0)
//if set pin is pressed call set function
sel_seg_to_incr=setfn();
if(incr==0)
// if incr pin is pressed call incr function
increase(sel_seg_to_incr);

}
}
void display() interrupt 1
// function to display the values on seven seg
mnet. For more details refer seven segment multiplexing.
{
TL0=0x36;
//reloading timer0
TH0=0xf6;
P2=0xFF;
dig_ctrl_1 = dig_ctrl_3 = dig_ctrl_2 = dig_ctrl_4 = 0;
dig_disp++;
dig_disp=dig_disp%4;
switch(dig_disp)
{
case 0:
P2=dig_val[sec1];
dig_ctrl_1 = 1;
break;
case 1:
P2=
dig_val[sec2];
dig_ctrl_2 = 1;
break;
case 2:
P2=
dig_val[min1];
dig_ctrl_3 = 1;
break;
case 3:
P2=
dig_val[min2];
dig_ctrl_4 = 1;
break;
}
}
void main()
//main function the programs begins from here
{
set=1;
//delaring set, reset, start and incr as input pins
reset=1;
start=1;
incr=1;
TMOD=0x11;
//enabling timer0
TL0=0xf6;
//loading timer0
TH0=0xFf;
IE=0x82;
//initialize timer0 interrupt
TR0=1;
//triggering timer0
min2=0;
min1=0;
sec2=0;
sec1=0;
beep=1;
while(1)
//forward counting of clock
{
while(min2>=0)
{
if(min2==0 && min1 ==0 && sec2==0 && sec1 == 0)
{
break;
}
while(min1>=0)
{

while(sec2>=0)
{
while(sec1>=0)
{
if(reset==0)
resetfn();
if(min2==0 && min1 ==0 && sec2==0 && sec1==0)
{
beep=0;
delay(10);
beep=1;
delay(10);
beep=0;
delay(10);
beep=1;
delay(10);
beep=0;
delay(10);
beep=1;
delay(10);
beep=0;
delay(10);
beep=1;
}
delay(20);
sec1--;
}
sec1=9;
sec2--;
}
sec1=9;
sec2=5;
min1--;
}
sec1=9;
sec2=5;
min1=9;
min2--;
}
min2=0;
min1=0;
sec2=0;
sec1=0;
beep=1;
if(reset==0)
resetfn();
}
}

You might also like