[РЕШЕНО] Реализация 3х чисел семисегментного индикатора и одной 74HC595

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

  1. savdm

    savdm Нерд

    Решение и скетч [​IMG]
    Код (Text):
     $regfile = "m8def.dat"
    $crystal = 8000000

    Config Portd = Output

    'значение этой переменной должны будем вывести на индикатор
    Dim A As Word

    'переменные для преобразования исходного числа
    Dim N1 As Byte
    Dim N2 As Byte
    Dim N3 As Byte
    Dim N4 As Byte
    Dim M1 As Integer
    Dim M2 As Integer
    Dim M3 As Integer
    Dim M4 As Integer


    'для значений отправляемых в регистр
    Dim R As Byte

    Do

    A = 1234                                      'значение переменной для вывода на индикатор

    'раскладываем число на составляющие

    M1 = A
    M2 = M1
    M3 = M1
    M4 = M1

    M1 = M1 / 1000                                'M1 = 1234/1000 = 1,234
    N1 = Abs(m1)                                  'N1 = Abs (1,234) = 1

    M2 = M2 Mod 1000                              'M2 =1234 Mod 1000 = 234
    M2 = M2 / 100                                'M2 = 234 / 100 = 2,34
    N2 = Abs(m2)                                  'N2 = Abs (2,34) = 2

    M3 = M3 Mod 100
    M3 = M3 / 10
    N3 = Abs(m3)

    M4 = M4 Mod 10
    N4 = Abs(m4)


    'начинаем задвигать данные в регистр

    Portd = &B00000010
    R = Lookup(n4 , Numbers)                      'первыми идут единицы

    Gosub Registr                                'подпрограмма отправки данных в регистр

    Portd = &B00000100
    R = Lookup(n3 , Numbers)                      'отправляем десятки

    Gosub Registr

    Portd = &B00001000
    R = Lookup(n2 , Numbers)                      'отправляем сотки

    Gosub Registr

    Portd = &B00010000
    R = Lookup(n1 , Numbers)                      'отправляем тысячи

    Gosub Registr

    Loop

    End                                          'конец программы

    'массив с кодами для семисегментника
    Numbers:
    Data &B11000000                              '0
    Data &B11111001                              '1
    Data &B10100100                              '2
    Data &B10110000                              '3
    Data &B10011001                              '4
    Data &B10010010                              '5
    Data &B10000010                              '6
    Data &B11111000                              '7
    Data &B10000000                              '8
    Data &B10010000                              '9

    'подпрограмма отправки данных в регистр
    Registr:
    Shiftout Portd.5 , Portd.6 , R , 1          'задвигаем данные
    Pulseout Portd , 7 , 10                      'защелкиваем регистр
    Waitms 5
    Return
    Вот ссылка как реализовать на одном 595 http://avrproject.ru/index/podkljuc...hc595_dinamicheskaja_indikacija_primer_1/0-16


    Переписать код на Ардуино кто-нибудь сможет помочь???? :confused:
     
    Последнее редактирование: 2 фев 2015
  2. savdm

    savdm Нерд

    Помогите, пожалуйста.
     
  3. X-Dron

    X-Dron Гик

    Основа вот:
    Код (Text):
      // для записи в 74HC595 нужно притянуть пин строба к земле
      digitalWrite(LATCH_PIN, LOW);
      // задвигаем (англ. shift out) байт-маску бит за битом,
      // начиная с младшего (англ. Least Significant Bit first)
      shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
      // чтобы переданный байт отразился на выходах Qx, нужно
      // подать на пин строба высокий сигнал
      digitalWrite(LATCH_PIN, HIGH);
    Отсюда
    http://wiki.amperka.ru/конспект-arduino:счетчик-нажатий
    Повторить 4 раза для разных стробов выбора разряда
    так же понадобится
    Код (Text):
          //Значения для отображения на каждом из 4 разрядов
          int8_t Disp[4];
          //Выводим значение отсрочки срабатывания таймера на дисплей
          Disp[0] = Value/1000;  //тысячи
          Disp[1] = (Value/100)%10; //сотни
          Disp[2] = (Value/10)% 10; //десятки
          Disp[3] = Value% 10; //еденицы
    //Disp[i] должно быть вместо clicks в  "segments[clicks]"
     
     
    Последнее редактирование: 1 фев 2015
    savdm нравится это.
  4. savdm

    savdm Нерд

    Спасибо, буду разбираться и возможно напишу скетч :) Чтобы кому-то было полезно в разработке. У меня на три числа семисегмент с общим анодом Ba56-12gwa
     
  5. savdm

    savdm Нерд

    Собственно, вот скетч. Постарался максимально рассказать в комментариях
    Код (Text):
    // DS отвечает за поток битов(данные). На Схеме 595 пин 14
    #define DATA_PIN    4
    //STCP  отвечает за так называемое защелкивание. Когда мы все свои биты передали, посылаем сигнал, что окончили передачу. На Схеме 595 пин 12
    #define LATCH_PIN  3
    // SHCP отвечает за ШИМ. Когда 1 из данных забирается бит, 0 пропускается.Синхронизация потока. На Схеме 595 пин 11
    #define CLOCK_PIN  2
    const int digitPins[3] = {52,51,50}; //Массив пинов. Выбрал произвольные кониакты у меня Мега
    int8_t Disp[3]={0};// задается тип int8_t чтобы к нам ничего, кроме набора бит не попало.
    int Value = 567; //значение для отображения на индикаторе
    byte i=0;
    byte segments[10] = { //Массив из 10 значений
    B11000000, //0
    B11111001, //1
    B10100100, //2
    B10110000, //3
    B10011001, //4
    B10010010, //5
    B10000010, //6
    B11111000, //7
    B10000000, //8
    B10010000 //9 Бинарное значение цифры в моем подключении индикатора и сдвигового регистра, когда q1->a,..q7->g,q0->DP
    };

    void setup()
    {
          for(byte j=0;j<3;j++)pinMode(digitPins[j],OUTPUT); //цикл - назначаем всем режим выход из нашего массива пинов
          pinMode(DATA_PIN, OUTPUT);
          pinMode(CLOCK_PIN, OUTPUT);
          pinMode(LATCH_PIN, OUTPUT);
    }
            // Моя функция для работы с индикатором и сдвиговым регистром 74НС595
            void printInd()
            {
            //цифровые выходы из массива в 0 (LOW) - отключаем используем цикл
            for(byte d=0; d<3; d++) digitalWrite(digitPins[d], LOW);

            //Для начала записи в 74HC595 нужно подать 0 на STCP (открыть)
            digitalWrite(LATCH_PIN, LOW);
            // с данными выпускаем поток битов на DS  синхроннированные с SHCP
            shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, segments[Disp[i]]);
            // А теперь когда последний бит числа передали закрываем
            digitalWrite(LATCH_PIN, HIGH);
            //на индикатор подаем 5V смотреть в DATASHEET вашего индикатора!!!
            digitalWrite(digitPins[i], HIGH);
            delayMicroseconds(300); //Частота мирцания и собственно она же яркость индикатора:)
            //delay(1000);// проследить появление
            i++;
            if(i > 2) i=0;
            }
    void loop()
    {
    //Выводим значение отсрочки срабатывания таймера на дисплей
    Disp[0] = (Value/100)%10; //сотни
    Disp[1] = (Value/10)%10; //десятки
    Disp[2] = Value%10; //единицы
    printInd(); //Функция для отображения на индикаторе
    }
     
    Как работает запись Взял отсюда[​IMG]
    При свете настольной лампы
    IMG_0277.JPG
    При минимальном освещении
    IMG_0278.JPG
    Судя из Datasheet у моего индикатора
    Минимальный порог 3600 мкД
    И рабочий 8600 мкД
    Мне нравится, достаточно ярко и можно использовать другие значения для яркости delayMicroseconds
     
    Последнее редактирование: 2 фев 2015
    vvr нравится это.
  6. vvr

    vvr Инженерище

    Спасибо за работу.
    Немного переделал под свои нужды - работает , да и сэкономил лишнюю микруху:)