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