shiftOut() / Arduino
Описание
Сдвигает бит данных по одному биту за раз. Начинает с самого старшего (т.е. самого левого) или самого младшего (самого правого) значащего бита. Каждый бит записывается поочередно на вывод данных, после чего на тактовом выводе выдается импульс (сначала высокий логический уровень, потом низкий), чтобы указать, что бит доступен.
Обратите внимание: если в взаимодействуете с устройством, которое синхронизируется по нарастающим фронтам, перед первым вызовом shiftOut()
вам нужно убедиться, что на тактовом выводе низкий логический уровень, например, вызвав digitalWrite(clockPin, LOW)
.
Примечание: это программная реализация; Arduino также предоставляет библиотеку SPI, которая использует аппаратную реализацию, которая работает быстрее, но работает только на определенных выводах.
Синтаксис
shiftOut(dataPin, clockPin, bitOrder, value)
Параметры
dataPin
: вывод, на который выдается каждый бит (int
).
clockPin
: вывод для переключения, как только dataPin
был установлен в корректное значение (int
).
bitOrder
: в каком порядке сдвигать биты; либо MSBFIRST
, либо LSBFIRST
. (Most Significant Bit First (самый старший значащий бит первый) или Least Significant Bit First (самый младший значащий бит первый)).
value
: данные для сдвига (byte
).
Возвращает
Ничего.
Пример кода
Управление сдвиговым регистром 74HC595
// Вывод, подключенный к ST_CP 74HC595
int latchPin = 8;
// Вывод, подключенный к SH_CP 74HC595
int clockPin = 12;
// Вывод, подключенный к DS 74HC595
int dataPin = 11;
void setup()
{
// настраиваем выводы на выход, поскольку они используются в основном цикле
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
// подсчет
for (int j = 0; j < 256; j++)
{
// замыкаем latchPin на землю и удерживаем низкий уровень, пока передаются данные
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, j);
// возвращаем вывод защелки в высокое логическое состояние, чтобы дать микросхеме знать,
// что больше не требуется слушать данные.
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
Примечания и предупреждения
Выводы dataPin
и clockPin
должны быть уже настроены на выход вызовом pinMode()
.
shiftOut
в настоящее время написана для вывода одного байта (8 бит), поэтому для вывода значений больше 255 требуется двухшаговая операция.
// Для последовательности MSBFIRST
int data = 500;
// сдвиг старшего байта
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// сдвиг младшего байта
shiftOut(dataPin, clock, MSBFIRST, data);
// Или для последовательности LSBFIRST
data = 500;
// сдвиг младшего байта
shiftOut(dataPin, clock, LSBFIRST, data);
// сдвиг старшего байта
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));