Also der Zeichengenerator (der den großen Videospeicher vollschreibt) besteht aus einem großen PROGMEM-Array, das die ganzen Pixel-Informationen der einzelnen Buchstaben enthält (damit alles schön in ein Byte passt kann bei mir ein Buchstabe nicht länger sein als 8 Spalten, da ich 7 Zeilen LEDs habe sind es dann 7 Bytes pro Buchstabe). Jeder Buchstabe enthält bei mir eine Leerspalte (gehört also fix zu den Pixeldaten), dass die Buchstaben nicht so aufeinander kleben. Ein Leerzeichen besteht dann halt aus vier oder fünf Leerspalten, glaube ich. Die perfekte Umsetzung ist auch das nicht, aber so schlecht schaut es meiner Meinung nicht aus. Bleibt noch, dass manche Buchstaben mehr Spalten brauchen als andere (z.B. ist B länger als i), deswegen gibt es ein zweites PROGMEM-Array, in dem die Längen abgespeichert sind für die einzelnen Buchstaben. Die beiden Arrays generiere ich mit einem simplen kleinen VB.net Programm, das geht schneller ein solches zu schreiben als alles per Hand reinzuklopfen.
Das ist jetzt ein wenig angepasst, dass es zu deinen Abmessungen passt, deshalb auch nicht getestet und eher nur als "Pseudocode" zu verstehen.Code:#define used_length 5 // d.h. der große Videospeicher ist 5*8 Spalten lang, wenn wir darüber hinaus sind fängts von vorne an void bufcpy(char startpoint, char targetbuffer){ /* So, was macht diese Funktion jetzt: Sie kopiert ausgehend vom Startpoint (in Bits -> LED-Spalten im großen Videospeicher) ein Byte in den Ausgabebuffer, das in jeder Zeile d1[5][8] ist der große Videospeicher, wobei [5] bedeutet dass die Länge 8*5 = 40 Spalten beträgt. [8] bedeutet, dass die Matrix 8 Zeilen hat dm[2][8] sind die zwei Swap-Buffer [2] bedeutet dass es zwei gibt, in die geschrieben werden kann (als Funktionsparameter übergeben, in welchen geschrieben werden soll) [8] bedeutet, dass die Matrix 8 Zeilen hat */ //Funktionsinterne Variablen: //So viele Bits ist unterschied zwischen den Byte-Reihen der beiden Buffer char startblock = startpoint/8; char offset = startpoint%8; //Zählervariablen der Schleifen char i, j; //Hier werden die beiden Bytes, also das halbe drüber und das halbe drunter hineinkopiert und entsprechend geshiftet char low, high; //Die Zeilen durchgehen for(i=0; i < 8; i++){ //Lowbyte laden und entsprechend verschieben, gleiches für Highbyte low = d1[(startblock )%used_length][i]; low = low >> offset; high = d1[(startblock + 1)%used_length][i]; high = high << (8-offset); //Nun zusammenfügen dm[targetbuffer][i] = high | low; } }
Aber ich hoffe, es ist ein wenig verständlich wie ich das meine![]()
Grüße
Thegon





Zitieren

Lesezeichen