const int dataPin = 3; // Пин данных для 74HC595
const int clockPin = 4; // Пин тактового сигнала для 74HC595
const int latchPin = 5; // Пин захвата для 74HC595 1
const int BTN = 13; // Пин кнопки
int i1 = 0;
int i2 = 0;
uint64_t timebtn = millis();
uint64_t time1 = millis();
uint64_t time2;
uint64_t time3 = 0;
uint64_t time4 = 0;
int timer = 100; //0.1 sec
int timer1 = 100; //0.5 sec
bool btn_state = 0;
byte firstByte = 0x00;
byte secondByte = 0x00;
// byte thirdByte = 0x00;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(BTN, INPUT); //ATTINY НЕ ИМЕЕТ ПОДТЯЖКИ, ПОЭТОМУ СЮДА РЕЗЮК НА 10к К ЗЕМЛЕ!
}
void loop() {
if (millis() - timebtn >= timer) {
btn_state = digitalRead(BTN); //1 ON 0 OFF
timebtn = millis();
}
// Заполнение первого байта поочередно единицами
else if (btn_state == 1) {
if (millis() - time1 >= timer1 && i1 < 8) {
firstByte |= (1 << i1);
shiftOutData(firstByte, secondByte);
i1++;
time1 = millis();
if (firstByte == 0xFF) {
time2 = millis();
}
}
else if (millis() - time2 >= timer1 && firstByte == 0xFF && i2 < 8) {
secondByte |= (1 << i2);
shiftOutData(firstByte, secondByte);
i2++;
time2 = millis();
}
}
else if (btn_state == 0 && secondByte != 0x00) {
if (firstByte == 0xFF) {
if (millis() - time3 >= timer1 && i2 >= 0) {
secondByte &= ~(1 << i2);
shiftOutData(firstByte, secondByte);
i2--;
time3 = millis();
if(i2 == 0){
time4 = millis();
}
}
}
}
else if (btn_state == 0 && secondByte == 0x00) {
if (millis() - time4 >= timer1 && i1 >= 0) {
firstByte &= ~(1 << i1);
shiftOutData(firstByte, secondByte);
i1--;
time4 = millis();
}
}
}
void shiftOutData(byte data1, byte data2) {
// Передача данных через shiftOut
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data2);
shiftOut(dataPin, clockPin, MSBFIRST, data1);
digitalWrite(latchPin, HIGH);
}