8x8 Matrix Buchstaben Programmieren ???

Hallo, ich habe eine 8x8 Matrix mit zwei Schieberegister 74hc595 und 8x BC337 Transistoren realisiert!
Ich kann jetzt zwar jede LED ansteuern und auch Buchstaben zeichnen aber mit einen sehr hohem Aufwand!
Meine Vorgehensweise war so vorgesehen!

  1. H realisieren. Das habe ich geschafft!
    2.Die Matrix löschen, alle LED´s LOW! Das bekomme ich auch noch hin !
    3.Buchstabe zwei. Hier Scheitere ich ! Weil das Programm viel zu schnell geschaltet wird sehe ich den Buchstaben nicht, nur manchmal, kurz auf Flackern!
    Hat jemand eine leichtere Lösung und vielleicht später auch Laufschrift!
    HIER mein CODE:

int dataPin=11;
int clockPin=12;
int lachPin=8;

int column[9]={0,1,2,4,8,16,32,64,128};
int row[9]={0,1,2,4,8,16,32,64,128 };
void setup()
{

pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(lachPin,OUTPUT);
}

void loop()
{
H();
verzoegerung();
A();
}

void H(){
for (int i=1;i<=8;i++)//Hier mache ich die linke Säule des H !
{
digitalWrite(lachPin,LOW);
shiftOut(dataPin,clockPin,MSBFIRST,column[1]);
shiftOut(dataPin,clockPin,MSBFIRST,row*);*

  • digitalWrite(lachPin,HIGH);*
  • } *
  • for(int i=1;i<=8;i++)//Hier mache ich die rechte Säule des H!*
  • { *
  • digitalWrite(lachPin,LOW);*
  • shiftOut(dataPin,clockPin,MSBFIRST,column[8]);*
    _ shiftOut(dataPin,clockPin,MSBFIRST,row*);_
    _
    digitalWrite(lachPin,HIGH);_
    _
    }_
    _
    for(int i=1;i<=8;i++)// Und den Strich des H*_
    * { *
    * digitalWrite(lachPin,LOW);*
    _ shiftOut(dataPin,clockPin,MSBFIRST,column*);
    shiftOut(dataPin,clockPin,MSBFIRST,row[4]);
    digitalWrite(lachPin,HIGH);
    }
    }
    void verzoegerung()
    {
    digitalWrite(lachPin,LOW);
    delay(1000);
    }
    void A(){
    //aus platzgründen habe ich hier nicht weiter gemacht !!
    }*
    Was kann ich Besser machen ??_

Du mußt die Matrix kontinuirlich multiplexen, immer 1 Reihe nach der anderen. Damit Du Buchstaben sieht mußt Du die LEDs immer wieder ansteuern. Also kontinuirlich immer wieder eine Reihe nach der anderen.
Die Daten für die Buchstaben gibst Du am besten in ein Array.
Eine 5x7 Matrix findes Du zB unter Arduino Playground - PCD8544
Grüße Uwe

Also das mit den Array [Reihe][Spalte] habe ich verstanden, aber das ganze in den {0x00,0x00,0xf5,0x00,0x00} verstehe ich nicht was 0xf5 bedeutet! Aber ich kann es mir vorstellen, dass die Matrix 5x7, die 3 Spalte alle leuchten bis auf die Zeile 6 diese LED nicht leuchtet ?!

Ich habe auch mal Öfters so was gesehen !
Matrix 8x8
int array[][]{
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1},
}

Vielleicht so ???
digitalWrite(array[1][1],HIGH);

Aber wie gebe ich das aus!! Also das mit den Array ist für mich eher kein Problem aber ich kann es nicht ausgeben! Da ich das nicht verstehe !!
Ich hoffe du kannst mir hier FOLGEN !!

