#include <SPI.h>
const int STCPPin = 4; // пин, управляющий выходной защёлкой
volatile int mode = 1;
const int mode_count = 5;
const int time_array[mode_count] = {1000, 800, 600, 400, 200};
void setup() {
pinMode(2, INPUT_PULLUP); // подтягивающий резистор на входе прерывания
attachInterrupt(0, IinterruptChangeMode, FALLING); //разрешение внешнего прерывания (вывод 2 Arduino UNO)
SPI.begin();
pinMode(STCPPin, OUTPUT);
digitalWrite(STCPPin, LOW);
SPI.transfer(0); //сброс всех выходов в ноль
digitalWrite(STCPPin, HIGH); //формирование фронта на выходную защелку
digitalWrite(STCPPin, LOW);
}
void IinterruptChangeMode() {
static unsigned long prev_millis;
if (prev_millis + 200 < millis()) {
++mode %= mode_count;
}
prev_millis = millis();
}
// Кольцевой сдвиг
void rotateLeft(uint16_t &bits) {
uint16_t high_bit = bits & (1 << 15) ? 1 : 0;
bits = (bits << 1) | high_bit;
}
void loop() {
static uint16_t nomad = 1; //активен только один светодиод
SPI.transfer(nomad / 256);
SPI.transfer(nomad % 256);
digitalWrite(STCPPin, HIGH); //формирование фронта на выходную защелку
digitalWrite(STCPPin, LOW);
rotateLeft(nomad); //сдвиг бита на один разрд
delay(time_array[mode]);
}