В какой литературе объяснена работа с 7 сегментным индикатором?

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 22 июн 2022.

  1. Максим B

    Максим B Гуру

    Всем привет. Сделал часы, сделал вывод на 7 сегментный индикатор (не использую сдвиговый регистр), но код получился большим и корявым, в плане того, что и кнопки не добавить и ооочень длинный код.Хочу все переписать. Сейчас сделал все в "тупую", что даже не добавить отдельно мигающие точки, не добавить кнопки, т.к. используется delay. Ниже часть кода:
    Код (Text):

    .......
     clearLEDs();
      pickDigit(0); //включаем первую цифру
      pickNumber((n/1000)); //значение тысячи
      delay(del); //пауза 5мс

      clearLEDs();
      pickDigit(1); //включаем вторую цифру
      pickNumber((n%1000)/100); //значение сотни
      delay(del); //пауза 5мс
    ........


    // вывод 0
    void zero()
    {
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, HIGH); //HEX 1
    }

    // вывод 1
    void one()
    {
      digitalWrite(a, HIGH);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW); // HEX 4F
      digitalWrite(d, HIGH);
      digitalWrite(e, HIGH);
      digitalWrite(f, HIGH);
      digitalWrite(g, HIGH);
    }
     
    Может есть литература, в которой рассказано, что для динамической индикации надо 20 мс на отображение, т.к. 5 мс используется на отображение одного сегмента, плюс надо добавить задержку для кнопки, вот этот код можно переписать так и все в таком духе. В интернете нашел статьи, но все читается не так либо коды на ассемблере или C.
     
  2. parovoZZ

    parovoZZ Гуру

    обычно сдвиговый регистр подключается через SPI.
    А начинать надо с книжки по цифровым устройствам. Например, Пухальского. Как только будет понятно, как работает сдвиговый регистр, можно учиться пробовать заполнять его регистры данными.
    А статьи в интернете пишут неучи для неучей.
     
  3. Green

    Green Гик

    Для того что бы была нормальная индикация, дисплей нужно обновлять не ниже определённой частоты, как у вас на VGA мониторе. Для одного знака период должен быть не выше 12мс / кол-во разрядов индикатора. Каждый период, выключаете общие индикатора, берёте отображаемую цифру, преобразуете в код 7-ми сегментного индикатора и выставляете сегменты, включив требуемый общий. В следующий период - аналогично со следующим разрядом.
    Та ВЫ сами должны были себе это представлять.
     
  4. SergeiL

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

    Я правил код с динамической индикацией тут
    Там есть функция Dysplay_Refresh(void) вызывается из loop() которая отвечает за вывод буфера на экран в динамическом режиме.
    Там ввод идет через сдвиговый регистр, но сделайте массив из номеров пинов сегментов, и выводите в цикле сдвигая фонт.
    Получится что то типа этого:
    Код (C++):
    uint8_t pin_segments[7] = {a,b,c,d,e,f,g};

    void Dysplay_Refresh(void)
    {
      static uint32_t   old_millis = 0;
      static uint8_t    pos = 2;
      uint8_t i,j;

      if ( cur_millis - old_millis >= 7 )  // обновляем разряд раз в 7мс ( 7*3=21мс )
      {
        old_millis = cur_millis;

        digitalWrite(digit_pin[pos], DIGIT_OFF);

        if (pos == 2)
          pos = 0;
        else
          pos++;

        for(i=0,j=0x40; i<7; j=j>>1,i++)
        {
            if (disp_buff[pos] & j)
                 digitalWrite(pin_segments[i], HIGH);
            else
                 digitalWrite(pin_segments[i], LOW);
        }

        digitalWrite(digit_pin[pos], DIGIT_ON);
      }
    }
     
    Тут буфер дисплея на 3 цифры, добавьте еще одну - будет 4.
     
    Максим B нравится это.
  5. Green

    Green Гик

    Можно по всякому. Тут уж как кому нравится. Даже delay(12); display(); в лупе. Вот только 21 мс многовато будет! Что ж тут не понять!