Проблемы с Дисплеями на 74 hc164

Тема в разделе "Arduino & Shields", создана пользователем SuicideAttacker, 9 дек 2017.

Метки:
  1. Заказал я из китая вот такой модуль:

    Eight&digit & serial interface & Red highlight & digital tube display module & 74hc164 drive
    [​IMG]
    1.on-board 2 road 74 hc164 serial to parallel chips
    2.on-board 2 road 0.36 inch red Yang four eight digital tube
    3.on-board concatenated control interface, convenient external device to connect
    4.working voltage: 5 v
    5.the board size: 35.3 (mm) x29 (mm)

    Мне он нужен был для вывода информации с датчика DHT 11. Первая строчка температура, вторая влажность.
    Начал искать в интернете примеры и готовые скетчи на этот модуль и.... Ничего не нашел.
    Обычно на 74hc164 собирают самодельные семи сегментные модули, которые общаться по 4м проводам.
    После часа поисков, нашел на англоязычном форуме просьбу помочь:
    "Всем привет. В настоящее время я работаю с двумя 8-битными регистрами сдвига 74HC164D, которые управляют отображением 2x4 7segment дисплеев. Однако у меня есть проблема, в то время как я могу выводить правильные биты, чтобы загорать сегменты и отображать соответствующие цифры, я не могу контролировать, где они загораются ... Как я могу исправить эту проблему, пожалуйста, помогите мне."
    и ниже был представлен код:
    Код (C++):
    1

    int dataPin = 2;
    int clockPin = 3;

    void setup() {

      pinMode(dataPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
    }

    // digit 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    // 0 bit to light up a segment  0     1     2     3     4     5     6     7     8     9
    unsigned char LED_ARRAY[] = { 0XC0, 0xF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90 };


    void loop() {

      for (byte i = 0; i < 10; i++) {
        shiftOut(dataPin, clockPin, MSBFIRST, LED_ARRAY[i]);
        delay(600);
      }
    }

    void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t value)
    {
      uint8_t i;

      for (i = 0; i < 8; i++)  {
        digitalWrite(dataPin, (value & (1 << (7 - i))));
        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);
      }
    }
    Залив в Ардуино я получил счетчик от 0 до 10 с хаотично перемещающимися цифрами (та же проблема, что и иностранца)
    [​IMG]

    Помогите начинающему кодеру вывести нужные мне цифры (показания с датчика) на этот дисплей
     
  2. rkit

    rkit Гуру

    Провода укоротите и распутайте.
     
  3. rkit

    rkit Гуру

    А потом читайте даташит на чип. Если грубо, то нужно зацепить latсh, подать цепь импульсов на clk и параллельно импульсы на dta в позициях, где нужно зажечь сегменты.
     
  4. Onkel

    Onkel Гуру

    индикаторы на max7219 купите, 100-200 руб стоят
    upload_2017-12-9_12-45-1.png
    С ними проще работать, и им не нужно динамическое управление. Послали команду- и мк может своими делами заниматься.
     
  5. Jendos77

    Jendos77 Нерд

    Разобрался с модулем.
    "Обычно на 74hc164 собирают самодельные семи сегментные модули, которые общаться по 4м проводам" Да. Reset, CLOCK, DATA A, DATA B, но A и B параллелят, а RESET кидают на питание, поэтому достаточно DATA и CLOCK.
    На модуле две микросхемы HC164 сдвиговые регистры соединенные последовательно, одна управляет сегментами символа (8 бит), другая определяет, какой символ будет отображаться (следующие 8 бит). Иначе говоря, за одну полную итерацию из 16 тактов можно отобразить сразу на всех 8 разрядах индикатора только один символ. Например, символ "3" в четырёх разрядах [01010101][01001111]. Надеюсь, понятно.

    Пример для Attiny85 (atmel studio)

    Код (C++):
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>

    unsigned char digits [] = {
       
        0b00111111, // 0
        0b00000110, // 1
        0b01011011, // 2
        0b01001111, // 3
        0b01100110, // 4
        0b01101101, // 5
        0b01111101, // 6
        0b00000111, // 7
        0b01111111, // 8
        0b01101111  // 9
       
        };
       
    unsigned char dig = 0b10000000;
       
    // Функция сдвига
    void write_byte(unsigned char data, unsigned char seg)
    {

        for(unsigned char i = 0; i < 8; i++)
        {
            if((data & 0x80) != 0) // Сравниваем 8-й бит с нулем
            PORTB |= (1 << PB0); // DATA 1
            else
            PORTB &= ~(1 << PB0); // DATA 0
           
            data = data << 1; // Сдвигаем биты
            PORTB |= (1 << PB1); // CLK 1
            PORTB &= ~(1 << PB1); // CLK 0
        }
        for(unsigned char i = 0; i < 8; i++)
        {
            if((seg & 0x80) != 0) // Сравниваем 8-й бит с нулем
            PORTB |= (1 << PB0); // DATA 1
            else
            PORTB &= ~(1 << PB0); // DATA 0
           
            seg = seg << 1; // Сдвигаем биты      
            PORTB |= (1 << PB1); // CLK 1
            PORTB &= ~(1 << PB1); // CLK 0
        }

    }

    int main(void)
    {
       
        DDRB = 0b1111; // PORTB на выход

        while (1)
        {
            for (unsigned char i = 0; i < 10; i++)
            {
                write_byte(~digits[i], dig);
                _delay_ms(100);
                if (dig != 0b00000001)
                dig = dig >> 1;
                else
                dig = 0b10000000;
            }
        }
    }
     

    Вложения:

    Последнее редактирование: 29 июн 2020