#define MR 13
#define SHCP 12
#define STCP 11
#define OE 10
#define DS 9
void SHCP_CLK(){ // захоплення DS в регістр зсуву
  digitalWrite( SHCP, HIGH );
  digitalWrite( SHCP, LOW );
}
void STCP_CLK(){ // перенос регістра зсуву в регістр збереження
  digitalWrite( STCP, HIGH );
  digitalWrite( STCP, LOW );
}
void MR_CLK(){ // скидання даних в 0
  digitalWrite(MR, LOW);
  digitalWrite(MR, HIGH);
}
// 255 - 0b11111111
//   0 - 0b00000000
//   1 - 0b00000001
//   2 - 0b00000010
//   3 - 0b00000011
//   4 - 0b00000100
void set_led(byte data) {
  //Serial.println( data, BIN );
  for (byte i=0; i<8; i++) {
    if ( (data & 0b10000000) >= 0b10000000 ) {
      digitalWrite(DS, HIGH);
    }
    else {
      digitalWrite(DS, LOW);
    }
    SHCP_CLK(); // захоплення DS в регістр зсуву
    data = data << 1;
  }
  STCP_CLK(); // перенос регістра зсуву в регістр збереження
}
void setup() {
  Serial.begin(115200);
  pinMode( MR, OUTPUT );
  pinMode( SHCP, OUTPUT );
  pinMode( STCP, OUTPUT );
  pinMode( OE, OUTPUT );
  pinMode( DS, OUTPUT );
  MR_CLK(); // обнулення
  digitalWrite( OE, LOW ); // включити виходи Q0-Q7
  digitalWrite(DS, 1);
  SHCP_CLK(); // захоплення DS в регістр зсуву
  SHCP_CLK(); // захоплення DS в регістр зсуву
  digitalWrite(DS, 0);
  SHCP_CLK(); // захоплення DS в регістр зсуву
  for (int i=0; i<5; i++) {
    SHCP_CLK(); // захоплення DS в регістр зсуву
  }
  SHCP_CLK(); // захоплення DS в регістр зсуву
  SHCP_CLK(); // захоплення DS в регістр зсуву
  STCP_CLK(); // перенос регістра зсуву в регістр збереження
  set_led( 0b10101010 ); // 170
  set_led( 170 ); // 170
  delay(500);
  set_led( 1 );
  delay(500);
  set_led( 2 );
}
void loop() {
  // put your main code here, to run repeatedly:
}