Сдвиговые регистры. Нужна помощь!

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

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

Опять мучаю два сдвиговых регистра 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 - последний, а все остальные не горят.

Прошу помощи, буду очень признателен

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

unsigned int плюс сдвиг

std
Offline
Зарегистрирован: 05.01.2012

jeka_tm пишет:
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. Не на Балтику девятку, ессно, ибо я не пью вообще. Куплю себе пару шоколадок, говорят сладкое для мозга полезно...

ЗЫ: не стебусь, функция работает.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да так. только немного подправлю

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);
}

 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

По сути на выводных пинах сдвигового регистра получается число в двоичной форме. Т.е пишите 0b00000001 и загорается первый, 0b10000000 и загорается последний. 0b10101010 и будут гореть через один. Посмотрите даташит на сдвиговый регист, а конкретно вам поможет временная диаграмма, напишите свою функцию, которая будет зажигать только один светодиод.