PIC18F46K22 with 74HC595 Shift Register and 7-Segment Display

Adding a serial-in parallel-out shift register such as the popular one 74HC595 to a 7-segment display will reduce number of pins required to drive it (the display).
Basically the 7-segment display (1 digit) requires 9 pins: 8 segment pins (A, B, C, D, E, F, G and DP) + common pin. By connecting all the segment pins to a shift register, the required number of pins becomes just 3: clock pin and data pin (for the shift register) + common pin.
So, for a 4-digit 7-segment display we need just 6 pins: clock, data and 4 common pins (each digit has its individual common pin).

This topic shows how to build a simple digital counter using PIC18F46K22 microcontroller, common anode 7-segment display with 4 digits and 74HC595 shift register.
CCS C Compiler is used in this example.

To see how to interface the PIC18F46K22 microcontroller with 7-segment display (4-digit counter example), visit the following post:
Interfacing PIC18F46K22 with 7-segment display | 4-Digit counter example

Hardware Required:

  • PIC18F46K22 microcontroller   —->  datasheet
  • 4-Digit common anode 7-segment display
  • 74HC595 shift register   —->   datasheet
  • 4 x PNP transistor (2SA1015, 2S9015, 2N3906 …)
  • 8 x 100 ohm resistor
  • 4 x 4.7k ohm resistor
  • Push button
  • 5V source
  • Breadboard
  • Jumper wires

7-Segment display with 74HC595 shift register circuit:
The image below shows our example circuit schematic diagram.

PIC1F46K22 74HC595 shift register 4-digit 7-segment display

All the grounded terminals are connected together.

As shown in the circuit diagram above, all segment pins are connected to the 74HC595 output pins, each one through 100 ohm resistor, where:
Segment A … G are connected to 74HC595 pin Q7 … Q1 respectively and segment DP is connected to pin Q0.
The data pin of the 74HC595 shift register is named DS (#14) and it is connected to PIC18F46K22 pin RD2 (#21).
ST_CP (or RCLK) and SH_CP (or SRCLK) are connected together which then connected to PIC18F46K22 pin RD3 (#22), this is the clock pin.

Since the display has 4 digits, there’re 4 common pins: 1 (most left), 2, 3 and 4. Each common pin is connected to collector terminal of one transistor. Emitter terminals of the 4 transistors are connected to circuit +5V. Base terminals of the four transistors are connected to the PIC18F46K22 through 4.7k resistors.
The 4 transistors are of the same type (PNP).

The push button which is connected to PIC18F46K22 pin RB4 (#37) is used to increment the displayed number.

In this project the PIC18F46K22 microcontroller runs with its internal oscillator @ 8 MHz, MCLR pin is configured as an input pin.

7-Segment display with 74HC595 shift register C code:
The following C code is for CCS C compiler, it was tested with version 5.0.51.

Shift register clock and data pins are defined as:

And the 4 common pins are defined as shown below:

Since the 4 digits are multiplexed we need to refresh the display very quickly (display one digit at a time, others are off), for that I used Timer2 module (8-bit timer) interrupt with 1:16 prescaler and 1:2 postoscaler, this means Timer2 overflows every 2048 microseconds { 256/[8/(4 x 16)] = 256 x 8 = 2048 microseconds } and its interrupt occurred every 4096 microseconds (postoscaler = 2).

Timer2 module configuration is shown below (255 is the preload value):

CCS C Code:

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.