Du mußt multiplexen.
Das heißt Du gibst die Daten für 1 Zeile (Spalte) aus und aktivierst den entsaprechenden Transitor und läßt die Zeile eine gewisse Zeit an. Dann schaltest Du den Transitor wieder aus. und machst das gleich mit der nächsten Zeile (Spalte). wenn du alle 8 Zeilen (Spalten) gemacht hast fängst Du wieder mit der nächsten an.
Grüße Uwe

okay, Mulitiplexen ist eher kein Problem! Aber mit dem Array z.B.
Ich machen jetzt einen Array für den Buchstaben H !!!
int arry_buchstabe_H[][8]={// Ich gehe hier aus von einer 8x8Matrix commonAnode!
{B10000001,
B10000001,
B10000001,
B11111111,
B10000001,
B10000001,
B10000001,
B10000001},
};
void loop(){
digitalWrite(latchPin,LOW);//Alles AUS !!!
digitalWrite(dataPin,clocPin,MSBFIRST,arry_buchstabe_H[][1]);//hier möchte ich den ersten Binärcode
digitalWrite(dataPin;clockPin,MSBFIRST, 1);//Hier möchte ich das in die erste Zeile kommt
digitalWrite(latchPin,HIGH);//Hier setze ich diese zweit LED´s auf HIGH (Leuchten)
}
aber das geht nicht !! Vielleicht drücken ich mich falsch aus !! Ich möchte ein beispiel wo ich sehe wie jemand ein H programmiert das würde mir vollkommen ausreichen !! Leider verstehe ich das ganze von den anderen nicht wie die das mit dem Array machen !!

Hab das selber noch nicht gemacht aber so wie ich das verstehe sieht dein H so aus:

static const byte ASCII[][5] =
{
{0x7f, 0x08, 0x08, 0x08,0x08,0x08, 0x7f} // 48 H
};

In der ersten Spalte sind alle LEDs an, das sind bei dir die 1en untereinander.
In HEX ist das wohl 0x7f

void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 8; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}

Hier siehst du das dein Zeichen mit der for schleife Spalte für Spalte aufgebaut wird.
So in der Art musst du das auch machen.
Benutze HEX!

Arbeitest du Zeilenweise oder Spaltenweise?
{0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7f} <- wenn du spalltenweise arbeitest!!!
{0x81, 0x81, 0x81, 0xff, 0x81, 0x81, 0x81} <- wenn es zeilenweise ist

Ich hoffe ich laber keinen misst.

Ja hast auch Recht das es so aussieht! Der Meinung bin ich auch !! Aber du hast in dein Array leider nur 5 Spalten vorgesehen aber schreibst dann 7 Spalten auf das würde zu einen Fehler führen. Daher sollte man das ganze auch so Schreiben
static const byte ASCII[][7] = //Ich glaube static kann man hier weg lassen aber const was bringt es ??
{
{0x7f, 0x08, 0x08, 0x08,0x08,0x08, 0x7f} // 48 H // Okay Das Hex werde ich mir noch mal anschauen müssen damit ich das verstehen kann
};

Kommen wir zu Code 2:
void LcdCharacter(char character)// void LcdCharacter müsste erst mal in der loop()-Funktion deklariert werden! Char character, was ist das wo her ??
{
LcdWrite(LCD_D, 0x00); // Das ist mir klar, das sagt alles aus !!
for (int index = 0; index < 8; index++)// hier startet die schleife um alles 7 HEX aufzurufen, nacheinander!
{
LcdWrite(LCD_D, ASCII[character - 0x20][index]);//so und hier was macht dieser character-0x20?
}
LcdWrite(LCD_D, 0x00);
}
Ich habe das Gefühl wir vermischen da ein paar Sachen vom LCD-Programmieren und LED-Matrix!Aber im großen passt es schon!
So wenigstens Blinkt etwas! Hier noch mal mein neuer Code mit doppeltem Array[][]

int dataPin=11;// zum Pin14 vom 595
int clockPin=12;//zum Pin11 von 595
int lachPin=8;// zum Pin12 von 595

