Hello folks!
I am new to arduino /coding etc. I am trying to implement a counter from 0 to 999 with 1 second delay and represent it using 3 7-seven segment displays. I used the multiplexing method to connect my display to Arduino Uno board and it is working great...BUT! it is flickering( or however you call it guys) :~ . For a strange reason (for me at least) it is increments well but the printing to the 7-seg display is not like 000 > 001> 002 , instead i get 1>0>0 3>0>0 7>0>0 ( the ">" sign means the change of the display) . Can u please explain to me where is the problem in my code ( i think is something to do with the timing e.g too many instructions) and suggest a suitable way to reduce the flickering
Hardware : pins 1,2,3,4,5,6,7 are the segments
pins 8,9,10 are the digit selection
segments are common cathode(datasheet http://www.bitsbox.co.uk/data/optos/03cc.pdf )
Software:
void Display4(int value){
static char digit=0;
char digval[2];
bin2bcd(value,digval);
Display1(digval[digit],digit);
if(++digit >= 3)
digit=0;
}
void bin2bcd (int valu, char* bcd){
bcd[3]= valu/1000u;// for '1'
bcd[2]= (valu/100)%10u;//for '10'
bcd[1]= (valu/10u)%10u; //for '100'
bcd[0]= valu%10u;//for '1000'
}
void Display1(char digval, char digit){
digitsel(digval);//sents the number
switch (digit){
case 0:
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
break;
case 1:
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
digitalWrite(10, LOW);
break;
case 2:
digitalWrite(8, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
break;
}
}
void digitsel( byte digit )
{
switch (digit){
case 0:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
break;
case 1:
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(1, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
break;
case 2:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(7, LOW);
digitalWrite(3, LOW);
break;
case 3:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(6, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
break;
case 4:
digitalWrite(2, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(3, HIGH);
digitalWrite(1, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
break;
case 5:
digitalWrite(1, HIGH);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(2, LOW);
digitalWrite(5, LOW);
break;
case 6:
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
break;
case 7:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
break;
case 8:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
break;
case 9:
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
break;
default:
break;
}
}
float t=0;
void setup()
{
//Serial.begin(9600);
for (int i = 1; i < 11; i++) // set pins 0-7 as outputs
{
pinMode(i, OUTPUT);
// Serial.println(i);
}
}
void loop()
{
Display4(t);
t++;
if(t >= 999)
{t=0;}
delay(1000);
}
P.S 1 :Please don't suggest to use shift registers I want to learn this way
P.S 2 :I did search for similar threats but nothing ...
P.S 3: I am new to everything above so please be nice