8 x 14 segment micro LED display Arduino


Dit lukte met drie shiftregisters, die ik allen op dezelfde latch en clock zette. Door ze te koppelen zou ik hebben kunnen volstaan met één datalijn, maar besloot voor de snelheid alle drie de HC595 een eigen datalijn te geven. Hierdoor kon ik in de tijd van 1 byte, alle 24 pinnetjes van stroom of aarde voorzien. De 16 outputlijnen van 2 shiftregisters verzorgen alle anodes (14 plussen, 2 over). De 8 outputlijnen van de derde shiftregister, bedienen de 8 kathodes (minnen). Ik moet bij deze laatste dan wel steeds alle lijnen op 5 volt hebben staan, behoudens de lijn die voor GND dient.
Uit voorzorg had ik in mijn initiele ontwerp alle anodes van een weerstand voorzien, maar door het multiplexen werd het licht te zwak. Zonder weerstandjes trekt het hele systeem (inclusief ATmega) rond de 63 mA. Ik durf best 2 van die displays aan te sluitenn op één microcontroller. Grote kans dat het goed gaat. Kleine kans dat ik euro 4,50 aan ATmel kapot experimenteer….

In tegenstelling tot de DL2416 heeft dit display geen ASCII-set of eigen ‘refresh’ aan boord. Verder heeft dit display 14 segmenten, terwijl de 2416 er 17 heeft: het bovenste en onderste streepje is in twee segmenten i.p.v. 1 en er is een separate punt.

Nu moet ik nog een karakterset maken voor het 14 segment display. Wil hier eigenlijk een Processing-app van maken, maar mogelijk gewoon handwerk.

——–pjh———-

En het werd handwerk: ik heb een ascii-set gemaakt, die van de spatie tot voorbij de Z loopt. Dus van ascii 32 tot ascii 32+64. Omdat de spatie de eerste is, loopt het feitelijk van 0 tot 64.

Een eerste test, waarbij ik willekeurige tekens ongeveer een seconde toon, om daarna weer opnieuw te beginnen.

Hier de arduino output van de arduino sketcht verderop.



int ascii[]={
  0x00, 0x00, // spatie
  0x01, 0x4A, // !
  0x22, 0x00, // "
  0x0E, 0x55, // #
  0x39, 0x55, // euro. voor dollar 0x2D, 0x55
  0x24, 0x88, // %
  0x1D, 0x2B, // &
  0x00, 0x08, // '
  0x39, 0x00, // {
  0x0F, 0x00, // )
  0x00, 0xFF, // *
  0x00, 0x55, // +
  0x00, 0x80, // ,
  0x00, 0x11, //
  0x08, 0x00, // punt?
  0x00, 0x88, // /
  0x3F, 0x00, // 0
  0x00, 0x44, // 1
  0x1B, 0x11, // 2
  0x0F, 0x11, // 3
  0x26, 0x11, // 4
  0x2D, 0x11, // 5
  0x3D, 0x11, // 6
  0x07, 0x00, // 7
  0x3F, 0x11, // 8
  0x2F, 0x11, // 9
  0x01, 0x11, // :
  0x01, 0x80, // ;
  0x00, 0x28, // <
  0x00, 0x82, // >
  0x08, 0x11, // =
  0x03, 0x50, // ?
  0x1F, 0x41, // @
  0x37, 0x11, // A
  0x0F, 0x54, // B
  0x39, 0x00, // C
  0x0F, 0x44, // D
  0x39, 0x01, // E
  0x31, 0x01, // F
  0x3D, 0x10, // G
  0x36, 0x11, // H
  0x09, 0x44, // I
  0x1E, 0x00, // J
  0x30, 0x29, // K
  0x38, 0x00, // L
  0x36, 0x0A, // M
  0x36, 0x22, // N
  0x3F, 0x00, // O
  0x33, 0x11, // P
  0x3F, 0x20, // Q
  0x33, 0x31, // R
  0x2D, 0x11, // S
  0x01, 0x44, // T
  0x3E, 0x00, // U
  0x30, 0x88, // V
  0x36, 0xA0, // W
  0x00, 0xAA, // X
  0x00, 0x4A, // Y
  0x09, 0x88, // Z
  0x39, 0x00, // [
  0x00, 0x88, // /
  0x0F, 0x00, // ]
  0x00, 0xA0, // ^
  0x08, 0x00, // _
  0x00, 0x02, // `
};

int dataPin1  = 5; // HC595-1
int dataPin2  = 4; // HC595-2
int dataPin3  = 6; // HC595-3
int latchPin  = 7; // HC595-1, 2 & 3
int clockPin  = 8; // HC595-1, 2 & 3

int karakter[8]; // fill these with 8 values between 0 - 65 (0x00 - 0x20) to get ascii-charakter 32 - 96 (0x20-0x61)

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(dataPin1, OUTPUT);
  pinMode(dataPin2, OUTPUT);
  pinMode(dataPin3, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

}

void loop(){
for (int kar = 0; kar < 8; kar++){
  karakter[kar] = random(0x41); // filled with random karakter
}
int teller = 700;
while(teller >1){
    draw8(); // this routine draws al 8 karakters one after the other ( karakter[0-8] )
    // there is never more than one charakter 'on'. Persistance of vision gives the illusion of 'all on'.
    teller--; // draw all 8 700 x = aprox. one second
}
}

void shiftIt (byte b1, byte b2, byte b3){
  digitalWrite(latchPin, HIGH);
  for (int k=0; k < 8; k++){
    digitalWrite(clockPin, LOW);
    if ( b1 & (B10000000 >> k) ){
      digitalWrite(dataPin1, HIGH);
    }
    else{
      digitalWrite(dataPin1, LOW);
    }
    if ( b3 & (B10000000 >> k) ){
      digitalWrite(dataPin2, HIGH);
    }
    else{
      digitalWrite(dataPin2, LOW);
    }
    if ( b2 & (B10000000 >> k) ){
      digitalWrite(dataPin3, HIGH);
    }
    else{
      digitalWrite(dataPin3, LOW);
    }

    digitalWrite(clockPin, HIGH);

  }
  digitalWrite(latchPin, LOW);
}

void draw8(){
  for (int seg = 0; seg <8; seg++){
  shiftIt(0xFF -(B0000001 << seg),ascii[(2* karakter[seg])], ascii[(1+ 2* karakter[seg])]);
  }
}

4 Responses to 8 x 14 segment micro LED display Arduino

  1. peter says:

    hey ik heb een vraag heb je toevallig de datasheet voor mij?

    • Paul says:

      Nee, ik heb geen datasheet. Maar ik heb wel met een Engelse kennis die er druk mee bezig is geweest. Ik zal de gegevens even opzoeken en je het mailen. Groet

      • peter says:

        dank je hier voor
        maar nagenoeg is het schema bijna onleesbaar
        is er ergens een duidelijkere te vinden?

  2. Goebish (@goebish) says:

    Hi, thanks for the code, the ascii table really helped !

    I made my own code with a display interrupt instead of having to call draw8() continuously from main().

    I tried your circuit and found that the HC595 driving the cathodes was getting really hot (too hot to touch with finger).
    I solved the issue by running a 22k resistor between this HC595 and its ground.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>