Schriftart in GCC Programmieren

Gast #2030579
Lesenswert?

Hallo,

ich arbeite derzeit an einer LED-Leuchtschrift.
Buchstaben darstellen funktioniert soweit.
Nachdem ich aber kein GCC programmier Profi bin wollte ich euch einmal 
fragen wie man so eine schriftart abspeichert und dann abruft.

Derzeit lade ich die 9 Zeilen in globale Variablen und schiebe diese 
dann raus in Schieberegister


void font_klein_a(void) {
  ByteZeile1 = 0b00000000;
  ByteZeile2 = 0b00000000;
  ByteZeile3 = 0b00000000;
  ByteZeile4 = 0b01110000;
  ByteZeile5 = 0b00001000;
  ByteZeile6 = 0b01111000;
  ByteZeile7 = 0b10001000;
  ByteZeile8 = 0b10001000;
  ByteZeile9 = 0b01111100;
}
Persönliche Seite #2030596
Lesenswert?

Wenn das funktioniert, ist das OK.

Du könntest dem Compiler noch bekannt machen, ob sich die Daten für die 
Zeichen ändern (wie jetzt) oder nicht (const Schlüsselwort). Der 
Compiler kann dann u.U. schnelleren oder schlankeren Code produzieren.

Du könntest statt vieler Variablen ein Feld (Array) benutzen und über 
den Index zugreifen. Damit können dann Schleifen programmiert werden.

Bei µC mit wenig RAM könntest du auch die Daten statt im RAM im 
Flash-ROM halten. Beim AVR ist das im AVR-GCC-Tutorial erklärt unter dem 
Schlüsselwort PROGMEM.
#2030639
Lesenswert?

Rudolf schrieb:

> Nachdem ich aber kein GCC programmier Profi bin wollte ich euch einmal
> fragen wie man so eine schriftart abspeichert und dann abruft.

Du musst die Daten aus dem Programm rausholen und in einer Tabelle 
ablegen.
Sinnvollerweise macht man das dann so, dass man den ASCII Code des 
auszugebenden Zeichens direkt als Index in diese Tabelle benutzen kann.

> Derzeit lade ich die 9 Zeilen in globale Variablen und schiebe diese
> dann raus in Schieberegister
>
>
> void font_klein_a(void) {
>   ByteZeile1 = 0b00000000;
>   ByteZeile2 = 0b00000000;
>   ByteZeile3 = 0b00000000;
>   ByteZeile4 = 0b01110000;
>   ByteZeile5 = 0b00001000;
>   ByteZeile6 = 0b01111000;
>   ByteZeile7 = 0b10001000;
>   ByteZeile8 = 0b10001000;
>   ByteZeile9 = 0b01111100;
> }

Du solltest in deinem C-Buch über Arrays nachlesen.
Wann immer du versucht bist, mehrere gleichartige Variablen anzulegen, 
die alle gleich heißen und sich nur durch eine laufende Nummer 
unterscheiden, dann willst du meistens ein eigentlich ein Array.

uint8_t DisplayByte[9];

jetzt hast du 9 gleichartige Variablen

  DisplayByte[0], DisplayByte[1], ... DisplayByte[8]

nur: Die Zahl in den eckigen Klammern beim Zugriff kann auch errechnet 
werden. Und da fängt dann die ganze Sache an interessant zu werden.
Gast #2030713
Lesenswert?

Das heißt mit den array meinst du das so oder?

uint8_t font[255][9] = {
//{...},{...},{....},{...},{...},{...},.........
//............................
//97. klammer auf = kleines a
{0b00000000, 0b00000000, 0b00000000, 0b01110000, 0b00001000, 0b01111000, 
0b10001000, 0b10001000, 0b01111100},

//{...},{...},{....},{...},{...},{...},...........
//............................
//255. klammer
{0,0,0,0,0,0,0,0,0}
                            };
#2030736
Lesenswert?

Rudolf schrieb:
> Das heißt mit den array meinst du das so oder?

ganz genau.
Wobei man nicht unbedingt alle Zeichen braucht.
Im ASCII Code sind die ersten 32 Zeichen zb so, dass es keine sinnvolle 
Darstellung dafür gibt (sind Steuerzeichen wie zb Zeilenvorschub).
D.h. man muss dafür daher auch keine Einträge in der Tabelle spendieren. 
Beim Zugriff auf die Tabelle da erst mal 32 abziehen, ist ja nicht das 
Thema.
Gast #2030759
Lesenswert?

Vielen Dank

Das mit den Steuerzeichen weiß ich. Die benütze ich für einen Reset des 
Controllers und die Blinkfrequenz.

Gibt es bei einen Mega32 auch die mölichkeit einen Text in den internen 
Speicher zu schreiben und diesen nach einen Neustart wieder auszulesen?
Gast #2072190
Lesenswert?

Jetzt muss ich nochmal nachfragen ob es auch moglich ist die schriftart 
in das Flash zu schreiben da mit
uint8_t font[255][9] = {{....}.....{.....}}
fast der ganze Ram voll ist?

Danke schon mal für alle Antworten

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