Forum: Mikrocontroller und Digitale Elektronik 32x 16 LED_ Matrix, Wort- und Zeichenausgabe in C


von Philipp K. (Gast)


Lesenswert?

Hallo,
ich bin grade in der Praxisphase und komme nicht weiter mit meinem 
Projekt.
Deswegen brauche ich unbedingt Hilfe. Wie kann ich Zeichen oder ein 
Wort(zum Beispiel Hallo) in C auf der 32x16 LED_ Matrix(aus China, ist 
nicht arduino) darstellen? Kann mir jemand mit den unten aufgeführten C- 
Code mit einem Beispielprogramm dies erläutern? Brauche ich eine Header- 
Datei, wie sieht Sie aus?
Als Prozessor benutze ich den ATMEGA32 auf einer extra Platine und 
steuer damit das Modul an.

Dieser untenaufgeführte Code ist mein Beispielprogramm wie ich ein Pixel 
durch das ganze Modul als eine Art Lauflicht darstelle.

Mein C- Code:

#define F_CPU 14745600
#include <avr/io.h>
#include <util/delay.h>
//#include "thin_ss.h"

#define KANAL_A_DDR                 DDRB
#define KANAL_A_PORT               PORTB
#define KANAL_A_NUMBER              PB7

#define KANAL_B_DDR                 DDRB
#define KANAL_B_PORT              PORTB
#define KANAL_B_NUMBER              PB6

#define KANAL_C_DDR                 DDRB
#define KANAL_C_PORT              PORTB
#define KANAL_C_NUMBER               PB5

#define CLK_DDR                   DDRB
#define CLK_PORT                  PORTB
#define CLK_NUMBER                  PB4

#define LATCH_DDR                 DDRB
#define LATCH_PORT                 PORTB
#define LATCH_NUMBER                PB3

#define REDDATA_DDR                 DDRB
#define REDDATA_PORT              PORTB
#define REDDATA_NUMBER              PB2

#define KANAL_D_DDR                 DDRB
#define KANAL_D_PORT              PORTB
#define  KANAL_D_NUMBER              PB1

#define OUTPUTENABLE_DDR           DDRB
#define OUTPUTENABLE_PORT         PORTB
#define OUTPUTENABLE_NUMBER         PB0



int main(void){

  // Alle Ports als Ausgänge konfigurieren.
  KANAL_A_DDR |= (1<<KANAL_A_NUMBER);
  KANAL_B_DDR |= (1<<KANAL_B_NUMBER);
      //KANAL_C_DDR |= (1<<KANAL_C_NUMBER);
  CLK_DDR |= (1<<CLK_NUMBER);
  LATCH_DDR |= (1<<LATCH_NUMBER);
  REDDATA_DDR |= (1<<REDDATA_NUMBER);
  //KANAL_D_DDR |= (1<<KANAL_D_NUMBER);
  OUTPUTENABLE_DDR |= (1<<OUTPUTENABLE_NUMBER);

  // OE auf 1 setzen. Ansonsten leuchtet gar keine LED auf der Matrix
  OUTPUTENABLE_PORT |= (1<<OUTPUTENABLE_NUMBER);




        // Ausgangswerte auf 0 initialisieren
  KANAL_A_PORT  |=  (1<<KANAL_A_NUMBER);
  KANAL_B_PORT  |= (1<<KANAL_B_NUMBER);
  CLK_PORT &= ~(1<<CLK_NUMBER);
  REDDATA_PORT &= ~(1<<REDDATA_NUMBER);
  LATCH_PORT &= ~(1<< LATCH_NUMBER);
  _delay_ms(10);

  // Den Wert des ersten Pixels reinschieben.
  REDDATA_PORT |= (1<<REDDATA_NUMBER);
  _delay_ms(10);

  // Taktflanke(CLK) erzeugen, damit der erste Pixel in das 
Schieberegister uebernommen wird.
  // Alle Pixelwerte in den Schieberegistern rutschen dann nach rechts.
  // Latchflanke(LATCH) erzeugen, damit alle Pixel von den 
Schieberegistern in die Anzeige uebernommen(kopiert) werden.

  //Taktflanke erzeugen
  CLK_PORT |= (1<<CLK_NUMBER);
  _delay_ms(10);

  //fallende Flanke
  CLK_PORT &= ~(1<<CLK_NUMBER);
  _delay_ms(10);

  // Ausgangsposition alle drei Speicher werden auf 0 gesetzt
  REDDATA_PORT &= ~(1<<REDDATA_NUMBER);
  _delay_ms(10);

  // Latchflanke wird erzeugt, die gespeicherten Daten in REDDATA werden 
in das Schieberegister ubernommen(kopiert).
  LATCH_PORT |= (1<< LATCH_NUMBER);
  _delay_ms(10);


       while(1){
    CLK_PORT &= ~(1<< CLK_NUMBER);
          _delay_ms(10);
    REDDATA_PORT &= ~(1<< REDDATA_NUMBER);
    _delay_ms(10);
    LATCH_PORT &= ~(1<< LATCH_NUMBER);
    _delay_ms(10);

    REDDATA_PORT |= (1<<REDDATA_NUMBER);
    _delay_ms(10);

    CLK_PORT |= (1<<CLK_NUMBER);
    _delay_ms(10);

    CLK_PORT &= ~(1<<CLK_NUMBER);
          _delay_ms(10);

    REDDATA_PORT &= ~(1<< REDDATA_NUMBER);
    _delay_ms(10);

    LATCH_PORT |= (1<<LATCH_NUMBER);
    _delay_ms(10);
             }
}

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Besorg dir nen Zeichensatz und schalt eben die Pixel ein welche der 
Zeichensatz vorgibt.

von Falk B. (falk)


Lesenswert?

Hier gibt es ein Beispiel, wie man Text in eine Matrix schreibt, inc. 
Scrolling.

Beitrag "Re: ATMEGA8(Pong) - Grundsatzfrage bzgl. Überschreiben des alten Zustands der LED"

von Peter D. (peda)


Lesenswert?

Ohne das Display zu kennen, sind das alles nur unverständliche 
IO-Zugriffe in Deinem Code.
Ja, man darf hier Links zu Datenblättern und Schaltpläne posten.

Schau Dir beliebige Beispielroutinen für GLCDs an.

von Mikro 7. (mikro77)


Lesenswert?

Philipp K. schrieb:
> Wie kann ich Zeichen oder ein
> Wort(zum Beispiel Hallo) in C auf der 32x16 LED_ Matrix(aus China, ist
> nicht arduino) darstellen?

In der Praxis nimmt man häufig ein 2D Feld (Canvas), in das man "malt" 
(auch die Buchstaben). Im nächsten Schritt werden die Daten aus dem Feld 
in einem Rutsch an die Dot Matrix übertragen.

Um Buchstaben zu "malen" benötigt man einen Font. Viele der Fonts die 
mit Linux kommen sind frei. Wenn sie im BDF Format vorliegen, sind sie 
auch recht einfach einzulesen.

Hier zwei Projekte mit Fonts, wo du dich weiter durchklicken kannst:

https://github.com/hzeller/rpi-rgb-led-matrix/tree/master/fonts
https://github.com/ma16/rpio/tree/release.2/script/Max7219

(oder irgend ein anderes der vielen Projekte die man Online findet)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.