#define clock 4
#define data 16
#define latch 17
#define cyfry 1 // ilosc 7-segmentowek


void intToBCD (int input, unsigned char *output){
    for (int i=0; i<cyfry; i++){ //ile cyfr w liczbie możemy wyświetlić
        output[i] = input%10; // modulo 10 zwraca cyfre jednosci
        input /= 10; //dzielac przez 10 w nastepnej iteracji cyfra dziesiatek stanie się jednosciami
    }
}

void BCDToHEX(unsigned char *input, unsigned char *output){
    unsigned char hexValues[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //bez kropki
    for (int i=0; i<cyfry; i++){ //tutaj są tylko zakodowane które segmenty powinny się świecić dla której cyfry
        output[i] = hexValues[input[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);
      digitalWrite(5, HIGH);
      digitalWrite(18, LOW);
  }
}

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

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

  unsigned char binarka[cyfry]; //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[cyfry];  // przechowuje cyfry jednego integera
  for (int i = 0; i < cyfry; 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);
  pinMode(5, OUTPUT);
  pinMode(18, OUTPUT);

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

}

int x = 0;

void loop() {

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