100% found this document useful (1 vote)
285 views21 pages

Manual Adjust For RTC Clock With Arduino and 7-Segment LED

This document describes code for controlling a 4-digit 7-segment display using an Arduino. It initializes pin connections for the display digits and segments. It also initializes an RTC (real-time clock) module connected via I2C to keep time. Functions are defined to display numbers on the display by turning on the appropriate segments, as well as to set the time on the RTC by pressing buttons to increment hours and minutes values.

Uploaded by

frasekh
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
Download as docx, pdf, or txt
100% found this document useful (1 vote)
285 views21 pages

Manual Adjust For RTC Clock With Arduino and 7-Segment LED

This document describes code for controlling a 4-digit 7-segment display using an Arduino. It initializes pin connections for the display digits and segments. It also initializes an RTC (real-time clock) module connected via I2C to keep time. Functions are defined to display numbers on the display by turning on the appropriate segments, as well as to set the time on the RTC by pressing buttons to increment hours and minutes values.

Uploaded by

frasekh
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1/ 21

/*

4 digit 7 segment display: http://www.sparkfun.com/products/9483


Datasheet: http://www.sparkfun.com/datasheets/Components/LED/7Segment/YSD-439AR6B-35.pdf
7 segments + 4 digits + 1 colon = 12 pins required for full control
*/
// modified connexion by niq_ro from http://nicuflorica.blogspot.com
// for my Luckylight KW4-563ASA
// dataseet:
http://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW4563XSA.pdf
int digit1 =
right side)
int digit2 =
int digit3 =
int digit4 =
side)

11; //PWM Display pin 12 (digit1 is common anonds A1 from


10; //PWM Display pin 9 (digit2 is common A2)
9; //PWM Display pin 8 (digit3 is common anods A3)
6; //PWM Display pin 6 (digit4 is common anods, from left

//Pin mapping from Arduino to the ATmega DIP28 if you need it


//http://www.arduino.cc/en/Hacking/PinMapping
int segA = 2; //Display pin 11
int segB = 3; //Display pin 7
int segC = 4; //Display pin 4
int segD = 5; //Display pin 2
int segE = 12; //Display pin 1
int segF = 7; //Display pin 10
int segG = 8; //Display pin 5
int segDP = 13; // Display pin 3
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
// Date and time functions using a DS1307 RTC connected via I2C and
Wire lib
// original sketck from http://learn.adafruit.com/ds1307-real-timeclock-breakout-board-kit/
// add part with SQW=1Hz from
http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-thei2c-bus/
// add part with manual adjust
http://www.bristolwatch.com/arduino/arduino_ds1307.htm

byte SW0 = A0;


byte SW1 = A1;
byte SW2 = A2;
// use for hexa in zecimal conversion
int zh, uh, ore;

int zm, um, miniti;


