Два сдвиговых регистра 74HC595
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Горит проэкт, нужно срочно отдать, а запоролся на мелочи, или не мелочи, не знаю.
К ардуинке подключены два сдвиговых регистра 74HC595 по примеру как на сайте http://ardushop.ru/kak-podklyuchit-sdvigoviy-registr-k-arduino/
и две кнопки
Cкетч заливаю с сайта:
//Пин SH_CP int SH_CP = 4; //Пин ST_CP int ST_CP = 3; //Пин DS int DS = 2; void setup() { // Настраиваем выходы SH_CP, ST_CP, DS pinMode(SH_CP, OUTPUT); pinMode(ST_CP, OUTPUT); pinMode(DS, OUTPUT); } void loop() { // Цикл обхода 16 светодиодов for (int i = 0; i < 16; i++) { // Запись в регистр registerWrite(i, HIGH); // Задержка 0.5 с. delay(500); // Отключение предыдущего светодиода if (i > 0) { registerWrite(i - 1, LOW); } // Отключение последнего светодиода // ("предыдущий" для первого" else { registerWrite(15, LOW); } } } // Метод для отсылки данных в регистры void registerWrite(int num, int state) { // Для хранения 16 битов используется unsigned int unsigned int bitsToSend = 0; // 0b000000000000000 // Инициализируем начало приема данных digitalWrite(ST_CP, LOW); // Устанавливаем 1 в соответствующий бит bitWrite(bitsToSend, num, state); // 16 бит необходимо разделить на два байта: // И записать каждый байт в соответствующий регистр byte register1 = highByte(bitsToSend); byte register2 = lowByte(bitsToSend); // Последовательная передача данных на пин DS shiftOut(DS, SH_CP, MSBFIRST, register2); shiftOut(DS, SH_CP, MSBFIRST, register1); // Инициализируем окончание передачи данных. // Регистры подадут напряжение на указанные выходы digitalWrite(ST_CP, HIGH); }
Работает зараза, светодиоды мигают по-очереди.
Но когда заливаю свой:
int i=0; int a=0; int stope=0; //Пин SH_CP int SH_CP = 4; //Пин ST_CP int ST_CP = 3; //Пин DS int DS = 2; const int buttonPin1 = 9; const int buttonPin2 = 10; const int buttonPin3 = 11; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int a1=0; int a2=0; int flag1=1; int flag2=1; int flag3=1; void setup() { // Настраиваем выходы SH_CP, ST_CP, DS pinMode(SH_CP, OUTPUT); pinMode(ST_CP, OUTPUT); pinMode(DS, OUTPUT); pinMode(buttonPin1, INPUT); pinMode(buttonPin2, INPUT); pinMode(buttonPin3, INPUT); } void loop() { buttonState1 = digitalRead(buttonPin1); buttonState2 = digitalRead(buttonPin2); buttonState3 = digitalRead(buttonPin3); if (buttonState1 == HIGH && flag1==1) //вперед { a++; flag1=0; stope=0; i=0;} if (buttonState1 == LOW){flag1=1;} if (buttonState2 == HIGH && flag2==1) // назад { a=a-1; flag2=0; stope=0; i=0;} if (buttonState2 == LOW){flag2=1;} if (buttonState3 == HIGH && flag3==1) //мигающий { stope=1; flag3=0;i=0;} if (buttonState3 == LOW){flag3=1;} if(a==16){a=0;} if(a==-1){a=15;} i++; if(i==108){i=0;} registerWrite(a, HIGH); delay(500); } // Метод для отсылки данных в регистры void registerWrite(int num, int state) { // Для хранения 16 битов используется unsigned int unsigned int bitsToSend = 0; // 0b000000000000000 // Инициализируем начало приема данных digitalWrite(ST_CP, LOW); // Устанавливаем 1 в соответствующий бит bitWrite(bitsToSend, num, state); // 16 бит необходимо разделить на два байта: // И записать каждый байт в соответствующий регистр byte register1 = lowByte(bitsToSend); byte register2 = highByte(bitsToSend); // Последовательная передача данных на пин DS shiftOut(DS, SH_CP, MSBFIRST, register2); shiftOut(DS, SH_CP, MSBFIRST, register1); // Инициализируем окончание передачи данных. // Регистры подадут напряжение на указанные выходы digitalWrite(ST_CP, HIGH); }
при нажатии на кнопку, должен загораться следующи светодиод, а предыдущий тухнуть.
Но первый как горел так и продолжает гореть!!!! не могу понять почему.
При чем, когда меняю registerWrite(a, HIGH) на registerWrite(1, HIGH) или registerWrite(15, HIGH) то загорается соответствующий, то есть оно как бы статично. Переменная а меняется, проверял с помощью других цифровых выходов на ардуинке.
До этого был скетч где переключал светодиоды с помощью ИК-пульта и все работало. а здесь нет(
Если у кого-то есть идеи почему или какой-то другой способ это зделать, я вам буду очень благодарен