
/*****************************************/
/*			 0000 to 9999 Display		 */
/*			 with 4094					 */
/*           12:36 PM 1/10/2012          */
/*****************************************/
#include <reg52.h> 

unsigned char buffer[5];
unsigned int num1,num2,num3,num4,num5,test=0;
unsigned int num=0;

sbit CLK    = P2^1;
sbit DIN    = P2^0;
sbit strobe = P2^2;
											
sbit up    = P1^0;
sbit down  = P1^1;
sbit reset = P1^2;
sbit set   = P1^3;

char code segment[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};

void delay(int num)   // timer 							
{ 
	int i;
	for(i=0;i<num;i++)
	{	
		TH0=0xfc;
		TL0=0x67;
	}	 
}


void write_led()
{
     char i,j;

	 for(j=0; j<5; j++)
	 {
	 for(i=0;i<8; i++)
    	 {
           if(buffer[j]&0x80) DIN = 1; 
           else DIN=0; 
           CLK= 1; 
           buffer[j] <<=1; 
           CLK = 0;
	     }
	 }
	strobe = 1;
    ;
    strobe = 0;
}	    

void move_Buffer()
{
    buffer[0] = segment[num1%10];
    buffer[1] = segment[num2%10];
    buffer[2] = segment[num3%10];
    buffer[3] = segment[num4%10];
    buffer[4] = segment[num5%10];
}
								
void updatedisplay()
{
       move_Buffer();
       write_led();
}

void counter()
   {
  if(up==0&&down==1)                                 //check if up pin is pressed
     {
   test++;
        num=test;
	    num1=num%10;
      num=num/10;
        num2=num%10;
      num=num/10;
        num3=num%10;
      num=num/10;
        num4=num%10;
      num5=num/10;
      if(test==99999)
     test=0;
    }
    if(up==1&&down==0)                         //check if down pin is pressed
    {
   test--;
        num=test;
		num1=num%10;
      num=num/10;
        num2=num%10;
      num=num/10;
        num3=num%10;
      num=num/10;
        num4=num%10;
      num5=num/10;
     if(test==0)
     test=99999;
  }
}
  
void re()                                             // reset display
{
  if (reset==0)
  num1=num2=num3=num4=num5=0;
 }

void timer_isr(void) interrupt 1 using 1
{
    counter();
	re();
	delay(10000);
    updatedisplay();
}

void main()
{
  TMOD = 0x01;
  EA   = 1;
  ET0  = 1;
  TR0  = 1;
  up   = 1;
  down = 1;
  reset= 1;
  set  = 1;

}

