Hallo leute
Bin gerade eine Laufschrift am Programmieren. Das ganze soll an eine 5*6
Dot Matrix Anzeige ausgegeben werden.
Die Anzeige hab ich aus 35 einzelnen LED's aufgebaut, ist also kein
fertiges Modul.
Die einzelnen Reihen und spalten hab ich wie auf dem Bild im Anhang
direkt über Transistoren mit dem uC (ATMEGA 168) verdratet (keine
Schieberegister oder Treiber).
Mit der Hardware bin ich so zufrieden, brauche keine Treiber oder so.
Wird ein Geburtstagsgeschenk und muss technisch nicht top sein, optisch
ist es aber in Ordnung.
Nun kommen wir zum Code. Wie bei Dot Matrix Anzeigen üblich steuere ich
sie per Multiplexen an. Nun ist es aber relativ mühsam, einen Text über
die Anzeige laufen zu lassen. Habe bis jetzt Happy B-Day implementiert,
und habe ziemlich viel Zeit, sowie 57% des Programmspeichers gebraucht.
Im Anhang sieht ihr mein Code. habe alles über for Schleifen gemacht.
Ich bin sicher, es gibt viel einfachere Wege, das ganze zu realisieren.
Ich hoffe ihr könnt mir einen guten zeigen.
Die Implementierung sollte nicht zu viel Zeit in Anspruch nehmen, da es
wie gesagt ein Geburtstagsgeschenk werden soll und dieses bis spätestens
Freitag fertig sein muss;)
Hoffe auf eure Hilfe
Grüsse Stefan
Ohne jetzt zu tief in den Code einzusteigen würde ich es folgendermaßen
machen:
- ein globales 2D-Array, dass deine LEDs repräsentiert (Kann auch 1D
sein, dann nimmst du halt die Bits eines Wertes als Repräsentation der
LEDs)
- Eine Funktion, die in einem bestimmten Takt dieses Array "anzeigt",
soll heißen: die Funktion iteriert über das Array und setzt bzw. löscht
die LEDs
- Nun kannst du die einzelnen - nennen wir es Frames - als
Array-Deklarationen nehmen und immer in das globale Array kopieren
Pseudocode für ein durchlaufendes 'A':
1
uint8_tFrame1[]
2
{
3
0b00000001,
4
0b00000001,
5
0b00000001,
6
0b00000001,
7
0b00000001
8
};
9
10
uint8_tFrame2[]
11
{
12
0b00000011,
13
0b00000010,
14
0b00000011,
15
0b00000010,
16
0b00000010
17
};
18
19
uint8_tFrame3[]
20
{
21
0b00000111,
22
0b00000100,
23
0b00000111,
24
0b00000100,
25
0b00000100
26
};
27
28
uint8_tFrame4[]
29
{
30
0b00001111,
31
0b00001000,
32
0b00001111,
33
0b00001000,
34
0b00001000
35
};
36
37
uint8_tFrame5[]
38
{
39
0b00011111,
40
0b00010001,
41
0b00011111,
42
0b00010001,
43
0b00010001
44
};
Geht sicher noch eleganter, aber zum Einstieg sollte es klappen. Die
Arrays solltest du in den Programmspeicher packen.
MoinMoin,
hier mal ein Beispiel für eine 8x8-Matrix, welches sich aber an deine
Hardware anpassen lassen sollte (und beliebigen Text ausgeben kann)...
http://bralug.de/wiki/8x8-LED-Matrix#Laufschrift
Grüße Uwe
PS.: 5x6 sind 30 (und nicht 35)...
Hier meine Anregung ... das Programm schreibt H A L L O
7 LED-Zeilen hängen an PORTB
und die 5 Spalten an PORTD
Die Buchstaben könnte man noch im EEPROM ablegen und gezielt per
funktion aufrufen.
den Refresh der Anzeige übernimmt der TIMER1
die Hauptschleife kümmert sich nur um den Text (und das effizienter zu
programmieren sollte kein Problem sein)
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<util/delay.h>
4
5
volatilechardisp[5];
6
volatilecharcol;
7
8
SIGNAL(SIG_OUTPUT_COMPARE1A)
9
{
10
PORTB=0x00;
11
PORTD=0x00;
12
}
13
14
SIGNAL(SIG_OUTPUT_COMPARE1B)
15
{
16
TCNT1H=0;TCNT1L=0;
17
18
PORTD=(1<<col);
19
PORTB=disp[col-2];
20
if(col==7)col=2;
21
elsecol++;
22
TCNT1H=0;TCNT1L=0;
23
}
24
25
voidStart_Timer()// the timer disables the current after 0.25 sec