Индикатор на 595 регистрах

Тема в разделе "Arduino & Shields", создана пользователем Karabas, 13 янв 2017.

  1. mcureenab

    mcureenab Гуру

    Код (C++):
      const byte chr[4] = { // маска для разряда
          0b00001000,
          0b00000100,
          0b00000010,
          0b00001001
      };
     
    Тут вроде как первая 1 лишняя:
    0b00001001
    Должно быть
    0b00000001
     
    Karabas нравится это.
  2. mcureenab

    mcureenab Гуру

    И не мешает эти массивы const static сделать.
     
  3. Jedi

    Jedi Гик

    Код (C++):
     for(byte i = 0; i <= 3; i=0)
    А это вечный цикл, да? Или я опять ошибаюсь и так задумано?
     
    Karabas нравится это.
  4. mcureenab

    mcureenab Гуру

    Это ошибка. Должно быть
    Код (C++):
      // отправляем в цикле по два байта в сдвиговые регистры
      for(byte i = 0; i <= 3; ++i){
    Иначе код будет выводить один сегмент и зависнет.
     
    Karabas нравится это.
  5. Jedi

    Jedi Гик

    Спасибо :) А то я уж подумал, что это такой хитрый отладочный код :)
     
  6. mcureenab

    mcureenab Гуру

    Автор каким то левым источником воспользовался.
     
  7. Karabas

    Karabas Гик

    Автор воспользовался тем, что нашел, результат известен.
    Вот поэтому и попросил схему и код.
     
  8. Karabas

    Karabas Гик

    Спасибо всем кто откликнулся!
    Вроде заработало, скетч и правда весь кривой был.

    вот рабочий код, если кому понадобиться, так же добавил массив цифр с точкой,
    да знаю про битовые операции, но так понаглядней будет :)
    Код (C++):

    #define SCLK 7  // to 14 pin 74hc595
    #define RCLK 6  // to 12 pin 74hc595
    #define DIO 5   // to 13 pin 74hc595
    byte digitBuffer[4];

    void setup(){
      pinMode(RCLK, OUTPUT);
      pinMode(SCLK, OUTPUT);
      pinMode(DIO, OUTPUT);
    }


    void loop(){
      // заполняем массив
      digitBuffer[0] = 1;
      digitBuffer[1] = 2;
      digitBuffer[2] = 3;
      digitBuffer[3] = 4;

      // однократно выводим данные из массива на 7сигмент
      // тоесть функция должна постоянно крутится.
      showDisplay();

    }

    void showDisplay(){

      const byte digit[11] = {  // маска для 7 сигментного индикатора
          0b11000000, // 0
          0b11111001, // 1
          0b10100100, // 2
          0b10110000, // 3
          0b10011001, // 4
          0b10010010, // 5
          0b10000010, // 6
          0b11111000, // 7
          0b10000000, // 8
          0b10010000, // 9
          0b01111111, // .
      };
     
        const byte digit_dot[11] = {  // маска для 7 сигментного индикатора плюс точка после цифры
          0b01000000, // 0
          0b01111001, // 1
          0b00100100, // 2
          0b00110000, // 3
          0b00011001, // 4
          0b00010010, // 5
          0b00000010, // 6
          0b01111000, // 7
          0b00000000, // 8
          0b00010000, // 9
          0b01111111, // .
      };

      const byte chr[4] = { // маска для разряда
          0b00000001,
          0b00000010,
          0b00000100,
          0b00001000
      };

      // отправляем в цикле по два байта в сдвиговые регистры
      for(byte i = 0; i <= 3; i++){
        digitalWrite(RCLK, LOW); // открываем защелку
       
          shiftOut(DIO, SCLK, MSBFIRST, chr[i]);   // включаем разряд
       
          shiftOut(DIO, SCLK, MSBFIRST, digit_dot[digitBuffer[i]]);  // отправляем байт с "числом"
         
        digitalWrite(RCLK, HIGH); // защелкиваем регистры
        delay(6); // ждем немного перед отправкой следующего "числа"
      }
    }
     
    Последнее редактирование: 14 янв 2017