void setup() {
// Serial.begin(57600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
// if you need set clock... just remove // from line above this
// part code for flashing LED
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
// Wire.write(0x00); // turns the SQW pin off
Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control
register - turns on square wave at 1Hz
// Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) 32kHz
Wire.endTransmission();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was
compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// dht.begin();
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
pinMode(digit1,
pinMode(digit2,
pinMode(digit3,
pinMode(digit4,
//

OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);

pinMode(13, OUTPUT);

Serial.begin(9600);
Serial.println("test for niq_ro");
pinMode(SW0, INPUT); // for this use a slide switch
pinMode(SW1, INPUT); // N.O. push button switch

pinMode(SW2, INPUT);

// N.O. push button switch

digitalWrite(SW0, HIGH); // pull-ups on


digitalWrite(SW1, HIGH);
digitalWrite(SW2, HIGH);

}
void loop() {
digitalWrite(segDP, HIGH);
DateTime now = RTC.now();
int timp = now.hour()*100+now.minute();
//
int timp = (now.minute(), DEC);
//
displayNumber(12); // this is number to diplay
//
int timp = 1234;
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(" -> ");
Serial.print(timp);
Serial.println(" !");
// display parts
for(int i = 250 ; i >0 ; i--) {
if (timp > 1000) displayNumber01(timp);
else displayNumber02(timp);
}
for(int i = 250 ; i >0 ; i--) {
if (timp > 1000) displayNumber03(timp);
else displayNumber04(timp);
}
if (!(digitalRead(SW0))) set_time(); // hold the switch to set time
}
void set_time()
{
byte minutes1 = 0;
byte hours1 = 0;
byte minutes = 0;
byte hours = 0;
while (!digitalRead(SW0))
exit
{
minutes1=minutes;
hours1=hours;

// set time switch must be released to

while (!digitalRead(SW1)) // set minutes


{
minutes++;
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for(int i = 20 ; i >0 ; i--) {
displayNumber01(ore*100+miniti);
}
if ((minutes & 0x0f) > 9) minutes = minutes + 6;
if (minutes > 0x59) minutes = 0;
Serial.print("Minutes = ");
if (minutes >= 9) Serial.print("0");
Serial.println(minutes, HEX);
delay(150);
}
while (!digitalRead(SW2)) // set hours
{
hours++;
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for(int i = 20 ; i >0 ; i--) {
displayNumber01(ore*100+miniti);
}
if ((hours & 0x0f) > 9) hours = hours + 6;
if (hours > 0x23) hours = 0;
Serial.print("Hours = ");
if (hours <= 9) Serial.print("0");
Serial.println(hours, HEX);
delay(150);
}
Wire.beginTransmission(0x68); // activate DS1307

Wire.write(0); // where to begin


Wire.write(0x00);
//seconds
Wire.write(minutes);
//minutes
Wire.write(0x80 | hours);
//hours (24hr time)
Wire.write(0x06); // Day 01-07
Wire.write(0x01); // Date 0-31
Wire.write(0x05); // month 0-12
Wire.write(0x09); // Year 00-99
Wire.write(0x10); // Control 0x10 produces a 1 HZ square wave on
pin 7.
Wire.endTransmission();
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;

//

for(int i = 20 ; i >0 ; i--) {


displayNumber01(ore*100+miniti);
}
delay(150);

}
}

void displayNumber01(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);

digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

void displayNumber02(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
lightNumber(10);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);

//Turn off all segments


lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

void displayNumber03(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

}
void displayNumber04(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
lightNumber(10);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

//Given a number, turns on those segments


//If number == 10, then turn off number
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH

switch (numberToDisplay){
case 0:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);

case 1:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);

case 2:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);

case 3:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_ON);

case 4:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

case 5:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

case 6:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);

case 7:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);

case 8:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);

case 9:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

// all segment are ON


case 10:

digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);

}
}
/*
4 digit 7 segment display: http://www.sparkfun.com/products/9483
Datasheet: http://www.sparkfun.com/datasheets/Components/LED/7Segment/YSD-439AR6B-35.pdf
7 segments + 4 digits + 1 colon = 12 pins required for full control
*/
// modified connexion by niq_ro from http://nicuflorica.blogspot.com
// for my Luckylight KW4-563ASA
// dataseet:
http://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW4563XSA.pdf
int digit1 =
right side)
int digit2 =
int digit3 =
int digit4 =
side)

11; //PWM Display pin 12 (digit1 is common anonds A1 from


10; //PWM Display pin 9 (digit2 is common A2)
9; //PWM Display pin 8 (digit3 is common anods A3)
6; //PWM Display pin 6 (digit4 is common anods, from left

//Pin mapping from Arduino to the ATmega DIP28 if you need it


//http://www.arduino.cc/en/Hacking/PinMapping
int segA = 2; //Display pin 11
int segB = 3; //Display pin 7
int segC = 4; //Display pin 4
int segD = 5; //Display pin 2
int segE = 12; //Display pin 1
int segF = 7; //Display pin 10
int segG = 8; //Display pin 5
int segDP = 13; // Display pin 3
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
// Date and time functions using a DS1307 RTC connected via I2C and
Wire lib
// original sketck from http://learn.adafruit.com/ds1307-real-timeclock-breakout-board-kit/
// add part with SQW=1Hz from
http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-thei2c-bus/

// add part with manual adjust


http://www.bristolwatch.com/arduino/arduino_ds1307.htm

byte SW0 = A0;


byte SW1 = A1;
byte SW2 = A2;
// use for hexa in zecimal conversion
int zh, uh, ore;
int zm, um, miniti;
void setup() {
// Serial.begin(57600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
// if you need set clock... just remove // from line above this
// part code for flashing LED
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
// Wire.write(0x00); // turns the SQW pin off
Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control
register - turns on square wave at 1Hz
// Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) 32kHz
Wire.endTransmission();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was
compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// dht.begin();
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
pinMode(digit1, OUTPUT);

pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
//

pinMode(13, OUTPUT);

Serial.begin(9600);
Serial.println("test for niq_ro");
pinMode(SW0, INPUT); // for this use a slide switch
pinMode(SW1, INPUT); // N.O. push button switch
pinMode(SW2, INPUT); // N.O. push button switch
digitalWrite(SW0, HIGH); // pull-ups on
digitalWrite(SW1, HIGH);
digitalWrite(SW2, HIGH);

}
void loop() {
digitalWrite(segDP, HIGH);
DateTime now = RTC.now();
int timp = now.hour()*100+now.minute();
//
int timp = (now.minute(), DEC);
//
displayNumber(12); // this is number to diplay
//
int timp = 1234;
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(" -> ");
Serial.print(timp);
Serial.println(" !");
// display parts
for(int i = 250 ; i >0 ; i--) {
if (timp > 1000) displayNumber01(timp);
else displayNumber02(timp);
}
for(int i = 250 ; i >0 ; i--) {
if (timp > 1000) displayNumber03(timp);
else displayNumber04(timp);
}
if (!(digitalRead(SW0))) set_time(); // hold the switch to set time
}
void set_time()
{
byte minutes1 = 0;

byte hours1 = 0;
byte minutes = 0;
byte hours = 0;
while (!digitalRead(SW0))
exit
{
minutes1=minutes;
hours1=hours;

// set time switch must be released to

while (!digitalRead(SW1)) // set minutes


{
minutes++;
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for(int i = 20 ; i >0 ; i--) {
displayNumber01(ore*100+miniti);
}
if ((minutes & 0x0f) > 9) minutes = minutes + 6;
if (minutes > 0x59) minutes = 0;
Serial.print("Minutes = ");
if (minutes >= 9) Serial.print("0");
Serial.println(minutes, HEX);
delay(150);
}
while (!digitalRead(SW2)) // set hours
{
hours++;
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for(int i = 20 ; i >0 ; i--) {
displayNumber01(ore*100+miniti);
}

if ((hours & 0x0f) > 9) hours = hours + 6;


if (hours > 0x23) hours = 0;
Serial.print("Hours = ");
if (hours <= 9) Serial.print("0");
Serial.println(hours, HEX);
delay(150);
}
Wire.beginTransmission(0x68); // activate DS1307
Wire.write(0); // where to begin
Wire.write(0x00);
//seconds
Wire.write(minutes);
//minutes
Wire.write(0x80 | hours);
//hours (24hr time)
Wire.write(0x06); // Day 01-07
Wire.write(0x01); // Date 0-31
Wire.write(0x05); // month 0-12
Wire.write(0x09); // Year 00-99
Wire.write(0x10); // Control 0x10 produces a 1 HZ square wave on
pin 7.
Wire.endTransmission();
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;

//

for(int i = 20 ; i >0 ; i--) {


displayNumber01(ore*100+miniti);
}
delay(150);

}
}

void displayNumber01(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {

case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

void displayNumber02(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
lightNumber(10);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, LOW);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);

digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

void displayNumber03(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);

//Turn off all segments


lightNumber(10);

}
}

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

void displayNumber04(int toDisplay) {


#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
lightNumber(10);
digitalWrite(segDP, HIGH);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
digitalWrite(segDP, HIGH);
break;
}
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
//Turn off all segments
lightNumber(10);

//Turn off all digits


digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);

}
//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
switch (numberToDisplay){
case 0:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);

case 1:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);

case 2:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);

case 3:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_ON);

case 4:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

case 5:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

case 6:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);

case 7:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);
SEGMENT_OFF);

case 8:
digitalWrite(segA,
digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);

case 9:
digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB,
digitalWrite(segC,
digitalWrite(segD,
digitalWrite(segE,
digitalWrite(segF,
digitalWrite(segG,
break;

SEGMENT_ON);
SEGMENT_ON);
SEGMENT_ON);
SEGMENT_OFF);
SEGMENT_ON);
SEGMENT_ON);

// all segment are ON


case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}

You might also like