Home » » Multiplexed 4 digit 7 segment display mit Arduino ansteuern

Multiplexed 4 digit 7 segment display mit Arduino ansteuern

The first experiments with a 4-digit 7-segment LED display are a minimal variant without transistors, additional shift registers or ICs. Also on libraries I have omitted to understand better how the control of the display works. This allows me to not only the usual numbers and letters spending (most anyway), which is not provided in the libraries in the normal case. However, I use the code portions of the Library SevSeg Dean of Reading.
 
Project Objective
Numbers and - as far as this is possible with a 7-segment display - Display letters on a 4-digit 7-segment LED display, but the characters to be displayed via the serial interface are read.


Components
This example uses a multiplexed display (only 12 pins instead of 16) in the variant common cathode, ie the 4 pins for the 4 characters be connected to GND and the 8 pins for 7 segments and the decimal point on the stream. There are countless LED display with a variety of cabling, so absolutely you need the right data sheet.

     1 Arduino Uno R3

     1 breadboard
     1 multiplexed LED display LN3461AS2B, common cathode, 12 pins (source Switzerland, data sheet) 4-digit 7-segment
     4 ohm resistors 680
     12 Jumper Cable M / M
     a few wire connections so that the display in the tangle of cables not totally disappear

The waiver of transistors causes the segments that actually swallow 1.8 V and 20 mA per segment, are supplied with electricity, and light is not very bright. For initial experiments, and for display in the dark, it is sufficient but all times.

Multiplexing means incidentally in connection with this display that out of the 4 digits only 1 is turned on at the same time. If this is done quickly enough, then the slow human eye duped and we think we see light at the same time every 4 digits. Who wants to know more, the web provides dozens of good returns, for example Here.


Silkscreen and Cabling
 So that the display does not simply prints chopsticks salad, the wiring must of course be exactly right. The pins of the display are numbered from 1, lower left, as usual, about 6 bottom right to top left 12 counterclockwise. Between the 4 digit pin and the associated Arduino Pins ever comes a resistor.

Here my wiring of display pins with Arduino pins, as described in the data sheet linked. In contrast, the segments are known clockwise from top with A to G, where G is the average cross bar.
What display pin Arduino pin Caution
Digit 1 12 2 680 ohm resistor between
Digit 2 9 3 680 ohm resistor between
Digit 3 8 4 680 ohm resistor between
Digit 4 6 5 680 ohm resistor between
Segment A (top) 11 6
segment B
(top right) 7 7
segment C
(bottom right) 4 8
Segment D (below) 2 9
segment e
(bottom left) 1 10
segment F
(top left) 10 11
Segment G (middle line) 5 12
DP 3 decimal 13

  
Code
The code goes once more into the chapter "Why I hate C with all my heart!". He is very long, but consists of countless almost identical steps and repetition because it's not been able to assemble an array of other arrays in C. That it is tricky to pass an array as a parameter in a method that is what I've already complained in my Arduino Cheat Sheet. Therefore, all the code is no further subdivision in the loop.

Reading from the serial port again, I have already described in the article "Arduino as a clock."


/*  4 digit 7 segment LED display common cathode
 *  display shows numbers and letters from the serial interface
 *  without the use of a library
 *  every digit can have a decimal point
 *  decimal point can be entered with . or ,
 *
 * Author: Silvia Rothen, rothen ecotronics, Bern, Switzerland
 * part of the code is from the library SevSeg by Dean Reading
 */
  
boolean DigitOn = LOW;
boolean DigitOff = HIGH;
boolean SegOn=HIGH;
boolean SegOff=LOW;
int DigitPins[] = {2, 3, 4, 5};
int SegmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
 
//looks terrible, but I didn't find a way to copy Arrays or merge them from parts
//N is for numbers and NxP is a number with a decimal point behind
int BLANK[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
int N0[]    = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW};
int N0P[]   = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, HIGH};
int N1[]    = {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW};
int N1P[]   = {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, HIGH};
int N2[]    = {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW};
int N2P[]   = {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH};
int N3[]    = {HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW};
int N3P[]   = {HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH};
int N4[]    = {LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW};
int N4P[]   = {LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH};
int N5[]    = {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW};
int N5P[]   = {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH};
int N6[]    = {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW};
int N6P[]   = {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
int N7[]    = {HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW};
int N7P[]   = {HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, HIGH};
int N8[]    = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW};
int N8P[]   = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
int N9[]    = {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW};
int N9P[]   = {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, HIGH};
int MIN[]   = {LOW, LOW, LOW, LOW, LOW, LOW, HIGH, LOW};
//The letters K, M, N, T, V, W, Z are off limits with a 7 segment display
//Some letters like D, G, Q are hard to recognize, as D is like O and G like 6
int A[] = {HIGH, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, LOW};
int B[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW};
int C[] = {HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW};
int D[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW};
int E[] = {HIGH, LOW, LOW, HIGH, HIGH, HIGH, HIGH, LOW};
int F[] = {HIGH, LOW, LOW, LOW, HIGH, HIGH, HIGH, LOW};
int G[] = {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW};
int H[] = {LOW, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, LOW};
int I[] = {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW};
int J[] = {LOW, HIGH, HIGH, HIGH, HIGH, LOW, LOW, LOW};
int L[] = {LOW, LOW, LOW, HIGH, HIGH, HIGH, LOW, LOW};
int O[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW};
int P[] = {HIGH, HIGH, LOW, LOW, HIGH, HIGH, HIGH, LOW};
int Q[] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, HIGH};
int R[] = {HIGH, HIGH, HIGH, LOW, HIGH, HIGH, HIGH, LOW};
int S[] = {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW};
int U[] = {LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW};
int Y[] = {LOW, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW};
 
