#include <ShiftRegister74HC595.h>
#include <RTClib.h> // Include the RTClib library for DS1307 RTC
// Define the pin for the mode button
#define MODE_BUTTON_PIN 10 // Example pin number, replace with your actual pin
// Shift register Pin definitions
#define DS_PIN 4 // DS - Pin 04
#define STCP_PIN 3 // STCP - PIN 03
#define SHCP_PIN 2 // SHCP - PIN 02
// Create instances of ShiftRegister74HC595 for each shift register with size
ShiftRegister74HC595<24> sr(DS_PIN, SHCP_PIN, STCP_PIN);
// Pin Definitions for 4-digit 7-segment display
const int segDataLine1[4] = {14, 15, 16, 17}; // First 4-Digit 7-Segment Display (Display 1). Pins for each digit (D1-D4)
const int segDataLine2[4] = {18, 19, 20, 21}; // Second 4-Digit 7-Segment Display (Display 2). Pins for each digit (D1-D4)
// Digit patterns for common cathode display (with decimal points)
const byte digitPatterns[10] = {
B00111111, // Digit 0
B00000110, // Digit 1
B01011011, // Digit 2
B01001111, // Digit 3
B01100110, // Digit 4
B01101101, // Digit 5
B01111101, // Digit 6
B00000111, // Digit 7
B01111111, // Digit 8
B01101111 // Digit 9
};
// Define segment mapping for each display
int segMapDisplay1[7] = {0, 1, 2, 3, 4, 5, 6}; // A-G Segment mapping for Display 1
int segMapDisplay2[7] = {7, 8, 9, 10, 11, 12, 13}; // A-G Segment mapping for Display 2
int segDecimalPoints[7] = {22, 23}; // Segment mapping for Decimal Point
RTC_DS1307 rtc; // Real Time Clock using RTC_DS1307 library
void setup() {
// Initialize shift register pins as outputs
for (int i = 0; i < 4; i++) {
pinMode(segDataLine1[i], OUTPUT);
pinMode(segDataLine2[i], OUTPUT);
}
// Initialize the RTC
rtc.begin();
// If the RTC isn't running, set the time and date manually
if (!rtc.isrunning()) {
rtc.adjust(DateTime(2024, 3, 24, 10, 0, 0)); // Set RTC to 03/24/2024 10:00:00
}
}
void loop() {
displayTimeOrDate(); // Display time or date based on mode button
}
void displayTimeOrDate() {
DateTime now = rtc.now(); // Get current date and time from RTC
if (digitalRead(MODE_BUTTON_PIN) == HIGH) { // Check if mode button is pressed
displayTime(now); // Display current time
} else {
displayDate(now); // Display current date
}
delay(1000); // Delay for 1 second
}
void displayTime(DateTime time) {
byte hour = time.hour();
byte minute = time.minute();
byte second = time.second();
displayNumber(hour / 10, segDataLine1); // Display hour tens digit on first display
displayNumber(hour % 10, segDataLine2); // Display hour ones digit on second display
delay(5); // Delay for multiplexing effect
displayNumber(minute / 10, segDataLine1); // Display minute tens digit on first display
displayNumber(minute % 10, segDataLine2); // Display minute ones digit on second display
delay(5); // Delay for multiplexing effect
displayNumber(second / 10, segDataLine1); // Display second tens digit on first display
displayNumber(second % 10, segDataLine2); // Display second ones digit on second display
}
void displayDate(DateTime time) {
byte month = time.month();
byte day = time.day();
int year = time.year();
displayNumber(month / 10, segDataLine1); // Display month tens digit on first display
displayNumber(month % 10, segDataLine2); // Display month ones digit on second display
delay(5); // Delay for multiplexing effect
displayNumber(day / 10, segDataLine1); // Display day tens digit on first display
displayNumber(day % 10, segDataLine2); // Display day ones digit on second display
delay(5); // Delay for multiplexing effect
displayNumber(year / 1000, segDataLine1); // Display year thousands digit on first display
displayNumber((year % 1000) / 100, segDataLine2); // Display year hundreds digit on second display
}
void displayNumber(int number, const int* segDataLine) {
byte pattern = digitPatterns[number];
sr.setAllLow(); // Set all segments to low initially (turn off)
// Set the segments according to the pattern
for (int i = 0; i < 7; i++) {
sr.set(segMapDisplay1[i], bitRead(pattern, i));
sr.set(segMapDisplay2[i], bitRead(pattern, i));
}
// Output the pattern to the corresponding display's segment lines
for (int i = 0; i < 4; i++) {
digitalWrite(segDataLine[i], bitRead(pattern, i));
}
sr.updateRegisters(); // Update the shift registers with the new data
}