#include <SPI.h>
#include <Bounce2.h>;
const int pinButton = 2;
int curButton = LOW;
int lastButton = LOW;
int dataPin = 11; //Пин подключен к DS входу 74HC595
int latchPin = 4; //Пин подключен к ST_CP входу 74HC595
int clockPin = 13; //Пин подключен к SH_CP входу 74HC595
// Создаем объект
Bounce debouncer = Bounce();
void setup() { //устанавливаем режим OUTPUT
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(pinButton, INPUT_PULLUP);
// Даем бибилотеке знать, к какому пину мы подключили кнопку
debouncer.attach(pinButton);
debouncer.interval(5); // Интервал, в течение которого мы не буем получать значения с пина
}
int countButtonPressed = 0;
bool isToSecondSPI = false;
int myDelay = 100;
void setDelay(const int& countButtonPressed)
{
switch (countButtonPressed)
{
case 1:
myDelay = 500;
break;
case 2:
myDelay = 1000;
break;
default:
myDelay = 100;
}
}
void checkDebounce()
{
debouncer.update();
int curButton = debouncer.read();
if (curButton == LOW && lastButton == HIGH)
{
if (countButtonPressed > 2)
{
countButtonPressed = 0;
}
++countButtonPressed;
setDelay(countButtonPressed);
}
lastButton = curButton;
}
void loop() {
byte byteToSend = 0; //Создаем пустой байт B00000000
if (!isToSecondSPI)
{
for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита
byteToSend = 0; // Обнуляем байт при каждом проходе
bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
digitalWrite(latchPin, LOW); // Открыли регистр
shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // передаем последовательно на dataPin - в первом регистре значение B01001100
bitWrite(byteToSend, bitPos, LOW); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
digitalWrite(latchPin, HIGH); /// Закрываем регистр тем самым передаем значение на выводы
checkDebounce();
delay(myDelay);
if (bitPos == 7)
{
isToSecondSPI = !isToSecondSPI;
}
}
}
else
{
for (int bitPos = 7; bitPos > -1; bitPos--) { // В переменной хранится позиция изменяемого бита
byteToSend = 0; // Обнуляем байт при каждом проходе
bitWrite(byteToSend, bitPos, LOW); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
digitalWrite(latchPin, LOW); // Открыли регистр
shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // передаем последовательно на dataPin - в первом регистре значение B01001100
bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
digitalWrite(latchPin, HIGH); /// Закрываем регистр тем самым передаем значение на выводы
checkDebounce();
delay(myDelay);
if (bitPos == 7)
{
isToSecondSPI = !isToSecondSPI;
}
}
}
}