byte H[][8]={
{0x7f, 0x08, 0x08,0x08, 0x08,0x08,0x08, 0x7f} // 48 H
};
int row[9]={0,1,2,4,8,16,32,64,128 };//Reihe 1-8
void setup(){
pinMode(dataPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(lachPin,OUTPUT);
}
void loop(){
for (int i=0;i<=8;i++){
digitalWrite(lachPin,LOW);
shiftOut(dataPin,clockPin,MSBFIRST,H [0]);//für i=o und i=7 macht es mir das gleich, die ganze Zeile leuchtet auser die 8 LED(0x7f)!

  • shiftOut(dataPin,clockPin,MSBFIRST,row[1]);*
  • digitalWrite(lachPin,HIGH);*
  • delay(500);*
  • }*
    }

Zunächst mal, benutz bitte die Codemarken #
Die - 0x20 ist dafür da um 0x20 abzuziehen!
Versuch doch mal den Code von dem Link den dir Uwe gegeben hat zu verstehen!
Ich kann es selber nicht und muss mir das auch anschauen um es zu verstehen.
das Leerzeichen scheint die 0x20 zu sein.
Also wenn ich ein Leerzeichen anzeigen will welches 0x20 ist aber in meinem Array fängt es nicht bei 0x20 an sondern bei 0x00 dann muss ich die 0x20 abziehen.
Also Zeichen "Leer" anzeigen bringt mir in HEX 0x20.
Dieses findest du im Array an Stelle 0

Ja hast auch Recht das es so aussieht! Der Meinung bin ich auch !! 
Aber du hast in dein Array leider nur 5 Spalten vorgesehen aber schreibst dann 7 Spalten auf das würde zu einen Fehler führen. 
Daher sollte man das ganze auch so Schreiben

Sorry das mir das beim ändern des Codes durch gegangen ist!

Und wieso machst du verschachtelte Arrays wenn du den ersten Array gar nicht benutzt. Naja egal
Die Hauptsache ist doch das wenigstens was blinkt.

Ich würde gerne das # benützen aber ich weiß nicht für was ?! :sweat_smile:
Naja, erst mal will ich mich bei euch für euren Einsatz bedanken !! XD
Ich habe das mit den Verschachtelten Array [][] nicht verstanden aber ich habe jetzt eine einfachere und unkomplizierte Lösung gefunden wie ich die Buchstaben einfacher Konstruiere und Realisiere! Damit kann ich mein CODE etwas minimieren!
Für den Buchstaben H habe ich:
byte H[8]={
B10000001,
B10000001,
B10000001,
B10000001,
B11111111,
B10000001,
B10000001,
B10000001};

byte A[9]={//
B10000001,
B10000001,
B10000001,
B10000001,
B11111111,
B10000001,
B01000010,
B00100100,
B00011000,
};
void loop(){
for ( int i=1;i<=8;i++){
digitalWrite(lachPin,LOW);
shiftOut(dataPin,clockPin,MSBFIRST,H*);*
_ shiftOut(dataPin,clockPin,MSBFIRST,row*);_
_
digitalWrite(lachPin,HIGH);_
_
delay(1);//Das brauch ich sonst leuchten die LED´s fast alle auf!_
_
}_
for ( int i=1;i<=9;i++){
_
digitalWrite(lachPin,LOW); _
_ shiftOut(dataPin,clockPin,MSBFIRST,A);
shiftOut(dataPin,clockPin,MSBFIRST,row);
digitalWrite(lachPin,HIGH);
delay(1);// hier das gleiche !!
}*

Der einzelne Buchstabe lässt sich Anzeigen aber wenn der nächste Buchstabe kommt dann geht mir das alles zu schnell und ich sehe nur LED´s Flackern!
Wie mach ich das, dass ein Buchstabe für eine bestimmte zeit Leuchtet z.B. 3sec. und dann zu der zweiten Schleife geht ??_

Probier mal was in der Richtung:

#define dataPin 11
#define clockPin 12
#define latchPin 8
// laTch ... ;)

byte chars[][8]={
  {B00011000, // A
   B00100100,
   B01000010,
   B10000001,
   B11111111,
   B10000001,
   B10000001,
   B10000001},
  {B11111110, // B
   B10000001,
   B10000001,
   B11111110,
   B10000001,
   B10000001,
   B10000001,
   B11111110},
  {B00111110, // C
   B01000001,
   B10000000,
   B10000000,
   B10000000,
   B10000000,
   B01000001,
   B00111110},
  // ...
 };

void setup(){     
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(latchPin,OUTPUT);     
}

char text[] = "ABC";

void loop() {
  drawChar(text[(millis()/1000)%(sizeof(text)-1)]);
}

void drawChar(char c) {
  for (int i=0;i<8;i++) {
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,LSBFIRST,chars[c-'A'][i]); // Deine Buchstabenliste faengt mit 'A' an, und MSBFIRST und LSBFIRST bestimmen die Richtung
    shiftOut(dataPin,clockPin,MSBFIRST,1<<i); // 1<<i ist wie "2 hoch i" und fuehrt zu 1, 2, 4, 8, 16, 32, ...
    digitalWrite(latchPin,HIGH);
    delay(1);
  }
}

Ist nur so hingeschmiert und ungetestet, daher ohne Gewähr. :wink:

Das Code-Tag für sauberen Sourcecode findest Du beim Beantworten über dem Texteingabefeld, der '#'-Button. :slight_smile:

char text[] = "ABC";

//Frage: Hier Wird " ABC " doch in einer Zahl umgewandelt und dann void drawChar(char c) gespeichert ??? Also ins c??

void loop() {
  drawChar(text[(millis()/1000)%(sizeof(text)-1)]);
}

Das ganze ist für mich hier etwas verwirend! sizeof ist nirgends Deklariert ??!

void drawChar(char c) {
  for (int i=0;i<8;i++) {
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin,clockPin,LSBFIRST,chars[c-'A'][i]); // Deine Buchstabenliste faengt mit 'A' an, und MSBFIRST und LSBFIRST bestimmen die Richtung
    shiftOut(dataPin,clockPin,MSBFIRST,1<<i); // 1<<i ist wie "2 hoch i" und fuehrt zu 1, 2, 4, 8, 16, 32, ...
    digitalWrite(latchPin,HIGH);
    delay(1);
  }
}

