Сдвиговый регистр 74hc595

Lictor
Offline
Зарегистрирован: 01.10.2015

В самодельной схеме 

 

есть два последовательно подключенных регистра к которым через резисторы в 300Ом подсоединены SMD светодиоды, т.о. что они (светодиоды) образуют семисегментный индикатор. Все в принципе работает, но при некоторых комбинациях цифр (одних и тех же) два светодиода питаемые со со второго регистра начинают светиться чуть видно. Я в начале подумал, что не хватает питания, но опять же число 88 выводит в полную яркость. В чем может быть причина?

Lictor
Offline
Зарегистрирован: 01.10.2015

Причем проблема со светодиодами на 3 и 4 выводе считая от точки против часовой стрелки первого (я ошибся, на самом деле не второго, а первого) регистра. Но в целом эти выводы работают, светодиоды горят при проверках. 

const byte ST = A0; //ST_CP 74HC595
const byte SH = A1; //SH_CP  74HC595
const byte DS = 13; //DS 74HC595

byte first[] = {
B00001110 , B00001110 , //0
B00001000 , B00000010 , //1
B01001010 , B00001100 , //2
B01001010 , B00001010 ,
B01001100 , B00000010 ,
B01000110 , B00001010 ,
B01000110 , B00001110 ,
B00001010 , B00000010 ,
B01001110 , B00001110 ,
B01001110 , B00001010
};

byte second[] = {
B00110001 , B01110000 , //0
B00010000 , B00010000 , //1
B00010001 , B01100001 , //2
B00010001 , B01010001 ,
B00110000 , B00010001 ,
B00100001 , B01010001 ,
B00100001 , B01110001 ,
B00010001 , B00010000 ,
B00110001 , B01110001 ,
B00110001 , B01010001
};

byte dot[] = {
B00000000 , B10000000 ,
B00000000 , B00000000
};

byte a = 0; //левый индикатор, Х
byte b = 0; //правый индикатор, Y
byte c = 0; //enter

void displaySMD();

void setup() {

  pinMode(ST, OUTPUT);
  pinMode(SH, OUTPUT);
  pinMode(DS, OUTPUT);
                               
  pinMode(A2, INPUT_PULLUP);
  pinMode(A3, INPUT_PULLUP);
  pinMode(A4, INPUT_PULLUP);
  displaySMD(a, b, c);
}



void loop() {             

if (digitalRead(A2) == 0) {
  delay(1000);
  a++;
  if (a>9) a=0;
  displaySMD(a, b, c);
}

if (digitalRead(A3) == 0) {
  delay(1000);
  b++;
  if (b>9) b=0;
  displaySMD(a, b, c);
}

}

void displaySMD(byte a, byte b, byte c) {
  
  digitalWrite(ST, LOW); //начало передачи
  shiftOut(DS, SH, LSBFIRST, first[2*a]|second[2*b]);  //1 разряд
  shiftOut(DS, SH, LSBFIRST, first[2*a+1]|second[2*b+1]);  //2 разряд
  digitalWrite(ST, HIGH); //передача окончена
  }

 

Lictor
Offline
Зарегистрирован: 01.10.2015

Удалось понять, что если один из них гаснет, то гаснет и второй. 

Lictor
Offline
Зарегистрирован: 01.10.2015

Проблема века решена, КЗ между диодами на второй верхней плате.