Помогите разобраться с сдвиговыми регистрами 74HC595

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем JinG08, 8 окт 2015.

  1. JinG08

    JinG08 Нуб

    Здравствуйте! Появился такой вопрос. У меня проект по сути являющийся бегущим огоньком. В этом проекте у меня будет подключено 7 сдвиговых регистров и к каждой ноге выхода будет подключен светодиод через резистор всего 54 светодиода. Каскадом у меня получилось подключить сдвиговые регистры информацию под черпнул здесь http://asio5.ru/?p=454 и здесь http://arduino.ru/Tutorial/registr_74HC595 скетч более подходящий нашел вот тут http://asio5.ru/?p=454

    Код (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);
    }


    Этот скетч немного мне не подходит т.к. он зажигает только один светодиод а мне нужно что бы он оставлял гореть и предыдущие светодиоды и второе работать скетч начинает со второго сдвигового регистра при включение т.е. сначала загорается 9 и последующие светодиоды а мне нужно чтобы с первого начинал загорать светодиод. Помогите доработать скетч
    хочу сделать шкалутку виде такой http://vk.com/video-42128136_164506984 или такой

     
  2. DrProg

    DrProg Вечный нерд

    Я бы не доработал этот скетч, а написал заново, какой то он не такой.

    Отключение же предыдущего светодиода прямо так и подписано:
    Код (C++):
    // Отключение предыдущего светодиода
    if (i > 0) {
    registerWrite(i - 1, LOW);
    }
    закаменить его или удалить.

    Вообще не понятно зачем делать 16-битную переменную, чтобы потом разбивать ее на два байта?

    Если требуется просто зажечь все светодиоды от первого до последнего то идеально подойдет регистр "без защелки", вот, кстати примечательно, что нашлось ему применение почти сразу! В случае схемы с ним достаточно просто подавать единичку через 0,5 сек на пин DS, программка в пару строк. Может быть есть смысл сделать на нем?

    Для схемы же на 595 потребуется на каждый шаг формировать биты и загонять их в цепочку. Тоже не очень сложно, но времени затратить придется побольше.
     
    ИгорьК нравится это.
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    DrProg2.PNG
    :D
     
  4. DrProg

    DrProg Вечный нерд

    ИгорьК нравится это.
  5. Recoshet

    Recoshet Нерд

    Помню мне очень помогла эта гифка в понимании, как работает этот сдвиговый регистр
    [​IMG]
     
    laboratory9 и Пушной звер нравится это.