[c-'A'] hier versteh ich das nicht!!
Ich könnte ja mal ein paar Bilder machen wie es aussieht wenn es dir helfen sollte ??
Also der Code funktioniert aber das A flackert über der hälfte und steht auf dem Kopf was eher egal ist !!
Das B ist fast nicht zu erkennen und das C ist fast OKAY

Quark:
//Frage: Hier Wird " ABC " doch in einer Zahl umgewandelt und dann void drawChar(char c) gespeichert ??? Also ins c??

Nein, im Speicher wird das als char-Array abgelegt, auf das Du dann wie auf ein ganz normales Array einzeln zugreifen kannst. So kannst Du den Satz zusammenbauen, den Du darstellen willst. :slight_smile:

Quark:

drawChar(text[(millis()/1000)%(sizeof(text)-1)]);

Das ganze ist für mich hier etwas verwirend! sizeof ist nirgends Deklariert ??!

Die Referenz zu sizeof und den ganzen anderen Standardkommandos findest Du hier.

Prinzipiell hole ich mir mit millis() die Zeit, die der Arduino seit dem letzten Reset läuft, teile sie durch 1000 um auf die Sekunden zu kommen, besorge mir die Länge des text-Satzes, den ich darstellen will (weniger das unsichtbare abschließende Byte, das dem Arduino anzeigt, dass der Satz wirklich zu Ende ist. Das wird automatisch da rangesetzt, das brauchst Du nicht selbst zu machen). Dann teile ich die Sekunden durch die Länge, aber in einer Ganzzahldivision und nehme den Rest, das s.g. Modulo.
Stell Dir vor Du hast drei Leute und 5 Äpfel, und willst keinen Apfel teilen -> Führt zu 2 Äpfeln Rest. :wink:
In diesem Fall kommt damit die Zahlenreihe "0 1 2 0 1 2 0 1 2 ..." raus, und damit werden unaufhörlich die drei Buchstaben "A", "B" und "C" aus dem "Satz" geholt. :slight_smile:

