I was wondering how to drive NPN and somehow separate 12v and 5v soo i decided to try optocoupler and it work.
//SEGMENT SR
int latchPin = 2;
int dataPin = 3;
int clockPin = 4;
//DIGIT SR
int latchPin2 = 5;
int dataPin2 = 6;
int clockPin2 = 7;
// 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
int anh[] = {0x44FF, 0x0C, 0x8877, 0x883F, 0x888C, 0x90B3, 0x88FB, 0xF, 0x88FF, 0x88BF, 0x88CF, 0x2A3F, 0xF3, 0x223F, 0x80F3, 0x80C3, 0x8FB, 0x88CC, 0x2233, 0x7C, 0x94C0, 0xF0, 0x5CC, 0x11CC, 0xFF, 0x88C7, 0x10FF, 0x98C7, 0x88BB, 0x2203, 0xFC, 0x4480, 0x50CC, 0x5500, 0x88BC, 0x4433};
int digitpick[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; //turn ON each digit
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
}
void loop()
{
//output 12345678 on display
out(1,2,3,4,5,6,7,8);
}
void out(int n1,int n2,int n3,int n4,int n5,int n6,int n7, int n8)
{
int xx[] = {n1,n2,n3,n4,n5,n6,n7,n8};
for(int i = 1; i < 9; i++)
{
DIGIT(digitpick[0]);
NUM(anh[xx[i-1]]);
DIGIT(digitpick[i]);
delay(1);
}
}
void NUM(int num)
{
digitalWrite(latchPin, LOW);
shiftOut( dataPin, clockPin, MSBFIRST, (num >> 8) );
shiftOut( dataPin, clockPin, MSBFIRST, num );
digitalWrite(latchPin, HIGH);
}
void DIGIT(int num)
{
digitalWrite(latchPin2, LOW);
shiftOut( dataPin2, clockPin2, MSBFIRST, num );
digitalWrite(latchPin2, HIGH);
}
Maybe something with timing/delay ?