Два сдвиговых регистра 74HC595

Нет ответов
Tortik22
Offline
Зарегистрирован: 08.04.2013

Доброго времени суток.

Горит проэкт, нужно срочно отдать, а запоролся на мелочи, или не мелочи, не знаю.

К ардуинке подключены два сдвиговых регистра 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) то загорается соответствующий, то есть оно как бы статично. Переменная а меняется, проверял  с помощью других цифровых выходов на ардуинке. 

До этого был скетч где переключал светодиоды с помощью ИК-пульта и все работало. а здесь нет(

Если у кого-то есть идеи почему или какой-то другой способ это зделать, я вам буду очень благодарен