Quark:
[c-'A'] hier versteh ich das nicht!!

Also wie eben geschrieben soll ja immer "A", "B" und "C" dargestellt werden.
A hat im ASCII-Alphabet den Wert 65, B entsprechend 66 und C 67 und so weiter.
"A" steht im chars-Array aber an ersten Stelle, also bei chars[0], wenn man es aus dem Programm heraus anspricht.
Daher musst Du, wenn Du darauf zugreifen willst, von dem Wert, den Du hast, 65 abziehen, dann kommst Du bei "A" bei 0 raus, bei "B" bei 1 und bei "C" bei 2, also genau da wo Du hin willst. :wink:
'A' ist einfach eine andere Schreibweise, und ist genau das Gleiche wie (Dezimal) 65 oder (Hexadezimal) 0x41 oder (Binär) B1000001. Guck Dir den ASCII-Link an, da gibts ne Liste. :slight_smile:

Quark:
Also der Code funktioniert aber das A flackert über der hälfte

Bringt es was wenn Du das delay(1) vergrößerst? delay(5) oder delay(10) oder so?

Quark:
und steht auf dem Kopf was eher egal ist !!

Ersetz mal LSBFIRST durch MSBFIRST und umgekehrt, wenn Du Glück hast spiegelt das Dein Bild vertikal und horizontal, je nachdem, welches Du änderst. :slight_smile:

shiftOut(dataPin,clockPin,LSBFIRST,chars[c-'A'][i]);

c hat die 67 und a 65 , Laut ASCII und wenn ich hier 67-65=2 -> dann müsste es mir Immer den Buchstaben c ausgeben ?

byte chars[][8]={
  {B00011000, // A
   B00100100,
   B01000010,
   B10000001,
   B11111111,
   B10000001,
   B10000001,
   B10000001},
  {B11111110, // B
   B10000001,
   B10000001,
   B11111110,
   B10000001,
   B10000001,
   B10000001,
   B11111110},
  {B00111110, // C
   B01000001,
   B10000000,
   B10000000,
   B10000000,
   B10000000,
   B01000001,
   B0111110},
  // ...
 };
void drawChar(char c)

Das Ergebnis von drawChar() wird in c gespeichert ??

Ich habe mal das ganze so gemacht das es nur ein Buchstaben zeigt und dann habe ich das ganz langsam Laufen lassen und da leuchten wirklich zu viel lämpchen !!
Aber immerhin habe ich das mit den doppel Array jetzt verstanden !!

Oh sorry, dass mit delay() hat nichts gebracht und das mit auf dem Kopf ist auch nicht so das große Problem!!

Das mit char text[]="ABC" -> warum das denn !! Wir haben das doch schon oben deklariert mit byte chars[][]
Sorry, für die ganzen fragen aber ich kann nicht so gut English und Deutsch ist gerade noch gut genug !! :smiley:

Quark:

void drawChar(char c)

Das Ergebnis von drawChar() wird in c gespeichert ??

Nein, das bedeutet, dass der Wert, der drawChar übergeben wird, innerhalb der Funktion in der Variable c gespeichert liegt. :slight_smile:

Quark:

shiftOut(dataPin,clockPin,LSBFIRST,chars[c-'A'][i]);

c hat die 67 und a 65 , Laut ASCII und wenn ich hier 67-65=2 -> dann müsste es mir Immer den Buchstaben c ausgeben ?

Nein, 'C' ist 67 und 'A' ist 65, aber c ist eine Variable, und in dem Fall ein Platzhalter für der Wert, der übergeben wurde!

