#define clock 4 //left led
#define data 16 //middle led
#define latch 17 //right led

void intToBCD (int input, unsigned char *result){
    for (int i=0; i<8; i++){
        result[i] = input%10;
        input /= 10;
        // printf("result[%d] = %d\n",i,result[i]);
    }
}

void BCDToHEX(unsigned char *bcd, unsigned char *disp){
    unsigned char hexValues[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; 
    for (int i=0; i<8; i++){
        disp[i] = hexValues[bcd[i]];
        // printf("disp[%d] = 0x%02x\n",i,disp[i]);
    }
}

void HEXToBits(unsigned char hex, unsigned char *bity){
  for (int i=0; i<8; i++){ //dzielimy wartosc na bity
    bity[i] = hex%2;
    hex /= 2;
  }
}

void dataOut (int clockpin, int datapin, unsigned char *result){
  for (int i = 0; i<8; i++){ //podawanie pojedynczych bitow na data i synchro z clock
    int state;
    (result[7-i] == 1) ? state = 1 : state = 0;
      digitalWrite(datapin, state);
      digitalWrite(clockpin, HIGH);
      digitalWrite(clockpin, LOW);
  }
}

void shiftReg(int clockpin, int datapin, int latchpin, int number){
  //alpha male function instead of pussy libraries

  unsigned char osobne[8]; //moze przechowac 8 integerow
  intToBCD(number, osobne); //dzieli duzego int na osobne cyfry

  unsigned char binarka[8]; //przechowuje 8 hexow
  BCDToHEX(osobne,binarka); //przypisuje hexy osobnym cyfrom
  
  digitalWrite(clock, LOW); //inicjalizacja zeby shift register zaczal sluchac
  digitalWrite(latch, LOW);
  
  unsigned char result[8];  // przechowuje binarna wartosc jednego integera
  for (int i = 0; i < 2; i++){
    HEXToBits(binarka[i], result); //converts hex value into singular bits to be later displayed
    dataOut(clockpin, datapin, result);
  }

  digitalWrite(latch, HIGH);
  digitalWrite(data, LOW); //koniec sluchania, wyswietl


}

void setup() {
  Serial.begin(115200);
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);

  int x = 0;
  shiftReg(clock, data, latch, x);

}

int x = 0;

void loop() {

  int x=0;
  while(1){
    shiftReg(clock, data, latch, x);
    x+=1;
    delay(1000);
  }
  
  delay(10);
}
74HC595
74HC595
74HC595
74HC595
74HC595
74HC595
74HC595
74HC595
74HC595