/*
   Arduino code for Individual control over each pin
   Support for 40+ 74HC595 8 bit shift registers
   http://bildr.org/2011/02/74hc595/
*/ 

#define DATA_PIN  8  // Pin connected to DS of 74HC595
#define LATCH_PIN 9  // Pin connected to STCP of 74HC595
#define CLOCK_PIN 10 // Pin connected to SHCP of 74HC595

// How many of the shift registers
#define NUM_SHIFT_REGS 2


const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;

bool registers[numOfRegisterPins];

bool pin_seg[8];
void clearRegisters();
void writeRegisters();
void send_Num(int digit);
void seg_pattern(unsigned int digit);

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  clearRegisters();
  writeRegisters();
}

bool toggle = false;

void loop() 
  {
    send_Num(0);
    writeRegisters();
  
  // toggle = !toggle;
  delay(1000);
}

void clearRegisters() {
  // Reset all register pins
  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    registers[i] = LOW;
  }
}

void setRegisterPin(int index, int value) {
  // Set an individual pin HIGH or LOW
  registers[index] = value;
}

void writeRegisters() {
  // Set and display registers
  digitalWrite(LATCH_PIN, LOW);

  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    digitalWrite(CLOCK_PIN, LOW);
    digitalWrite(DATA_PIN, registers[i]);
    digitalWrite(CLOCK_PIN, HIGH);
  }

  digitalWrite(LATCH_PIN, HIGH);
}
void seg_pattern(unsigned int digit)
{
 switch(digit)
 {
                case 0 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 0;pin_seg[7] = 0; break;
                case 1 :        pin_seg[0] = 0;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 0;pin_seg[7] = 0; break;
                case 2 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 0;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 0;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 3 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 4 :        pin_seg[0] = 0;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 5 :        pin_seg[0] = 1;pin_seg[1] = 0;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 6 :        pin_seg[0] = 1;pin_seg[1] = 0;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 7 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 0;pin_seg[7] = 0; break;
                case 8 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
                case 9 :        pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
    
 }
 }

void send_Num(int digit)
{
  int ones_digit, tens_digit, count;

   do {
    digit /= 10;
    ++count;
  } while (digit != 0);

  if(digit==1)
  {
    ones_digit = digit%10 ;
    tens_digit = digit%100 ;

    for(int i = 0; i<8; i++)
      {
        registers[i] = 0;
      }

    seg_pattern(ones_digit);

    for(int i = 8; i<16; i++)
      {
        registers[i] = pin_seg[i-8];
      }

  }
  else if (digit = 2)
  {
    seg_pattern(ones_digit);

    for(int i = 0; i<8; i++)
      {
        registers[i] = pin_seg[i];       
      }

    seg_pattern(tens_digit);

    for(int i = 8; i<16; i++)
      {
        registers[i] = pin_seg[i-8];
      }

  }
}
74HC595
74HC595