Работа с четырех разрядным индикатором

Тема в разделе "Arduino & Shields", создана пользователем yhl, 5 сен 2015.

  1. yhl

    yhl Нерд

    Здравствуйте, подскажите как можно вывести два числа на одну строку и включить точку
    int x = 11, int y = 22?
     
  2. Unixon

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

  3. geher

    geher Гуру

    Если это таки означенный выше QuadDisplay, а на каждое число предполагается всегда по два разряда, то можно так:
    displayFloat(QUAD_PIN,x+y/100.0,2);
    где QUAD_PIN - номер пина, к которому подключен индикатор.
     
  4. yhl

    yhl Нерд

    А можно по подробней displayFloat(QUAD_PIN,x+y/100.0,2);? QUAD_PIN это пин дисплея, x+y это числа 11 и 22, а что это такое /100.0,2?
     
  5. Unixon

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

    displayInt(PIN_QD, (x*100+y), true, (1<<2));
     
  6. geher

    geher Гуру

    Для отображения двух двухзнаковых целых с точкой между ними нужно превратить их в десятичную дробь.
    Первое число берется как есть и образует целую часть. Второе число делится на сто и дает в результате два знака после запятой - сотые доли. Получается выражение x+y/100.0 (100.0 а не просто 100, чтобы деление было не целым с отбрасыванием остатка, а нормальным, с получением float на выходе), которое и передается вторым параметром в функцию.
    2 -третий параметр, определяет количество отображаемых знаков в дробной части.
    Вот и получается. Два знака целой части - x, точка, разделяющая целую и дробную часть, и два знака дробной части - y.
     
    Последнее редактирование: 5 сен 2015
  7. geher

    geher Гуру

    Все время забываю, что displayInt тоже умеет точки отображать.
     
  8. yhl

    yhl Нерд

    Спасибо большое) вот то что сделал.[​IMG]
    Код (Text):
    // Подключаем библиотеку
    #include <QuadDisplay.h>

    // Допустим, индикатор подключен к 7-му пину
    #define PIN 7
    //
    long prevmicros = 0;//переменная для хранения значений таймера
    boolean counter = false; // счетчик для полусекунд
    int s = 0;//значение секунд
    int m = 0;//значение минут
    int h = 12;//значение часов

    const int buttonPin = 2;//Вывод кнопки вверх
    int buttonState = 0;


    void setup()
    {
    pinMode(buttonPin, INPUT);
    }
     
     
    void loop()
    {
      buttonState = digitalRead(buttonPin);//считываем значени с кнопки
      if (buttonState == LOW) {//если конопка нажата
        s++;//добавляем 1 число к продыдущему
      }
      if (micros() - prevmicros > 500000)
      {  
        prevmicros = micros();  //принимает значение каждые полсекунды
        counter =! counter;
        if (counter == false)
        {  
          s++;      //переменная секунда + 1
          if(s>59)//если переменная секунда больше 59 ...
          {
            s=0;//сбрасываем ее на 0
            m++;//пишем +1 в переменную минута
          }
          if(m>59)//если переменная минута больше 59 ...
          {
            m=0;//сбрасываем ее на 0
            h++;//пишем +1 в переменную час
          }
          if(h>12)//если переменная час больше 23 ...
          {
            h=1;//сбрасываем ее на 0
          }
         
          displayFloat(7, h + m /100.0,2);

        }
      }
    }
     
     
  9. yhl

    yhl Нерд

    а можно регулировать яркость ?
     
  10. Unixon

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

    В небольших пределах, если регулировать напряжение питания. Регистры до 2V потянут.
     
  11. Доброго времени суток! Собрал QuadDisplay по схеме с сайта Амперки (не кОрысти ради, а чтоб индикаторы побольше использовать)), но на печатке перепутал первый и последний сдвиговые регистры. То есть развернул всё цепь сдвига. Получилось, что символы выводятся в обратном порядке (вместо 1234 видим 4321).Плату курочить не хотелось, полез в QuadDisplay.cpp. Там нашёл функцию
    Код (C++):
    void displayDigits(uint8_t pin, uint8_t digit1, uint8_t digit2, uint8_t digit3, uint8_t digit4)
    {
        pinMode(pin, OUTPUT);
        //turnOffPWM work here:
        digitalWrite(pin, HIGH);
        sendByte(pin, digit4); //Zdes bilo digit1
        sendByte(pin, digit3); //Zdes bilo digit2
        sendByte(pin, digit2); //Zdes bilo digit3
        sendByte(pin, digit1); //Zdes bilo digit4
        latch(pin);
    Поправил, и всё заработало. Всё, кроме функции

    Код (C++):
    void displayFloat(uint8_t pin, float val, uint8_t precision, bool padZeros)
    {
        uint8_t dot = 0x1;
        while (precision) {
            val *= 10;
            --precision;
            dot <<= 1;
        }

        displayInt(pin, (int)val, padZeros, dot);
    Точка горит не там, где нужно, ставлю 2 знака после запятой, горит точка последнего, правого разряда, ставлю 1,- число смещается вправо (с потерей младшего разряда), точка едет влево. Точка первого(левого) знакоместа- горит постоянно, но ключ в 74HC595D целый (при старте не горит). Пришлось отпаять её (точки) резистор. Файл QuadDisplay.cpp написан непросто, и лишён комментариев. Некоторые синтаксические конструкции (digits = (val || padZeros) ? numerals[digit] : 0xff;) пришлось долго искать в интернете. С программированием я только разбираюсь, посему прошу энтузиастов помочь мне поправить библиотеку под мой случай схемотехнической ошибки!