4х рязрядный семисегментный индикатор и 2 74HC595

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

  1. An4ous

    An4ous Нерд

    Приветствую вас.
    читал в этом блоге урок о подключении семисегментника и немножко не могу рабобраться, а именно с битами чтоб зажечь индикатор. имеется массив для сдвигового регистра
    staticu int8_t pos[4]= {0xE3,0xE5,0xE9,0xF1}; каждый байт соответствует сегменту но почему то у меня все
    горит не правильно, сегментник такой же как в примере, провода проверил раз 40, практически все сегменты полностью засвечены и нечто похожее на цифры вылетает крайне редко. помогите разобраться.
    скетч с урока
    Код (C++):
    #include <SPI.h>
    enum { reg = 8 };


    void setup()
    {
      SPI.begin();
      pinMode(reg, OUTPUT);
    }


    int hour=0, minut=0, sec =0, secOne=0;
    int delayTime=7;
       
    static uint8_t digit[] = {
        (0b00111111),  //0
        (0b00000110),  //1
        (0b01011011),  //2
        (0b01001111),  //3
        (0b01100110),  //4
        (0b01101101),  //5
        (0b01111101),  //6
        (0b00000111),  //7
        (0b01111111),  //8
        (0b01101111)   //9
    };
    static uint8_t pos[]= {0xE3,0xE5,0xE9,0xF1};
    unsigned long timer=0, timerPrev=0, thinkingTime=1000;          


    void output(){


            digitalWrite(reg, LOW);
            SPI.transfer(digit[1]);  //убрал переменные и воткнул везде цифры для наглядности
            SPI.transfer(pos[0]);
            digitalWrite(reg, HIGH);
            delay(3);
         
            digitalWrite(reg, LOW);
            SPI.transfer(digit[2]);
            SPI.transfer(pos[1]);
            digitalWrite(reg, HIGH);
            delay(3);
         
            digitalWrite(reg, LOW);
            SPI.transfer(digit[3]);
            SPI.transfer(pos[2]);
            digitalWrite(reg, HIGH);
            delay(3);
         
            digitalWrite(reg, LOW);
            SPI.transfer(digit[4]);
            SPI.transfer(pos[3]);
            digitalWrite(reg, HIGH);
            delay(3);
    }



    void loop()
    {
      timer=millis();
      if (timer-timerPrev>999){
        secOne+=1;
        if (secOne==10){
          secOne=0;
          sec+=1;
        }
        if (sec==6){
          secOne=0;
          minut+=1;
        }
        if (minut==10){
          minut=0;
          hour+=1;
        }
        if(minut==6){
          hour=0;
        }
        timerPrev=timer;
      }
      output();
    }
     
    Последнее редактирование: 22 ноя 2015
  2. Максим B

    Максим B Гуру

  3. An4ous

    An4ous Нерд

    все таки нашел ошибку у себя, у меня общий катод, а в примере анод, массив для цифр я менял сразу на свой, а вот массив для каждого сегмента оставил из примера,знал что ошибка где то в нем, но долго до меня доходило:)
     
    Последнее редактирование: 22 ноя 2015