8ми разрядный модуль 7ми сегментных индикаторв + 2х 74HC595

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 16 июл 2014.

  1. AlexVS

    AlexVS Гик

    Купил такой модуль. Подключил к UNO. Набросал тестовый скетч. Проблема в том, что я могу зажечь только одинаковые символы одновременно в нескольких разрядах. А как зажечь строку "-1234567" - не могу понять.
    Вот исходник, он просто перебирает все цифры по всем разрядам, если в переменную mesto записать например 7, то в старших 3х разрядах горят одинаковые цифры.
    Код (Text):
    //Пин подключен к ST_CP входу 74HC595
    const int latchPin = 10;
    //Пин подключен к SH_CP входу 74HC595
    const int clockPin = 11;
    //Пин подключен к DS входу 74HC595
    const int dataPin = 12;
    char inputString[2];
    int segdisp[11] = {
    3,159,37,13,153,73,65,27,1,9,253};
    int znak[8] = {
      1,2,4,8,16,32,64,128};

    void setup ()
    {
    //устанавливаем режим OUTPUT
    pinMode (latchPin, OUTPUT);
    pinMode (dataPin, OUTPUT);
    pinMode (clockPin, OUTPUT);
    }

    void loop ()
    {
    sclear();

    for (int i=0; i<11; i++)
    {
      for (int j=0; j<8; j++)
      {
      setdigit(segdisp[i],znak[j]);
      delay(1000);
      }
    }
    }

    void setdigit(int number, int mesto)
    {
    digitalWrite (latchPin, LOW);
    shiftOut (dataPin, clockPin,  LSBFIRST, number);
    shiftOut (dataPin, clockPin,  LSBFIRST, mesto);
    digitalWrite (latchPin, HIGH);
    }

    void sclear()
    {
      digitalWrite (latchPin, LOW);
    // «проталкиваем» байты в регистры
      shiftOut (dataPin, clockPin,  LSBFIRST, 0);
      shiftOut (dataPin, clockPin,  LSBFIRST, 0);
    // «защелкиваем» регистр, чтобы биты появились на выходах регистра
      digitalWrite (latchPin, HIGH);
    }
    Подскажите пожалуйста, как это осуществить.
     
  2. Unixon

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

    1) Ссылка на модуль где?
    2) Активный уровень защелки (LATCH) и выборки разряда, скорее всего, низкий (LOW), т.е. писать в регистры нужно с инверсией.
     
  3. AlexVS

    AlexVS Гик

  4. XCB

    XCB Гик

    также как на экране телевизора "двигающиеся" изображение это результат отрисовки 25 картинок в секунду....
    по сути у вас порядка 16 ножек, 8 выбор знакоместа и элементы в этом знакоместе.
    подачей высокого/низкого уровня выбираете один сегмент, подачей на оставшиеся 8 других уровней зажигаете одно знакоместо. ждете и повторяете для следующего... и так раз 25 в секунду...
     
  5. Unixon

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

    Ответ на ваш вопрос заключается в словах "динамическая индикация". Нужно очень быстро перебирать все разряды в цикле, никаких delay(1000).
     
  6. AlexVS

    AlexVS Гик

    Может данный пример не удачен, но если в нем убрать делай - тупо горят все 8!
     
  7. Unixon

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

    А, стоп. Знаю эти индикаторы. Сейчас напишу как с ними правильно работать.
     
  8. AlexVS

    AlexVS Гик

    Хм. Ну в принципе если луп написать как:
    Код (Text):
    void loop ()
    {
    sclear();
    setdigit(segdisp[10],znak[0]);
    setdigit(segdisp[1],znak[1]);
    setdigit(segdisp[2],znak[2]);
      setdigit(segdisp[3],znak[3]);
      setdigit(segdisp[4],znak[4]);
      setdigit(segdisp[5],znak[5]);
      setdigit(segdisp[6],znak[6]);
      setdigit(segdisp[7],znak[7]);
    }
    То виден нужный результат.
    Однако, очень хотелось бы увидеть другой способ!!!
     
  9. Unixon

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

    Там история вот какая. На каждом регистре висит свой 4-разрядный индикатор, они независимы и связаны только через последовательный ввод. У каждого из индикаторов две линии отвечают за номер разряда, а остальные - за выбор сегментов. (Схему неплохо бы составить...) Статическая индикация невозможна, только динамика.
     
  10. AlexVS

    AlexVS Гик

  11. AlexVS

    AlexVS Гик

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

    С микроконтроллерами только знакомлюсь, опыт дней 5 всего.
     
  12. Unixon

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

    У разных индикаторов различная внутренняя схема и у каждого модуля различное подключение индикаторов к регистрам. Просто так 1:1 не переносится. Хотя идея везде одинаковая. В часть бит записывается номер разряда, в остальные биты состояние сегментов. Так в цикле перебираются все разряды.
     
  13. Unixon

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

    Если у вас этот код работает с этим дисплеем, значит все в порядке, вы пишете нужные данные в нужные биты. Что вы подразумеваете под другим способом?
     
  14. AlexVS

    AlexVS Гик

    Думал может можно организовать бегущую строку из температуры, влажности, давления.
     
  15. Unixon

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

    Да пожалуйста, выводите что угодно. У вас есть в памяти буфер znak[], в котором содержатся выводимые на дисплей данные. Вот в этом буфере и крутите строку. А процедура обновления дисплея это штука независимая от выводимых данных.
     
  16. AlexVS

    AlexVS Гик

    А еще такой вопрос: Можно в процедуру (вывода на дисплей, например) передать не стринг с данными, а массив. Я в Си не силен :(
     
  17. Unixon

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

    Да, передаете указатель на первый элемент массива.
     
  18. AlexVS

    AlexVS Гик

    Все таки не совсем понятно как работать с модулем. Нужная строка отображается пока крутится loop, т.е. пока программа занята только отображением на дисплее, если туда впихнуть другие действия - то горит только последний символ!
    Может подскажите как это побороть?
     
  19. XCB

    XCB Гик

    например заниматься обновлением дисплея в обработчике прерывания
     
    Unixon нравится это.
  20. Unixon

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

    Это - никак. Этот дисплей в принципе не способен одновременно отображать все разряды. Индикация динамическая! Дисплей нужно постоянно обновлять, кто-то этим обновлением должен постоянно заниматься.

    Однако, это можно обойти, чередуя в программе обновление дисплея с другими полезными действиями.