LED-Matrix mit Atmega 16 und zwei 7x5 Matrixen

Gast #1135067
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
}
Gast #1135109
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..
Gast #1135225
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren