Симулятор 74HC595 онлайн: соберите сдвиговый регистр без железа
74HC595 стоит копейки, но понимание приходит только когда видишь такты: что shiftOut кладёт на DS каждый такт, когда байт оказывается на выходах и почему без защёлки Q0-Q7 мелькают промежуточными байтами. На макетке для этого нужны сам регистр, восемь резисторов, восемь светодиодов и терпение; в браузере — вставить скетч и нажать «Запуск».
В нашем симуляторе карточка регистра собирается сама, как только скетч вызывает shiftOut: восемь светодиодов Q0-Q7, статус защёлки и битовый дамп. Ниже — что именно видно в карточке, два скетча-эксперимента с проверенными числами и честная граница: что браузерная проверка заменяет, а что нет.
Что появляется в симуляторе
- Карточка «Сдвиговый регистр 74HC595» с пинами DS, SHCP и STCP — они связываются с первого вызова shiftOut в скетче.
- Восемь светодиодов Q0-Q7: горят ровно по битам защёлкнутого байта, с подсветкой.
- Статус защёлки: «ждёт latch (STCP HIGH)…», пока байт сдвигается, и «защёлкнуто» после фронта STCP.
- Битовый дамп: 0b и восемь цифр плюс десятичное значение — сверяете с ожиданием без калькулятора.
- Такты DS и SHCP видны и на обычных ножках пинов 8-9: это обычные OUTPUT-линии, дёргаемые shiftOut.
Скетч 1: двоичный счётчик 0-255
Минимальный рабочий скетч: защёлку вниз, shiftOut, защёлку вверх — и так по кругу. В карточке бинарная бегущая строка: 0b00000000, 0b00000001, 0b00000010… Q0 — младший бит, Q7 — старший. Счётчик хорош тем, что показывает роль каждого пина: уберите строку с фронтом STCP — статус навсегда останется «ждёт latch», а светодиоды замрут.
const byte PIN_DS = 8; // DS — данныеconst byte PIN_SHCP = 9; // SHCP — такт сдвигаconst byte PIN_STCP = 10; // STCP — защёлка int schetchik = 0; void setup() { pinMode(PIN_DS, OUTPUT); pinMode(PIN_SHCP, OUTPUT); pinMode(PIN_STCP, OUTPUT); Serial.begin(9600);} void loop() { digitalWrite(PIN_STCP, LOW); // готовим защёлку shiftOut(PIN_DS, PIN_SHCP, MSBFIRST, schetchik); // 8 тактов digitalWrite(PIN_STCP, HIGH); // фронт: байт на Q0-Q7 Serial.print("na vyhodu: "); Serial.println(schetchik); schetchik = (schetchik + 1) & 0xFF; // кольцо 0..255 delay(300);}Эксперимент: MSBFIRST против LSBFIRST
Поменяйте в скетче MSBFIRST на LSBFIRST — и тот же байт появится на выходах зеркально: 0b10110001 (это 177) прочитается как 0b10001101 (141). Числа проверены на рантайме симулятора: MSBFIRST кладёт старший бит первым, LSBFIRST превращает байт в отражение. Здесь же наглядно видны все восемь тактов: карточка ещё «ждёт latch», а биты уже проезжают по сдвиговому регистру — именно это мелькание на реальной макетке и путает новичков, когда защёлка не подключена.
Шаг скетча — что происходит с байтом
| Строка скетча | Что происходит | Что видите в карточке |
|---|---|---|
| digitalWrite(STCP, LOW) | защёлка открыта к приёму | статус «ждёт latch (STCP HIGH)…» |
| shiftOut(DS, SHCP, MSBFIRST, b) | 8 тактов: бит за битом в сдвиговый регистр | светодиоды ещё не меняются |
| digitalWrite(STCP, HIGH) | фронт: байт защёлкнулся на выходах | Q0-Q7 перерисовались, дамп 0b обновился |
| delay(300) | картинка держится | можно сверить дамп с монитором порта |
Четыре грабли, которые ловятся прямо в дампе
- Статус навсегда «ждёт latch (STCP HIGH)…», светодиоды не двигаются: защёлка не дёргается — проверьте, что digitalWrite фронтом HIGH уходит именно на пин STCP, а не на соседний.
- Дамп показывает нули или мусор при живом shiftOut: перепутаны DS и SHCP местами — такты уходят в линию данных, а биты — в тактовую. Поменяйте два провода (или два аргумента) и дамп оживёт.
- Байт на выходах «не тот, но похож» — сравните по цифрам: 0b10110001 вместо 0b10001101 — это не проводка, а порядок битов: MSBFIRST стоит там, где нужен LSBFIRST.
- Светодиоды перерисовываются «плавно», по одному биту: вы защёлкиваете каждый такт — фронт STCP должен быть один, после всех восьми тактов.
Чем браузерная проверка заменяет макетку, а чем нет
Заменяет: семантику shiftOut — восемь тактов и порядок битов, роль защёлки, чтение битового дампа, отладку логики (маски, волновые эффекты, счётчики). Код из симулятора переносится на реальную плату без правок — shiftOut в браузере работает по тем же правилам, что и в железе. Не заменяет: электрику — токи на выходах, резисторы на светодиодах, подтяжку OE и MR, помехи на длинных проводах. Сам регистр — рантаймный компонент: в палитре «Макетка» его карточки нет, она собирается из скетча. Обычные светодиоды, кнопки и потенциометры для окружения берите из палитры «Макетка». Если нужен полный разбор подключения на реальной плате — он в лендинге про сдвиговый регистр; а если сравниваете инструменты, у нас есть обзор Wokwi на русском.