Simple 7-Segment Display driver that counts to 10
Circuit:
Common cathode 7 - segment display chip is connected so the second digit is driven by the Arduino board.Each LED segment is connected through a 240 ohm resistor to digital output ports 6 through 12.
The pins on the display chip for segments A through G are mapped through pins 11, 10, 8, 6, 5, 12, and 7 respectively (pin 9 for the decimal point is not connected)
The segments on the display are lettered with segment A at the top, continuing clockwise around the 'zero' . Ending with segment G as the middle segment (that makes the zero and eight.
I have used jumper wires that are color coded as per resistor code in order to keep these connections straight.
The connection scheme goes like this:
- Brown wire from pin 11 to Pin 6 on Arduino.
- Red wire from chip pin 10 to Pin 7 on Arduino.
- Orange wire from chip pin 8 to Pin 8 on Arduino.
- Yellow wire from pin 6 to Pin 9 on Arduino.
- etc .....
Source Code Listing
/* 7 Segment Display without Delay
Turns on and off a light emitting diode(LED) connected to a digital
pin, without using the delay() function. This means that other code
can run at the same time without being interrupted by the LED code.
The circuit:
* 7 segment common cathode LED display attached from pins 6 through 12 VIA 240 ohm resistors
* ground to common cathode of display pin 13.
Created 2012
by Stuart Baker
*/
// constants won't change. Used here to
// set pin numbers:
const int SegAPin = 6; // the number of the pin driving Segment A
const int SegBPin = 7; // the number of the pin driving Segment B , etc.
const int SegCPin = 8;
const int SegDPin = 9;
const int SegEPin = 10;
const int SegFPin = 11;
const int SegGPin = 12;
// Variables will change:
int dispNum = 0;
int OutMin = 6; // Lowest input pin
int OutMax = 12; // Highest input pin
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to update display (milliseconds)
long previousMillis = 0; // will store last time Display was updated
// setup() function runs one time after Arduino is reset.
void setup() {
// set the digital pins as output:
for(int i=OutMin; i<=OutMax; i++)
{
pinMode(i, OUTPUT);
}
}
/* loop() does just that - it is the driving routine that compiles into something like the main()
of a normal C++ program
*/
void loop()
{
// check to see if it's time to increment the number; that is, if the
// difference between the current time and last time you sent the number
// is bigger than the interval at which you want.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you changed the number
previousMillis = currentMillis;
// Display current value of dispNum on 7-seg display
if (dispNum < 10)
dispNum++;
else
dispNum = 1;
outNum(dispNum);
}
}
/* Following outNum() function sets the Arduina Duemilanova output pins to drive the display segments needed to generate the number according to the interger passed into the x variable.
*/
int outNum(int x)
{
if (x == 0) {
digitalWrite(SegAPin, LOW);
digitalWrite(SegBPin, LOW);
digitalWrite(SegCPin, LOW);
digitalWrite(SegDPin, LOW);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, LOW);
digitalWrite(SegGPin, HIGH);
}
else if (x == 1) {
digitalWrite(SegAPin, LOW);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, LOW);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, LOW);
digitalWrite(SegGPin, LOW);
}
else if (x == 2) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, LOW);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, HIGH);
digitalWrite(SegFPin, LOW);
digitalWrite(SegGPin, HIGH);
}
else if (x == 3) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, LOW);
digitalWrite(SegGPin, HIGH);
}
else if (x == 4) {
digitalWrite(SegAPin, LOW);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, LOW);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, HIGH);
}
else if (x == 5) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, LOW);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, HIGH);
}
else if (x == 6) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, LOW);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, HIGH);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, HIGH);
}
else if (x == 7) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, LOW);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, LOW);
digitalWrite(SegGPin, LOW);
}
else if (x == 8) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, HIGH);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, HIGH);
}
else if (x == 9) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, LOW);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, HIGH);
}
else if (x == 10) {
digitalWrite(SegAPin, HIGH);
digitalWrite(SegBPin, HIGH);
digitalWrite(SegCPin, HIGH);
digitalWrite(SegDPin, HIGH);
digitalWrite(SegEPin, HIGH);
digitalWrite(SegFPin, HIGH);
digitalWrite(SegGPin, LOW);
}