Forum: Compiler & IDEs LED-Matrix mit Atmega 16 und zwei 7x5 Matrixen


von Michael (Gast)


Lesenswert?

Hallo alle Zusammen !!

Ich baue gerade eine LED Anzeige hab mommentan eine Platine mit einem 
Atmgea 16 und zwei 7x5 Led Matrixen gebaut.
Über PortA kann iich ein Modul beschreiben und über PortB das Zweite.
76543210  8-bit  uC Port
SSSSSZZZ  Spalte, Zeile

Ich gehe hintereinander schnell alle Zeile (Pin 0,1,2) durch und kann 
über Pin 3,4,5,6,7 die jeweilige splate aktivieren.

Nun meine Frage ich habe bis jetzt immer das gleiche Spaltenmuster 
drüber laufen lassen(siehe C Code unten), wie muss mein C Code Aussehen 
damit ich z.B: Buchstaben darstellen kann ??

Bitte um Hilfe !! ,Danke im Voraus !

1
#include <avr/delay.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
void long_delay(uint16_t ms) {
7
    for(; ms>0; ms--) _delay_ms(1);
8
9
}
10
11
eint main (void) {
12
13
  /*  7654 3210
14
         llll lzzz */  
15
16
17
  DDRB=0xff;  
18
  DDRA=0xff;
19
20
  unsigned char zeile, led;
21
  unsigned char ledb;
22
        
23
  
24
  while (1) {    for (zeile = 0;zeile<8;zeile++) {
25
          
26
       
27
      long_delay(1);
28
      
29
    
30
      led = 0x50;
31
      ledb = 0xa8;
32
      
33
34
      PORTA= led + zeile;
35
         PORTB= ledb + zeile;  
36
    
37
      }
38
39
}               
40
  return 0;
41
}

von Multiplex (Gast)


Lesenswert?

Also erstmal zu meinem Verständnis: für die Zeilen hast du noch einen 
8aus3-Decoder dranhängen? Wenn ja, zählt deine for-Schleife eins zu weit 
(was man aber in der Physik nicht merkt....).

Zur Frage, ohne C-Code, nur als Denkanstoss:
Du musst das Bit-Muster jedes einzelnen Zeichens, was dargestellt werden 
soll, in geeigneter Art und Weise (Spalten/Zeilen) in Feldern 
definieren. Bei dir wäre das zeilenweise, weil du die Zeilen hochzählst. 
Wenn dann also die Zeile 0 in der for-Schleife dran ist, gibst du an dem 
Spaltenport das Zeilenmuster für die Zeile des gewünschten Zeichen aus 
usw..

von Michael (Gast)


Lesenswert?

Also Danke erstamal für die Antwort!!

Ja richtig ich habe an den ersten drei pins einen 3 auf 8 decoder !

Wie kann ich solche Felder definieren ??

von Multiplex (Gast)


Lesenswert?

ungefähr so sollte es dann aussehen (das BIT-Muster für die beiden 
Zeichen kannst du dir ja selbst umrechnen...):
1
//fuer 2 Zeichen...
2
uint8_t zeichen[2][7] = {
3
        {0x04, 0x0a, 0x11, 0x11, 0x1f, 0x11, 0x11},  //A
4
        {0x1e, 0x11, 0x11, 0x1e, 0x11, 0x11, 0x1e}   //B
5
      } 
6
7
...
8
9
for (zeile = 0; zeile < 7; zeile++) {
10
11
  PORTA = zeichen[0][zeile]*8 + zeile;  // "A" auf 1.Matrix
12
  PORTA = zeichen[1][zeile]*8 + zeile;  // "B" auf 2.Matrix 
13
}

Wobei man bei vielen zu definierenden Zeichen sich klar werden sollte, 
welchen Speicherbereich man im MC verwendet...

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.