Главная chevron_right Функции chevron_right Расширенный ввод/вывод chevron_right shiftIn()

shiftIn()

shiftIn() считывает один байт побитово с цифрового вывода, тактируя каждый бит вручную — порядок битов задаётся параметром bitOrder (MSBFIRST или LSBFIRST).

Полная статья

Описание

shiftIn() принимает ровно 8 бит данных с вывода данных, тактируя каждый бит вручную через отдельный тактовый вывод. Порядок чтения задаётся параметром bitOrder: можно начинать со старшего бита (MSBFIRST) или с младшего (LSBFIRST). Алгоритм работы прост — для каждого из восьми бит функция поднимает тактовый вывод в высокий уровень, считывает текущее состояние линии данных, затем возвращает тактовый вывод в низкий уровень.

Это чисто программная реализация последовательного протокола. Она удобна, когда нужно подключить сдвиговый регистр или другой чип с последовательным интерфейсом к любым цифровым выводам платы. Если скорость критична, обратите внимание на аппаратный SPI: библиотека SPI работает значительно быстрее, но требует использования строго определённых выводов платы.

Важно: shiftIn() тактирует данные по нарастающему фронту. Если подключённое устройство ожидает именно такой фронт, перед первым вызовом функции убедитесь, что тактовый вывод находится в низком уровне — иначе первый импульс окажется некорректным. Сделать это можно вызовом digitalWrite(clockPin, LOW) сразу после настройки выводов.

Синтаксис

byte incoming = shiftIn(dataPin, clockPin, bitOrder)

Параметры

  • dataPin — цифровой вывод, с которого считываются данные. Тип: int.
  • clockPin — цифровой вывод тактового сигнала. Тип: int.
  • bitOrder — порядок битов при чтении:
  • MSBFIRST — первым читается старший (левый) бит;
  • LSBFIRST — первым читается младший (правый) бит.

Правильный выбор bitOrder критически важен: если он не совпадает с тем, что ожидает ваше устройство, принятый байт окажется «зеркальным» — биты будут переставлены в обратном порядке.

Возвращает

Значение типа byte — целое число от 0 до 255, собранное из 8 последовательно считанных бит.

Пример кода

#define DATA_PIN  4    // Пин подключён к выходу последовательных данных 
#define CLOCK_PIN 5    // Пин подключён к входу тактового сигнала (CLK)

void setup() {
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  // Считываем 8 бит с линии данных с помощью shiftIn()
  byte dataByte = shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);

  // Выводим байт в двоичном формате
  Serial.print("Received Byte: ");
  Serial.println(dataByte, BIN);

  delay(1000); // Пауза перед следующим считыванием
}

Практические замечания

  • Инициализация тактового вывода. Перед первым вызовом shiftIn() всегда явно устанавливайте низкий уровень на тактовом выводе через digitalWrite(clockPin, LOW). Без этого шага начальное состояние вывода непредсказуемо, и первый принятый бит может оказаться ошибочным.
  • Скорость работы. Программная реализация заметно медленнее аппаратного SPI. Если вы опрашиваете устройство в быстром цикле или работаете с несколькими микросхемами, рассмотрите переход на библиотеку SPI.
  • Совместное использование с shiftOut(). В типичной схеме со сдвиговым регистром shiftIn() работает в паре с shiftOut() — одна функция отправляет данные, другая принимает. Оба вывода данных при этом могут быть разными, а тактовый вывод — общим.
  • Отладка. Если принятые значения выглядят неправильно, проверьте в первую очередь bitOrder и начальный уровень тактового вывода — это две наиболее частые причины ошибок при работе с shiftIn().

Полезные материалы