Seven-segment display (SSD)
Goal:
Be able to control a single and multiple SSD using microcontrollers.
Understand the operation of shift registers (74HC595N)
1.
SSD powered by SEVEN wires
A Seven-segment
display (SSD) unit is a simple LED package, typically all of
the
cathodes (negative terminals) or all of the anodes (positive terminals)
of the segment LEDs are connected and brought out to a common pin; this
is referred to as a "common cathode" or "common anode" device. The SSD
we are going to use in this lab is a 'common cathode' unit.

Fig. 1 The
internal connection (schematic) of the SSD in this lab
The decimal
number (1-10) in Fig. 1 are the pin numbers of the SSD unit. The
letters (A-G, DP) are the corresponding LEDs.
You can map the
schematic to the real SSD unit using Fig. 2, or directly check the
datasheet of the SSD (LSHD5503).

Fig. 2 SSD
pin/LED map.
With the LED/pin
map, you can power up the corresponding LEDs and display different
numbers and letters.
2.
Experiments
2.1 SSDs powered by individual wires
Use the 5V
voltage supply on the Arduino Board
(do not go beyond that) as the power supply, connect the SSD pins to
resistors to limit the current (protect the SSD unit).
By
powering up a certain group of LEDs, try to display numbers
from 0, 1, 2, 3, ..., 9. The following figure shows you all
the LEDs in the SSD were powered up:

The
seven LEDs in the SSD device were individually controlled by SEVEN
wires. I can turn off a certian combination of wires to display a
number on it. Refer to the map again:

To display a '6'
there, I need to turn off 'B":

See the figure
above, I just plugged off one wire that used to be connected to 'B'.
Try to display
all the numbers from 0 - 9.
2.2
SSD powered by THREE wires (manually)
The
method in section 1 is definitely not good. It takes too much 'pin
resource' just to power up one single SSD device.
In this section, we'll use a Digital Decoder to control the SSD device.
We know that 3 bits can have 2^3=8 combinations. So we can simplify
the SSD control by using a 'decoder' which can convert your 3-bit input
code to an 8-bit code and drive the SSD indirectly.
We are going to
use M74HC4543 to drive our LED.
Connect 74HC4543
(the decoder) to your SSD:
('L' represents
GND, 'H' represents 5V)

Control
the SSD by change the voltage at A-D of the decoder, try to display 0,
1, 2, 3, ..., 9
Now,
you can create the same results but just control 4 pins instead of 7
pins. This is important because you saved a lot of pin resources, which
means you can save lots of space on a real circuit board!
2.3 SSD
powerd by ONE wire (only one digital line to control all seven
pins)
In
this section, we'll use a 'shift register' integrated circuit (IC) to
receive the SSD control input SERIALLY, and then deliver all the code
to the SSD device in PARALLEL.
The top view of the 'shift register' can be found below:

74HC595N



From
the internal circuit diagram below, we can tell that 'SER' is the one
SERIALLY deliver binary data to the first stage of Register, which will
be passed to the following ones. 'RCLK' seems like the 'Switch' for the
Parallel output. 'SRCLK' is used to shift the data being fed into the
first Register to the following ones.

The operation of
the shift register may seem difficult for you if you
don't have much 'digital logic' background.
Arduino has a
library/function called 'shiftOut()' can manage this job
for you if you don't want to handle the details of the sequential
logic.
Let's test the
shift register using simple LEDs first.
Make the
following connection to the hardware as shown below.

Use
the following code: (this is the example of using LSBFIRST):

The
demonstration:
Make sure you
understand that the shifted LEDs you saw in the video are not shifted
by the 'shift refister' IC as what you saw. It is just changing it's
state every half seconds. The shift register shifted the data in
variable 'leds' to and latch them at the same time (in paralllel) to
the out put of the shift regfister: Q0 - Q7.
It might be
confusing that you are shifting the '1' in byte variable 'leds'. This
is done by an internal shift function inside the Arduino CPU. So there
are three things being 'shifted' but only the command
'shiftOut(dataPin,clockPin,LSBFIRST,leds)' is shifted by the 'shift
refister' IC we used here.
Now, we know how
to use the 74HC595N chip. There is only one
data line 'SER' instead of three or more. This is the strategy being
used in real-life. We can use this single 'shift register' IC to
control more than ONE SSD device, and even make a digital clock out of
it.
Let's display decimal numbers to an SSD device using 74HC595N first (refer to the
schematic in the example above to wire up your cricuit) and use the
following code (please note the changes made in this code):
// SSD, single, counts, MSBFIRST, revised 9/16/2020
int latchPin=11;// RCLK
int clockPin=9;// SRCLK
int dataPin=12;//SER
byte SSDs=0x3F; // in binary, it is 0011 1111, which only turns off G and H, will display 0
void setup()
{
pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
}
void loop()
{
SSDs=0x06; //1
updateShiftRegister();
delay(500);
SSDs=0x5B; //2
updateShiftRegister();
delay(500);
SSDs=0x4F; //3
updateShiftRegister();
delay(500);
SSDs=0x66; //4
updateShiftRegister();
delay(500);
SSDs=0x6D; //5
updateShiftRegister();
delay(500);
SSDs=0x7D; //6
updateShiftRegister();
delay(500);
SSDs=0x07; //7
updateShiftRegister();
delay(500);
SSDs=0x7F; //8
updateShiftRegister();
delay(500);
SSDs=0x6F; //9
updateShiftRegister();
delay(500);
SSDs=0x3F; //0
updateShiftRegister();
delay(500);
}
void updateShiftRegister()
{
digitalWrite(latchPin,LOW); // disable latch/pass
shiftOut(dataPin,clockPin,MSBFIRST,SSDs);
digitalWrite(latchPin,HIGH); // rising edge latches/passes data through
}
The 'delay(500)' will
generate half second delay to detect if there is
any change in the SSD code. However, we don't have any changes in this
code, it is static, so the number on the SSD will not be changed.
If you want to change it over
time, we should modify the code. For
example, let's make this counts from 0 to 9 and then back to 0.
Demonstration:
Of course you can make the
delay shorter to roll it faster.
Repeat this example first and then change it to LSBFIRST and modify the code accordingly and demonstrate it in a video.
2.4 SSD
powerd by ONE wire (More than ONE SSD devices)

All the cathodes are
connected together.

All
the 4 decimal digits are sharing the same A-G and DP. Every single
decimal digit can be enabled/disabled by turning on/off D1-D4.
If
we enable/disable everyone very quickly, your eye can't resolve the
change and it looks static. So we can display 4 different decimal
numbers at the 4 digits.
Let's try to display '2019'
to the 4 digits.
Connect DIG1 - DIG4 to pin7 -
pin4 on your Arduino board through 4 resistors.

(The
Arduino code is not provided)
Tasks:
1. Repeat/complete the work in Sections 2.1 - 2.4.