Программирование 74HC595 с помощью микроконтроллера

Тема в разделе "Микроконтроллеры AVR", создана пользователем Vallek, 13 мар 2015.

  1. KindMan

    KindMan Гуру

    А что вы хотели, чтобы отобразилось?
    Что у вас тут делается?
     
  2. Мне нужно, чтобы отобралось число, которое я занёс в переменную tmp.
    Разбиваю число на отдельные цифры для удобства вывода на индикатор
     
  3. b707

    b707 Гуру

    на какие такие цифры вы разбиваете одноразрядное число 6 ?
    Вот в итоге и вывелось шестерка и три нуля
     
    DetSimen нравится это.
  4. Число 6 выбрал как пример, просто пока не дома и с другими числами не проверял. Должно было вывести 0006. а вывело 600.0
     
  5. b707

    b707 Гуру

    похоже что порядок разрядов либо на схеме, либо в программе перепутан
     
  6. Тоже так подумал, скорее в программе. Схему я как освобожусь прикреплю, там я врят ли ошибся с подключением
     
  7. upload_2019-8-21_20-8-4.png upload_2019-8-21_20-16-56.png
     

    Вложения:

    • 1.png
      1.png
      Размер файла:
      44,5 КБ
      Просмотров:
      412
    Последнее редактирование: 21 авг 2019
  8. b707

    b707 Гуру

    все зависит лишь от точки зрения - откуда считать разряды - справа или слева. Главное, чтобы и в программе и на схеме считать одинаково.
     
  9. Спасибо, похоже в этом и моя ошибка. Все перепроверю
     
  10. Вот рабочий код, только пришлось убрать точку
    Код (C++):
    const uint8_t latchPin = 8;//Пин подключен к ST_CP входу 74HC595
    const uint8_t clockPin = 9;//Пин подключен к SH_CP входу 74HC595
    const uint8_t dataPin = 10;//Пин подключен к DS входу 74HC595

    const uint8_t digitPins[4] = {
      3,4,5,6}; // Пины для управления 4 разрядами семисегментного индикатора ОА

    const byte digit[10] =
    {
      B00111111, //0
      B00000110, //1
      B01011011, //2
      B01001111, //3
      B01100110, //4
      B01101101, //5
      B01111101, //6
      B00000111, //7
      B01111111, //8
      B01101111, //9
    };

    uint8_t digitBuffer[4] = {0};
    uint8_t digitScan = 0;
    volatile unsigned int soft_scaler = 0;
    //uint8_t tmp;

    ISR(TIMER2_OVF_vect) { // Обработчик прерывания по переполнению таймера 2
      soft_scaler++;
      if(soft_scaler==15)
      {
        refreshDisplay();
        soft_scaler = 0;
      }
    };

    static void timer2_init(void) {
      // Настройка таймера
      // Период срабатывания таймера при F_CPU = 16 MHz
      // T = 1/(16000000/8/256) = 128 мкс          
      TCCR2A = 0;
      TCCR2B = (1<<CS21);  // Предделитель на 8
      TIMSK2 = (1<<TOIE2); // Разрешение прерывания по переполнению таймера 2
      TCNT2 = 0;           // сбрасываем счетный регистр
    }

    void setup()   {

        for(uint8_t i=0; i<4; i++)
      {
        pinMode(digitPins[i],OUTPUT);
      }
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);

      timer2_init(); // Инициализация таймера 2
      sei(); // Включить глобальные прерывания
    }

    void refreshDisplay()
    {
      byte pattern;
      // гасим все сегменты
      for(uint8_t k=0; k<4; k++)
      {
        digitalWrite(digitPins[k], LOW);
      }
      // байт данных для вывода
      pattern = digit[digitBuffer[digitScan]];
      // устанавливаем лог. 0 на latchPin, пока не окончена передача байта данных
      digitalWrite(latchPin, LOW);

      // обновляем байт данных для вывода из регистра на дисплей
      // поскольку это дисплей с общим анодом шаблон необходимо инвертировать
      shiftOut(dataPin, clockPin, MSBFIRST, ~pattern);

      // защелкиваем регистр, чтобы данные появились на его выходах
      digitalWrite(latchPin, HIGH);
      digitalWrite(digitPins[digitScan], HIGH);

      // проходим по разрядам
      digitScan++;
      if(digitScan >= 4) digitScan = 0;
    }

    void loop()                  
    {
      unsigned int tmp = 400;

      digitBuffer[3] = tmp/1000;
      digitBuffer[2] = (tmp%1000)/100;
      digitBuffer[1] = (tmp%100)/10;
      digitBuffer[0] = (tmp%100)%10;
    }
    Разряды дисплея также переподключил.
    Пин 3 - 4 разр
    Пин 4 - 3 разр
    Пин 5 - 2 разр
    Пин 6 - 1 разр
     
    Последнее редактирование: 22 авг 2019
    b707 нравится это.