Сдвиговые регистры. Нужна помощь!
- Войдите на сайт для отправки комментариев
Пнд, 27/04/2015 - 23:38
Доброго времени суток!
Опять мучаю два сдвиговых регистра 74HC595.
Прошлый раз нашел ошибку заработало.
Но при изготовлении очередного устройства, опять вылазят ошибки с этими адскими микросхемами
Прошу помочь в освоении данного скетча
//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 12;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
// отсчитываем от 0 до 255 и отображаем значение на светодиоде
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
// устанавливаем синхронизацию "защелки" на LOW
digitalWrite(latchPin, LOW);
// передаем отсчет для вывода на зеленые светодиоды
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
// передаем обратный отсчет для вывода на красные светодиоды
shiftOut(dataPin, clockPin, MSBFIRST, 255-numberToDisplay);
//"защелкиваем" регистр, тем самым устанавливая значения на выходах
digitalWrite(latchPin, HIGH);
// пауза перед следующей итерацией
delay(500);
}
}
данная программа выводит значения от 0 до 255 на все шестнадцать светодиодов.
мне нужно, чтоб программа включала только один светодиод в зависимости от одной переменной, т.е. допустим а==0, значит горит самый первый светодиод, a==15 - последний, а все остальные не горят.
Прошу помощи, буду очень признателен
unsigned int плюс сдвиг
Tortik22, это значит
unsigned int numberToDisplay; void setShiftBit(byte n){ if(n>16) return; if(n==0) numberToDisplay=0; else{ numberToDisplay=1; numberToDisplay<<=n-1; } digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); digitalWrite(latchPin, HIGH); }Будет зажигать светики Q0..Q15 по аргументу n=1..n=16. Если n=0, то все гасятся, если n>16 - ничего не делает.
Помочь мне можно парой соток на ЯД 410011919696337. Не на Балтику девятку, ессно, ибо я не пью вообще. Куплю себе пару шоколадок, говорят сладкое для мозга полезно...
ЗЫ: не стебусь, функция работает.
да так. только немного подправлю
unsigned int numberToDisplay; void setShiftBit(byte n){ if(n>16) return; if(n==0) numberToDisplay=0; else{ numberToDisplay=1; numberToDisplay<<=n-1; } digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, (numberToDisplay >> 8)); shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); digitalWrite(latchPin, HIGH); }По сути на выводных пинах сдвигового регистра получается число в двоичной форме. Т.е пишите 0b00000001 и загорается первый, 0b10000000 и загорается последний. 0b10101010 и будут гореть через один. Посмотрите даташит на сдвиговый регист, а конкретно вам поможет временная диаграмма, напишите свою функцию, которая будет зажигать только один светодиод.