Подключение семисегментных индикаторов - ФОРУМ ДВ Робот dvrobot.ru
Понедельник, 24.09.2018, 17:28
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Подключение семисегментных индикаторов (с помощью сдвиговых регистров 74HC164)
    Подключение семисегментных индикаторов
    Saushin-EldarДата: Понедельник, 23.02.2015, 18:55 | Сообщение # 1
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Чтобы подключить 1 семисегментный индикатор на прямую к Arduino, надо задействовать минимум 9 контактов. Конечно же это много. Тем более четырехразрядный семисигментный индикатор потребует 12 контактов! Поэтому я начал собирать информацию о подключении таких индикаторов, дабы задействовать как можно меньше контактов.

    Вот такие варианты подключения я нашел в интернете:
    1. с помощью микросхемы MAX7221 - можно управлять сразу 8-мью разрядами, но цена ей около 800р.
    2. с помощью микросхемы 74HC164 - цена 15р.
    Поэтому я и выбрал второй вариант.

    Схема подключения:


    Как все будет происходить:
    Первой микросхемой мы будем управлять сегментами, загружая в нее биты нужных сегментов. Второй микросхемой мы будем управлять разрядами по очереди, т.е можно подключить максимум 8 разрядов, но! чем больше разрядов, тем больше будет рябить индикатор.

    Что будет делать код:
    1. Получаем число.
    2. Получаем каждую цифру по отдельности.
    3. Загружаем первую цифру в первую микросхему.
    4. Включаем второй микросхемой первый разряд (получили цифру в 1ом разряде).
    5. Выключаем второй микросхемой первый разряд.
    6. Загружаем вторую цифру в первую микросхему.
    7. Включаем второй микросхемой второй разряд (получили цифру в 2ом разряде).
    8. Выключаем второй микросхемой второй разряд.
    9. И т.д до 4го разряда (если число четырехзначное).

    Сам код:
    Код
    #define data 12  
    #define clock 13
    #define dataind 7
    #define clockind 8

    byte ind0 = B11111111; // для очистки разрядов
    byte ind1 = B01111111; // для вкл 1го разряда
    byte ind2 = B10111111; // для вкл 2го разряда
    byte ind3 = B11011111; // для вкл 3го разряда
    byte ind4 = B11101111; // для вкл 4го разряда

    byte zero  = B11111100; // для вкл нужных сегментов цифр
    byte one   = B01100000;
    byte two   = B11011010;
    byte three = B11110010;
    byte four  = B01100110;
    byte five  = B10110110;
    byte six   = B10111110;
    byte seven = B11100000;
    byte eight = B11111110;
    byte nine  = B11110110;

    void setup()
    {
       pinMode(data, OUTPUT); // управление сегментами
       pinMode(clock, OUTPUT); // управление сегментами
       pinMode(dataind, OUTPUT); // управление разрядами
       pinMode(clockind, OUTPUT); // управление разрядами
       pinMode(0, INPUT); // входящее значение с контакта А0 (потенциометр)
        
       Serial.begin(9600); // просто так
    }

    void loop()
    {
       int val0 = analogRead(0); // считываем значение, число сохраняем
                 // в отдельной переменной для
                 // дальнейшей обработки
       int val1 = val0 % 10; // вычисляем остаток от деления: так найдем цифру для 1го разряда
       if (val1 == 1)
       {
         shiftOut(data, clock, LSBFIRST, one);
       }
       else if (val1 == 2)
       {
         shiftOut(data, clock, LSBFIRST, two);
       }
       else if (val1 == 3)
       {
         shiftOut(data, clock, LSBFIRST, three);
       }
       else if (val1 == 4)
       {
         shiftOut(data, clock, LSBFIRST, four);
       }
       else if (val1 == 5)
       {
         shiftOut(data, clock, LSBFIRST, five);
       }
       else if (val1 == 6)
       {
         shiftOut(data, clock, LSBFIRST, six);
       }
       else if (val1 == 7)
       {
         shiftOut(data, clock, LSBFIRST, seven);
       }
       else if (val1 == 8)
       {
         shiftOut(data, clock, LSBFIRST, eight);
       }
       else if (val1 == 9)
       {
         shiftOut(data, clock, LSBFIRST, nine);
       }
       else
       {
         shiftOut(data, clock, LSBFIRST, zero); // даем найденной цифре // побитовое значение, чтобы занести в сдвиговый регистр (первая микросхема)

       }
       delay(1);
       shiftOut(dataind, clockind, LSBFIRST, ind1); // включаем первый разряд
       delay(4);
       shiftOut(dataind, clockind, LSBFIRST, ind0); // выключаем все разряды
        
       int val2 = ((val0 - val1) / 10) % 10; //здесь находим вторую цифру
                    // для второго разряда
       if(val0 >= 10) // производим проверку на двузначность числа
       {
         if (val2 == 1)
         {
           shiftOut(data, clock, LSBFIRST, one);
         }
         else if (val2 == 2)
         {
           shiftOut(data, clock, LSBFIRST, two);
         }
         else if (val2 == 3)
         {
           shiftOut(data, clock, LSBFIRST, three);
         }
         else if (val2 == 4)
         {
           shiftOut(data, clock, LSBFIRST, four);
         }
         else if (val2 == 5)
         {
           shiftOut(data, clock, LSBFIRST, five);
         }
         else if (val2 == 6)
         {
           shiftOut(data, clock, LSBFIRST, six);
         }
         else if (val2 == 7)
         {
           shiftOut(data, clock, LSBFIRST, seven);
         }
         else if (val2 == 8)
         {
           shiftOut(data, clock, LSBFIRST, eight);
         }
         else if (val2 == 9)
         {
           shiftOut(data, clock, LSBFIRST, nine);
         }
         else
         {
           shiftOut(data, clock, LSBFIRST, zero);
         }
       delay(1);
       shiftOut(dataind, clockind, LSBFIRST, ind2); // получили цифру во втором сегменте
       delay(4);
       shiftOut(dataind, clockind, LSBFIRST, ind0);
       }
        
       int val3 = ((val0 - val2*10 - val1) / 100) % 10; // находим 3ью цифру
       if(val0 >= 100) // производим проверку на трехзначность числа
       {
         if (val3 == 1)
         {
           shiftOut(data, clock, LSBFIRST, one);
         }
         else if (val3 == 2)
         {
           shiftOut(data, clock, LSBFIRST, two);
         }
         else if (val3 == 3)
         {
           shiftOut(data, clock, LSBFIRST, three);
         }
         else if (val3 == 4)
         {
           shiftOut(data, clock, LSBFIRST, four);
         }
         else if (val3 == 5)
         {
           shiftOut(data, clock, LSBFIRST, five);
         }
         else if (val3 == 6)
         {
           shiftOut(data, clock, LSBFIRST, six);
         }
         else if (val3 == 7)
         {
           shiftOut(data, clock, LSBFIRST, seven);
         }
         else if (val3 == 8)
         {
           shiftOut(data, clock, LSBFIRST, eight);
         }
         else if (val3 == 9)
         {
           shiftOut(data, clock, LSBFIRST, nine);
         }
         else
         {
           shiftOut(data, clock, LSBFIRST, zero);
         }
       delay(1);
       shiftOut(dataind, clockind, LSBFIRST, ind3);
       delay(4);
       shiftOut(dataind, clockind, LSBFIRST, ind0);
       }
        
       int val4 = ((val0 - val3*100 - val2*10 - val1) / 1000) % 10;
       if(val0 >= 1000)  // производим проверку на четырехзначность числа
       {
         if (val4 == 1)
         {
           shiftOut(data, clock, LSBFIRST, one);
         }
         else if (val4 == 2)
         {
           shiftOut(data, clock, LSBFIRST, two);
         }
         else if (val4 == 3)
         {
           shiftOut(data, clock, LSBFIRST, three);
         }
         else if (val4 == 4)
         {
           shiftOut(data, clock, LSBFIRST, four);
         }
         else if (val4 == 5)
         {
           shiftOut(data, clock, LSBFIRST, five);
         }
         else if (val4 == 6)
         {
           shiftOut(data, clock, LSBFIRST, six);
         }
         else if (val4 == 7)
         {
           shiftOut(data, clock, LSBFIRST, seven);
         }
         else if (val4 == 8)
         {
           shiftOut(data, clock, LSBFIRST, eight);
         }
         else if (val4 == 9)
         {
           shiftOut(data, clock, LSBFIRST, nine);
         }
         else
         {
           shiftOut(data, clock, LSBFIRST, zero);
         }
       delay(1);
       shiftOut(dataind, clockind, LSBFIRST, ind4); // получили 4ую цифру
       delay(4);
       shiftOut(dataind, clockind, LSBFIRST, ind0);
       }
    } // и все заново

    Недостатки:
    1. Когда в первом сегменте горит какое либо число, то в остальных появляется слабое фантомное свечение того же числа. Возможно вторая микросхема не выдает точную логическую единицу. Возможно нужны подтягивающие резисторы.
    2. Чем больше цифр на индикаторе, тем больше рябь. Но с помощью задерки добился наименьшей ряби.
    3. Код создан для целых чисел. Кто умеет делать библиотеки, попробуйте сделать))
    4. Для работы индикатора число должно постоянно приходить.
    Прикрепления: 1610610.png(935.2 Kb)
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Подключение семисегментных индикаторов (с помощью сдвиговых регистров 74HC164)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат