74hc595

frielender
Offline
Зарегистрирован: 26.11.2014

Объясните пожалуйста как работать со сдвиговыми регистрами.

Собрал такую схему 

+uln2003 и пара транзисторов.

Мне нужно зажечь поочередно светодиоды, все 16, один за другим. И потом в том же порядке один за другим погасить.

Никак не могу найти инфы как это сделать :|

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Есть 2 пути програмный и аппаратный.

В програмном вы каждый раз отправляете 2 байта(16 бит) с состоянием всех светодиодов. Используя двубайтную переменную сдвигаете ее побитово и устанавливаете первый бит, потом отсылаете эти байты регистрам.

 

В аппаратном вы манипулируете выводами. Данные в 1 и дергаете строб и запись 16 раз. Единица данных при этом плавно заполняет регистры зажигая диоды.

Так как будем делать ?

com
Offline
Зарегистрирован: 06.09.2013

замечательная статья

http://www.rlocman.ru/shem/schematics.html?di=65110

frielender
Offline
Зарегистрирован: 26.11.2014

NeiroN пишет:

Есть 2 пути програмный и аппаратный.

В програмном вы каждый раз отправляете 2 байта(16 бит) с состоянием всех светодиодов. Используя двубайтную переменную сдвигаете ее побитово и устанавливаете первый бит, потом отсылаете эти байты регистрам.

 

В аппаратном вы манипулируете выводами. Данные в 1 и дергаете строб и запись 16 раз. Единица данных при этом плавно заполняет регистры зажигая диоды.

Так как будем делать ?

Наверно первым способом.

MacSim
Offline
Зарегистрирован: 28.11.2012

Вы картинки эти где взяли?

Наверника тут.

https://arduino.ru/Tutorial/registr_74HC595

Там и коды примеров есть 1.1, 1.2 , 2.1 , 2.2. Аж 4 штуки. Ткните надпись "показать код".

Только используемая в этом случае функция shiftOut мне не понравилась. работает конечно, но...

Короче я ее немного переписал.

Как работает сдвиговой регистр хорошо показано анимашке

http://avrproject.ru/publ/kak_podkljuchit/bascom_avr_74hc595/2-1-0-44

 

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Попробуй сначала на одном регистре и кнопках, а там дальше разберешься.... вот я набросал...

int numPins = 8;
int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 };    // Пины для кнопок

//Здвиг регистр
int latchPin = 8;     //Пин подключен к ST_CP входу 74HC595
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 11;     //Пин подключен к DS входу 74HC595
int out0 = 0b00000000; // битовое значение по умолчанию все выводы регистра отключены
int valBit = 0;       //Номер бита, который следует изменить

void setup()
{
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
    
    for (int i = 1; i < numPins; i++)
    {pinMode(pins[i], INPUT);}
}    
    
void loop()
{ 
    int NUM = 0; // номер включенной кнопки   
    if (pins[0] == 1){NUM = 1;}
    else if (pins[1] == 1){NUM = 2;}
    else if (pins[2] == 1){NUM = 3;}
    else if (pins[3] == 1){NUM = 4;}
    else if (pins[4] == 1){NUM = 5;}
    else if (pins[5] == 1){NUM = 6;}
    else if (pins[6] == 1){NUM = 7;}
    else if (pins[7] == 1){NUM = 8;}
  
  
    switch (NUM){
                  case 1:
                    valBit = bitRead(out0, 0);
                    if (valBit == 0){bitWrite(out0, 0, 1);} // bitWrite(имя байта, номер бита, состояние)  
                    else {bitClear(out0, 0);} //bitClear(имя байта, номер бита)
                    break;
                  case 2:
                    valBit = bitRead(out0, 1);
                    if (valBit == 0){bitWrite(out0, 1, 1);}   
                    else {bitClear(out0, 1);}
                    break;
                  case 3:
                    valBit = bitRead(out0, 2);
                    if (valBit == 0){bitWrite(out0, 2, 1);}   
                    else {bitClear(out0, 2);} 
                    break;
                  case 4:
                    valBit = bitRead(out0, 3);
                    if (valBit == 0){bitWrite(out0, 3, 1);}  
                    else {bitClear(out0, 3);}
                    break;
                  case 5:
                    valBit = bitRead(out0, 4);
                    if (valBit == 0){bitWrite(out0, 4, 1);} 
                    else {bitClear(out0, 4);}
                    break;
                  case 6:
                    valBit = bitRead(out0, 5);
                    if (valBit == 0){bitWrite(out0, 5, 1);} 
                    else {bitClear(out0, 5);}
                    break;
                  case 7:
                    valBit = bitRead(out0, 6);
                    if (valBit == 0){bitWrite(out0, 6, 1);}  
                    else {bitClear(out0, 6);}
                    break;
                  case 8:
                    valBit = bitRead(out0, 7);
                    if (valBit == 0){bitWrite(out0, 7, 1);} 
                    else {bitClear(out0, 7);}
                    break;
                }
              
       digitalWrite(latchPin, LOW);
       shiftOut(dataPin, clockPin, MSBFIRST, out0);  
       digitalWrite(latchPin, HIGH);

}

 

sanja404
Offline
Зарегистрирован: 03.10.2014

595 - вообще все просто! у меня семисегментники на них. я массив в начале сделал, затем обрабаываю через оператор if, полученное вывожу через shiftOut. кажет счас попеременно время и температуру )

MacSim
Offline
Зарегистрирован: 28.11.2012

sanja404 пишет:

595 - вообще все просто! у меня семисегментники на них. я массив в начале сделал, затем обрабаываю через оператор if, полученное вывожу через shiftOut. кажет счас попеременно время и температуру )

А у меня еще и влажность. и без моргания дисплея во время считывания данных с датчика.

тока точка когда моргает между часами и минутами заметно потухание едениц часов. надо бы допилить. драйвер токовый поставить. уже заказал.

Вот опять удивляюсь тонкостям дуины (кто это придумал то все?!) зачем каждый раз проверять как пихать байт справа или слева?

 

shiftOut(dataPin, clockPin, MSBFIRST, out0);