//Array of pointers for the 4 digits
int* lights[4];
 
//char array coming from the serial interface
//4 numbers or chars, 4 optional decimal points, 1 end-of-line char
char incoming[9] = {};
 
void setup() {
  Serial.begin(9600);
 
  for (byte digit=0;digit<4;digit++) {
    pinMode(DigitPins[digit], OUTPUT);
  }
  for (byte seg=0;seg<8;seg++) {
    pinMode(SegmentPins[seg], OUTPUT);
  }
  //initialize display with 1.234
  lights[0] = N1P;
  lights[1] = N2;
  lights[2] = N3;
  lights[3] = N4;
}
 
void loop() {
  //read the numbers and / or chars from the serial interface
  if (Serial.available() > 0) {
    int i = 0;
    //clear the array of char
    memset(incoming, 0, sizeof(incoming));
    while (Serial.available() > 0 && i < sizeof(incoming) - 1) {
      incoming[i] = Serial.read();
      i++;
      delay(3);
    }
    Serial.println(incoming);
     
    //tmp is for the incoming string and counter for the 4 digits
    int counter = -1;
    for (int tmp = 0; tmp < 9; tmp++) {
      counter++;
      switch(incoming[tmp]){
        case '0':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N0P;
            tmp++;
          } else {
            lights[counter] = N0;
          }
          break;
        case '1':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N1P;
            tmp++;
          } else {
            lights[counter] = N1;
          }
          break;
        case '2':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N2P;
            tmp++;
          } else {
            lights[counter] = N2;
          }
          break;
        case '3':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N3P;
            tmp++;
          } else {
            lights[counter] = N3;
          }
          break;
        case '4':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N4P;
            tmp++;
          } else {
            lights[counter] = N4;
          }
          break;
        case '5':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N5P;
            tmp++;
          } else {
            lights[counter] = N5;
          }
          break;
        case '6':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N6P;
            tmp++;
          } else {
            lights[counter] = N6;
          }
          break;
        case '7':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N7P;
            tmp++;
          } else {
            lights[counter] = N7;
          }
          break;
        case '8':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N8P;
            tmp++;
          } else {
            lights[counter] = N8;
          }
          break;
        case '9':
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            lights[counter] = N9P;
            tmp++;
          } else {
            lights[counter] = N9;
          }
          break;
        case '-':
          lights[counter] = MIN;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        //with letters the decimal point is ignored!
        //if you need it, just write AP, BP etc with HIGH in the last position
        case 'a': //falls through to the next case
        case 'A':
          lights[counter] = A;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'b': //falls through to the next case
        case 'B':
          lights[counter] = B;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'c': //falls through to the next case
        case 'C':
          lights[counter] = C;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'd': //falls through to the next case
        case 'D':
          lights[counter] = D;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'e': //falls through to the next case
        case 'E':
          lights[counter] = E;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'f': //falls through to the next case
        case 'F':
          lights[counter] = F;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'g': //falls through to the next case
        case 'G':
          lights[counter] = G;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'h': //falls through to the next case
        case 'H':
          lights[counter] = H;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'i': //falls through to the next case
        case 'I':
          lights[counter] = I;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'j': //falls through to the next case
        case 'J':
          lights[counter] = J;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'l': //falls through to the next case
        case 'L':
          lights[counter] = L;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'o': //falls through to the next case
        case 'O':
          lights[counter] = O;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'p': //falls through to the next case
        case 'P':
          lights[counter] = P;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'q': //falls through to the next case
        case 'Q':
          lights[counter] = Q;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'r': //falls through to the next case
        case 'R':
          lights[counter] = R;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 's': //falls through to the next case
        case 'S':
          lights[counter] = S;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'u': //falls through to the next case
        case 'U':
          lights[counter] = U;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;       
        case 'y': //falls through to the next case
        case 'Y':
          lights[counter] = Y;
          if (tmp  < 8 && (incoming[tmp + 1] == '.' || incoming[tmp + 1] == ',')) {
            tmp++;
          }
          break;      
        case 1 ... 43: counter--; break;//special chars are ignored
        //44 to 46 are , - .
        case 47: counter--; break;//special chars are ignored
        //chars between Z and a
        case 91 ... 96: counter--; break;//special chars are ignored
        case 123 ... 127: counter--; Serial.println("above 122"); break;//special chars are ignored
         
        default: lights[counter] = BLANK;
      }
    } //end for
     
    //show the input values
    for (int y = 0; y < 4; y++) {
      Serial.print(y);
      Serial.print(": ");
      for (int z = 0; z < 8; z++) {
        Serial.print(lights[y][z]);
      }
      Serial.println("");
    }
  } //end if, i.e. reading from serial interface
 
  //This part of the code is from the library SevSeg by Dean Reading
  for (byte seg=0;seg<8;seg++) {
    //Turn the relevant segment on
    digitalWrite(SegmentPins[seg],SegOn);
 
    //For each digit, turn relevant digits on
    for (byte digit=0;digit<4;digit++){
      if (lights[digit][seg]==1) {
        digitalWrite(DigitPins[digit],DigitOn);
      }
      //delay(200); //Uncomment this to see it in slow motion
    }
    //Turn all digits off
    for (byte digit=0;digit<4;digit++){
      digitalWrite(DigitPins[digit],DigitOff);
    }
 
    //Turn the relevant segment off
    digitalWrite(SegmentPins[seg],SegOff);
  } //end of for
}
Share this Post :

0 comments:

 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2013. Magnificent of Indonesia - All Rights Reserved
Template Created by Creating Website Published by Mas Template
Proudly powered by Blogger