@Irinka, я не большой специалист в этой микросхеме, но думаю, что заводить пин 15 на землю - очень плохая идея. Он нужен, чтобы не было ложных сдвигов.
У меня отлично работает вот такой
скетч
static constexpr uint8_t pinINH = 4;
static constexpr uint8_t pinCLK = 5;
static constexpr uint8_t pinSHLD = 6;
static constexpr uint8_t pinSO = 7;
inline void clkHIGH(void) { digitalWrite(pinCLK, HIGH); }
inline void shldLOW(void) { digitalWrite(pinSHLD, LOW); }
inline void shldHIGH(void) { digitalWrite(pinSHLD, HIGH); }
inline void inhLOW(void) { digitalWrite(pinINH, LOW); }
inline void inhHIGH(void) { digitalWrite(pinINH, HIGH); }
inline void shldTICK(void) { shldLOW(); shldHIGH(); }
uint8_t readData(void) {
shldTICK();
clkHIGH();
inhLOW();
const uint8_t result = shiftIn(pinSO, pinCLK, MSBFIRST);
inhHIGH();
return result;
}
void setup(void) {
pinMode(pinINH, OUTPUT);
inhHIGH();
pinMode(pinCLK, OUTPUT);
pinMode(pinSHLD, OUTPUT);
shldHIGH();
pinMode(pinSO, INPUT);
Serial.begin(9600);
Serial.println("Let's go on!");
}
void loop(void) {
static uint8_t oldValue = 0;
const uint8_t value = readData();
if (value != oldValue) {
Serial.print((value < 16) ? "0x0" : "0x");
Serial.println(value, HEX);
oldValue = value;
}
}
При вот такой
Всё показывает, при включении/выключении того или иного тумблера адекватно новое значение выводит.
А если убрать всю работу с INH и притянуть его к земле - тут же начинает лишний бит читать, попробуйте.