Regarding my previous post about how to multiplex also the digits pins, this is what I tried
They are now handled through a second 595 chip.
int digits_number = 4;
int bytes = B0001;
const int latchSegments = 7;
const int clockSegments = 6;
const int dataSegments = 5;
const int latchDigits = 8;
const int clockDigits = 9;
const int dataDigits = 10;
byte byteRead;
const byte digit[10] =
{
B10000001, //0 -----------
B11110011, //1 ----------
B01001001, //2 ----------
B01100001, //3 ----------
B00110011, //4 ----------
B00100101, //5 ----------
B00000101, //6 ----------
B11110001, //7 ----------
B00000001, //8 ----------
B00100001, //9 ----------
};
void setup() {
Serial.begin(9600);
pinMode(latchSegments, OUTPUT);
pinMode(clockSegments, OUTPUT);
pinMode(dataSegments, OUTPUT);
pinMode(latchDigits, OUTPUT);
pinMode(clockDigits, OUTPUT);
pinMode(dataDigits, OUTPUT);
digitalWrite(dataDigits, HIGH);
}
void update_display() {
int d1 = 1;
int d2 = 2;
int d3 = 3;
int d4 = 4;
bytes = B0001;
for(int j = 0;j<digits_number;j++)
{
digitalWrite(latchSegments, LOW);
switch(j)
{
case 0:
shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d1]); // 1
break;
case 1:
shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d2]); // 2
break;
case 2:
shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d3]); // 3
break;
case 3:
shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d4]); // 4
break;
}
digitalWrite(latchSegments, HIGH);
digitalWrite(latchDigits, LOW);
shiftOut(dataDigits, clockDigits, MSBFIRST, bytes);
digitalWrite(latchDigits, HIGH);
digitalWrite(dataDigits, HIGH);
delay(4);
digitalWrite(dataDigits, LOW);
bytes = bytes << 1;
}
}
void loop ()
{
update_display();
delay(1);
}
And this is what I get (ignore last 2 digits, they are not wired)
As you can see there is some ghosting.
I think I understand what the problem is, every number is displayed in every display digit.
However, I don't know how to fix it, because if I increase the delay between the digits pin HIGH and LOW, then they start flickering.