Quark:
Das mit char text[]="ABC" -> warum das denn !! Wir haben das doch schon oben deklariert mit byte chars[][]

Das ist der Text den Du anzeigen willst, wenn Du nachher "ABABABC" sehen willst musst Du hier eben char text[]="ABABABC"; schreiben. :wink:

drawChar(text[(millis()/1000)%(sizeof(text)-1)]);

Das Ergebnis wird in

void drawChar(char c) {

c gespeichert ?

byte chars[][8]={
Also Schreibe ich das ganze Alphabet hier ein

char text[] = "ABABAB";

und sag hier, in welcher reihen Folge ausgeben soll z.B.

Langsam komme ich drauf!! Ist ja klar c ist eine variable und C ist der Buchstabe,sorry!! Da hätte ich selber drauf kommen können !!

Mal eine Frage !! Ich habe bei meiner Matrix keine Wiederstände benützt! Kann es daran liegen ???Zuviel Spannung ??

Quark:

drawChar(text[(millis()/1000)%(sizeof(text)-1)]);

Das Ergebnis wird in

void drawChar(char c) {

c gespeichert ?

Könnte man so sagen, ja.

Quark:

byte chars[][8]={

Also Schreibe ich das ganze Alphabet hier ein

char text[] = "ABABAB";

und sag hier, in welcher reihen Folge ausgeben soll z.B.

Genau.

Quark:
Langsam komme ich drauf!! Ist ja klar c ist eine variable und C ist der Buchstabe,sorry!! Da hätte ich selber drauf kommen können !!

:wink:

Quark:
Mal eine Frage !! Ich habe bei meiner Matrix keine Wiederstände benützt! Kann es daran liegen ???Zuviel Spannung ??

Kann was daran liegen? Dass die LEDs flackern?
Ich vermute nicht, aber sicher bin ich mir nicht.
Setz das Delay mal auf 100 und guck, ob jede einzelne Zeile sauber gezeichnet wird oder ob dann garnichts mehr geht.

Quark:
Mal eine Frage !! Ich habe bei meiner Matrix keine Wiederstände benützt! Kann es daran liegen ???Zuviel Spannung ??

Die LED flackern weil Du sie nicht gleichmäßig ansteuerst bzw zu kurz.
Was sicher ist daß das der Grund ist wieso die Schieberegistr kaputt gehen.
Grüße Uwe

@ Joghurt!!
Dein CODE Funktioniert einwandfrei!!! Meine Schaltung ist da eher das Problem!! Ich habe einen 220 ohm Wiederstand am GND angeschlossen und wie von Zauberhand ist das Flackern weg!! Aber dafür habe ich jetzt eine anderes Problem das die LED´s unterschiedlich Hell leuchten :sweat_smile: !! z.B. der Buchstabe E da sind die drei Reihen sehr Dunkel gegenüber der Spalte! Alle Spalten sind sehr Hell und Reihen sind dunkel!
Als ich dies ganz langsam laufen lassen habe hat es aber auch nicht Richtig angezeigt und habe ich gedacht da stimmt was mit dem CODE nicht aber seit ich den Wiederstand habe ist alles bestens, auser die Fehler mit Hell und Dunkel !!

@uwefed!!
Ich glaube nicht das die Kaput gehen können weil die Schieberegister direkt am Arduino angeschlossen sind und Arduino per USB angeschlossen ist und der dann max 5 V ausgeben kann bzw. der eigentlich nur mit 3,..V ersorgt wird.Ich weiss nicht wieviel Volt da am USB sind! Wenn meine Annahmen stimmen ??? Ja und ich habe im Datenblatt von 595 gelesen das die 5V benötigen! Ich habe auch irgendwo gelesen das an den Schieberegister ca.1,2V abfallen ?! Blöderweise habe ich hier ein nicht Definiertes 8x8 Matrix und ich weiß auch nicht ob wieviel V die LED´s benötigen! Mach das ganze auf gut Glück !! XD