Omdat er maar 14 uitgangen zijn heb ik de BCD tellers aangepast, de tientallen hoeven immers maar tot 5 te tellen (BCD 101). Hierdoor kon ik voor de tientallen de D uitsparen. Ik hoef dan geen 16 pinnen te hebben, maar 14. (komt dat even mooi uit!)
De code is als volgt:
#define BIT_A1 0
#define BIT_B1 1
#define BIT_C1 2
#define BIT_D1 3
#define BIT_A2 4
#define BIT_B2 5
#define BIT_C2 6
#define BIT_A3 7
#define BIT_B3 8
#define BIT_C3 9
#define BIT_D3 10
#define BIT_A4 11
#define BIT_B4 12
#define BIT_C4 13
int a=0; // A1
int b=0; // B1
int c=0; // C1
int d=0; // D1
int x=0; // counter
int a1=0; // A2
int b1=0; // B2
int c1=0; // C2
int x1=0; // counter
int a2=0; // A3
int b2=0; // B3
int c2=0; // C3
int d2=0; // D3
int x2=0; // counter
int a3=0; // A4
int b3=0; // B4
int c3=0; // C4
int new_a=0;
int new_b=0;
int new_c=0;
int new_d=0;
int new_a1=0;
int new_b1=0;
int new_c1=0;
int new_a2=0;
int new_b2=0;
int new_c2=0;
int new_d2=0;
int new_a3=0;
int new_b3=0;
int new_c3=0;
void setup(){
pinMode(BIT_A1,OUTPUT); //set all pin in OUTPUT mode
pinMode(BIT_B1,OUTPUT);
pinMode(BIT_C1,OUTPUT);
pinMode(BIT_D1,OUTPUT);
pinMode(BIT_A2,OUTPUT);
pinMode(BIT_B2,OUTPUT);
pinMode(BIT_C2,OUTPUT);
pinMode(BIT_A3,OUTPUT);
pinMode(BIT_B3,OUTPUT);
pinMode(BIT_C3,OUTPUT);
pinMode(BIT_D3,OUTPUT);
pinMode(BIT_A4,OUTPUT);
pinMode(BIT_B4,OUTPUT);
pinMode(BIT_C4,OUTPUT);
}
void loop(){
do
{
do
{
do
{
delay(1000);
if (!a) new_a=1;
else new_a=0;
if ((b && !a) || (!b && a && !d)) new_b=1;
else new_b=0;
if ((!c && b && a) || (c && !a) || ( c && !b)) new_c=1;
else new_c=0;
if ((!d && c && b && a) || (d && !a)) new_d=1;
else new_d=0;
a=new_a;
b=new_b;
c=new_c;
d=new_d;
if(a==1) digitalWrite(BIT_A1,HIGH);
else digitalWrite(BIT_A1,LOW);
if(b==1) digitalWrite(BIT_B1,HIGH);
else digitalWrite(BIT_B1,LOW);
if(c==1) digitalWrite(BIT_C1,HIGH);
else digitalWrite(BIT_C1,LOW);
if(d==1) digitalWrite(BIT_D1,HIGH);
else digitalWrite(BIT_D1,LOW);
x = x + 1;
} while (x < 10);
x=0;
if (!a1) new_a1=1;
else new_a1=0;
if ((b1 && !a1) || (!b1 && a1 && !c1)) new_b1=1;
else new_b1=0;
if ((!c1 && b1 && a1) || (c1 && !a1 && !b1)) new_c1=1;
else new_c1=0;
a1=new_a1;
b1=new_b1;
c1=new_c1;
if(a1==1) digitalWrite(BIT_A2,HIGH);
else digitalWrite(BIT_A2,LOW);
if(b1==1) digitalWrite(BIT_B2,HIGH);
else digitalWrite(BIT_B2,LOW);
if(c1==1) digitalWrite(BIT_C2,HIGH);
else digitalWrite(BIT_C2,LOW);
x1 = x1 + 1;
} while (x1 < 6);
x1=0;
if (!a2) new_a2=1;
else new_a2=0;
if ((b2 && !a2) || (!b2 && a2 && !d2)) new_b2=1;
else new_b2=0;
if ((!c2 && b2 && a2) || (c2 && !a2) || ( c2 && !b2)) new_c2=1;
else new_c2=0;
if ((!d2 && c2 && b2 && a2) || (d2 && !a2)) new_d2=1;
else new_d2=0;
a2=new_a2;
b2=new_b2;
c2=new_c2;
d2=new_d2;
if(a2==1) digitalWrite(BIT_A3,HIGH);
else digitalWrite(BIT_A3,LOW);
if(b2==1) digitalWrite(BIT_B3,HIGH);
else digitalWrite(BIT_B3,LOW);
if(c2==1) digitalWrite(BIT_C3,HIGH);
else digitalWrite(BIT_C3,LOW);
if(d2==1) digitalWrite(BIT_D3,HIGH);
else digitalWrite(BIT_D3,LOW);
x2 = x2 + 1;
} while (x2 < 10);
x2=0;
if (!a3) new_a3=1;
else new_a3=0;
if ((b3 && !a3) || (!b3 && a3 && !c3)) new_b3=1;
else new_b3=0;
if ((!c3 && b3 && a3) || (c3 && !a3 && !b3)) new_c3=1;
else new_c3=0;
a3=new_a3;
b3=new_b3;
c3=new_c3;
if(a3==1) digitalWrite(BIT_A4,HIGH);
else digitalWrite(BIT_A4,LOW);
if(b3==1) digitalWrite(BIT_B4,HIGH);
else digitalWrite(BIT_B4,LOW);
if(c3==1) digitalWrite(BIT_C4,HIGH);
else digitalWrite(BIT_C4,LOW);
}
Om het filmpje wat sneller te laten lopen heb ik wat met de delay gespeeld, eerst is delay 100, daarna 10.
Het ziet er dan als volgt uit: