/*
Controlling large 7-segment displays
By: Nathan Seidle
SparkFun Electronics
Date: February 25th, 2015
License: This code is public domain but you buy me a beer if you use
this and we meet someday (Beerware license).
This code demonstrates how to post two numbers to a 2-digit
display usings two large digit driver boards.
Here's how to hook up the Arduino pins to the Large Digit Driver IN
Arduino pin 6 -> CLK (Green on the 6-pin cable)
5 -> LAT (Blue)
7 -> SER on the IN side (Yellow)
5V -> 5V (Orange)
Power Arduino with 12V and connect to Vin -> 12V (Red)
GND -> GND (Black)
There are two connectors on the Large Digit Driver. 'IN' is the input
side that should be connected to
your microcontroller (the Arduino). 'OUT' is the output side that should
be connected to the 'IN' of addtional
digits.
Each display will use about 150mA with all segments and decimal point on.
SN74HC595/6 PIN Equivalente
14 DS 14 SER SERIAL_IN
13 OE 13 OE GND
12 STCP 12 RCLK LATCH
11 SHCP 11 SRCLK CLOCK
10 MR 10 SRCLR +V
9 Q7S 9 QH SERIAL_OUT
*/
//GPIO declarations
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
byte segmentClock = 6;
byte segmentLatch = 5;
byte segmentData = 7;
#define blueBt 2
#define redBt 3
#define blueLed 4
#define redLed 8
int number = 0;
unsigned long oneSeg = 1000;
unsigned long myTime = 0;
bool redSet = false;
bool blueSet = false;
//--------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("Large Digit Driver Example");
pinMode(segmentClock, OUTPUT);
pinMode(segmentData, OUTPUT);
pinMode(segmentLatch, OUTPUT);
pinMode(blueBt, INPUT_PULLUP);
pinMode(redBt, INPUT_PULLUP);
pinMode(blueLed, OUTPUT);
pinMode(redLed, OUTPUT);
digitalWrite(segmentClock, LOW);
digitalWrite(segmentData, LOW);
digitalWrite(segmentLatch, LOW);
showNumber(number); //Test pattern
myTime = millis();
}
//--------------------------------------------------------------------
void loop()
{
if (redSet == true)
{
if (millis() - myTime >= oneSeg)
{
myTime = millis();
if (number <= 0)
{
number = 0;
// digitalWrite(redLed, LOW);
showNumber(number); //Test pattern
}
else
{
number--;
showNumber(number); //Test pattern
}
}
}
if (digitalRead(redBt) == LOW and redSet == false)
{
myTime = millis();
redSet = true;
number = 10;
showNumber(number); //Test pattern
digitalWrite(redLed, HIGH);
}
if (digitalRead(redBt) == HIGH and redSet == true)
{
redSet = false;
digitalWrite(redLed, LOW);
showNumber(0); //Test pattern
}
if (blueSet == true)
{
if (millis() - myTime >= oneSeg)
{
myTime = millis();
if (number <= 0)
{
number = 0;
//digitalWrite(blueLed, LOW);
showNumber(number); //Test pattern
}
else
{
number--;
showNumber(number); //Test pattern
}
}
}
if (digitalRead(blueBt) == LOW and blueSet == false)
{
myTime = millis();
blueSet = true;
number = 10;
showNumber(number); //Test pattern
digitalWrite(blueLed, HIGH);
}
if (digitalRead(blueBt) == HIGH and blueSet == true)
{
blueSet = false;
digitalWrite(blueLed, LOW);
showNumber(0); //Test pattern
}
}
//--------------------------------------------------------------------
//Takes a number and displays 2 numbers. Displays absolute value
// (no negatives)
void showNumber(float value)
{
int number = abs(value); //Remove negative signs and any decimals
for (byte x = 0 ; x < 2 ; x++)
{
int remainder = number % 10;
postNumber(remainder, false);
number /= 10;
}
//Latch the current segment data
digitalWrite(segmentLatch, LOW);
digitalWrite(segmentLatch, HIGH); //Register moves storage register
// on the rising edge of RCK
}
//Given a number, or '-', shifts it out to the display
void postNumber(byte number, boolean decimal)
{
// - A
// / / F/B
// - G
// / / E/C
// -. D/DP
#define a 1<<0
#define b 1<<6
#define c 1<<5
#define d 1<<4
#define e 1<<3
#define f 1<<1
#define g 1<<2
#define dp 1<<7
byte segments;
switch (number)
{
case 1: segments = b | c; break;
case 2: segments = a | b | d | e | g; break;
case 3: segments = a | b | c | d | g; break;
case 4: segments = f | g | b | c; break;
case 5: segments = a | f | g | c | d; break;
case 6: segments = a | f | g | e | c | d; break;
case 7: segments = a | b | c; break;
case 8: segments = a | b | c | d | e | f | g; break;
case 9: segments = a | b | c | d | f | g; break;
case 0: segments = a | b | c | d | e | f; break;
case ' ': segments = 0; break;
case 'c': segments = g | e | d; break;
case '-': segments = g; break;
}
if (decimal) segments |= dp;
//Clock these bits out to the drivers
for (byte x = 0 ; x < 8 ; x++)
{
digitalWrite(segmentClock, LOW);
digitalWrite(segmentData, segments & 1 << (7 - x));
digitalWrite(segmentClock, HIGH); //Data transfers to the register on the rising edge of SRCK
}
}