Treenut Home | projects | Arduino

Simple 7-Segment Display driver that counts to 10

7-segment
Click to play video

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 .....
The cathode connection on display pin 13 is wired to the ground pin on the Arduino.

    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);
    }