// Rushan Perera
// 74HC595 Shift Register to drive 7 Segments and Digit control
// 14.03.2025
// Version 1.50
//-------------------------------------------------------------- 1584 bytes /121 bytes [Flash-1.54KB /RAM-0.12KB]
#define DATA_PIN 8 // Data out pin
#define CLOCKPIN 7 // Clock out pin
#define LATCHPIN 4 // Latch pin
#define TIME 200 // For Loop delay Time
bool DPT = 0; // For decimal point toggle
byte del_count; // Delay count for decimal point blink (keep value between 05-10)
void setup() {
pinMode(DATA_PIN,1); // Set as output
pinMode(CLOCKPIN,1); // Set as output
pinMode(LATCHPIN,1); // Set as output
}
void loop() {
int i;
// Shift_V2_Segment(Value,Segment,Decimal Point On/Off); (Shift Value To Segment)
for(i = 0; i < TIME; i++){
Shift_V2_Segment(1,1,0); // Show value 1 in segment 1
Shift_V2_Segment(2,2,0); // Show value 2 in segment 2
Shift_V2_Segment(3,3,0); // Show value 3 in segment 3
Shift_V2_Segment(4,4,2); // Show value 4 in segment 4
delay(1);
}
for(i = 0; i < TIME; i++){
Shift_V2_Segment(5,1,0); // Show value 5 in segment 5
Shift_V2_Segment(6,2,1); // Show value 6 in segment 6 with decimal point
Shift_V2_Segment(7,3,0); // Show value 7 in segment 7
Shift_V2_Segment(8,4,0); // Show value 8 in segment 8
delay(1);
}
for(i = 0; i < TIME; i++){
Shift_V2_Segment(9,1,0); // Show value 9 in segment 1
Shift_V2_Segment(0,2,0); // Show value 0 in segment 2
Shift_V2_Segment(10,3,2); // Show blank in segment 3 and blink its decimal point
delay(1);
}
}
//-------------------------------------------------------------- Sub Functions
void Shift_V2_Segment(byte number, byte digit, byte dp){
//-------------------------------------------------- Put Value to LEDs
char Segment[11][8] = { // MSB 1st 0->>7
{0,0,1,1,1,1,1,1}, //0
{0,0,0,0,0,1,1,0}, //1
{0,1,0,1,1,0,1,1}, //2
{0,1,0,0,1,1,1,1}, //3
{0,1,1,0,0,1,1,0}, //4
{0,1,1,0,1,1,0,1}, //5
{0,1,1,1,1,1,0,1}, //6
{0,0,0,0,0,1,1,1}, //7
{0,1,1,1,1,1,1,1}, //8
{0,1,1,0,1,1,1,1}, //9
{0,0,0,0,0,0,0,0}, // Blank -> Number 10 shows blank
};
for (byte i = 0; i < 8; i++){
digitalWrite(DATA_PIN,Segment[number][i]);
if (dp==1 && i==0){digitalWrite(DATA_PIN,1);} // Turn ON decimal point
else if (dp==2 && i==0){
del_count++;
if (del_count == 8){
DPT = !DPT, digitalWrite(DATA_PIN,DPT), del_count = 0; // Toggle the decimal point
}
}
Clock();
}
//-------------------------------------------------- Select Segment
char Digits[4][8] = {
{0,0,0,0,1,1,1,0}, // Segment 1
{0,0,0,0,1,1,0,1}, // Segment 2
{0,0,0,0,1,0,1,1}, // Segment 3
{0,0,0,0,0,1,1,1}, // Segment 4
};
for (byte j = 0; j < 8; j++){
digitalWrite(DATA_PIN,Digits[digit-1][j]);
Clock();
}
Latch();
delay(5);
//-------------------------------------------------- Segment Off
for (byte i = 0; i < 8; i++){
digitalWrite(DATA_PIN,0);
Clock();
}
for (byte i = 0; i < 8; i++){
digitalWrite(DATA_PIN,1);
Clock();
}
Latch();
}
//------------------------------------------------------------------ Clock Pulse
void Clock(){
delayMicroseconds(100);
digitalWrite(CLOCKPIN,1), delayMicroseconds(50), digitalWrite(CLOCKPIN,0);
}
//------------------------------------------------------------------ Latch Pulse
void Latch(){
digitalWrite(LATCHPIN,1), delayMicroseconds(50), digitalWrite(LATCHPIN,0), delayMicroseconds(50);
}