Hi
I've bumped into problems with my project.
I followed this guide (WordPress › Error) to set-up a 7segment display counting from 0-9a-f and now I want to extend this with 2 more digits.
If I have that same code and 3 digits hooked up in my breadboard it's showing 111, 222, 333, 444...
The code is only for one digit, so I didn't expect so much. However, why is it showing 3 digits, I expected it to only show one, because only one where shifted out?
Anyway, I've tried to understand how to extend this code to 3 digits, but the bit-thing gets over my head. I think I understand the bitwise operations for the 1 digit display, but extending it gets me stuck.
From what I understand I need to send the rightmost digit first, then the middle and then the leftmost. (ofcourse that depends on my wiring, but the first digit is the first shiftregister)
Where do I begin if I want to make this code for 3 digit displays?
const int latchPin = 5; // Pin connected to Pin 12 of 74HC595 (Latch)
const int dataPin = 6; // Pin connected to Pin 14 of 74HC595 (Data)
const int clockPin = 7; // Pin connected to Pin 11 of 74HC595 (Clock)
unsigned long t1;
unsigned long t2;
int i = 0;
// Describe each digit in terms of display segments
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
const byte numbers[16] = {
0b11111100,
0b01100000,
0b11011010,
0b11110010,
0b01100110,
0b10110110,
0b10111110,
0b11100000,
0b11111110,
0b11100110,
0b11101110,
0b00111110,
0b10011100,
0b01111010,
0b10011110,
0b10001110
};
void setup()
{
// initialisation time
t1 = millis();
//set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop()
{
// update digit every two seconds
t2 = millis();
if(t2 - t1 > 2000)
{
i++;
t1 = t2;
if(i > 15) { i = 0; }
}
// display the current digit
show(numbers[i]);
}
void show( byte number)
{
// Use a loop and a bitwise AND to move over each bit that makes up
// the seven segment display (from left to right, A => G), and check
// to see if it should be on or not
for(int j = 0; j <= 7; j++)
{
byte toWrite = number & (0b10000000 >> j);
// If all bits are 0 then no point writing it to the shift register,
// so break out and move on to next segment.
if(!toWrite) { continue; }
// Otherwise shift it into the register
shiftIt(toWrite);
}
}
void shiftIt (byte data)
{
// Set latchPin LOW while clocking these 8 bits in to the register
digitalWrite(latchPin, LOW);
for (int k=0; k <= 7; k++)
{
// clockPin LOW prior to sending a bit
digitalWrite(clockPin, LOW);
// Note that in our case, we need to set pinState to 0 (LOW) for
// “On” as the 74HC595 is sinking current when using a common
// anode display. If you want to use a common cathode display then
// switch this around.
if ( data & (1 << k) )
{
digitalWrite(dataPin, LOW); // turn “On”
}
else
{
digitalWrite(dataPin, HIGH); // turn “Off”
}
// and clock the bit in
digitalWrite(clockPin, HIGH);
}
//stop shifting out data
digitalWrite(clockPin, LOW);
//set latchPin to high to lock and send data
digitalWrite(latchPin, HIGH);
// put delay here if you want to see the multiplexing in action!
//delay(100);
}
Best Regards
Niclas Gustafsson