Schönen guten Tag zusammen, ich wollte mich über die Feiertage ein wenig weiter mit meiner 8x8 Matrix beschäftigen, aber stehe vor einem kleinen (in meinen Augen) Problem. Zur Aufgabenstellung. Ich habe den µC 8051 und den Maxim7219, als include Datei dient nur die reg52.h den rest schreibe ich selbst. Die Verbindung, Portbelegung etc ist alles vorhanden. Ich möchte diese mit SPI überttragen. Nun zum eigentlichem Probelm Ich habe ein festgelegtes array das wie folgt aussschaut code char zahl[10][8] = { {0b00000000, 0b00111100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00111100}, usw. } Das erste Array (in diesem Fall 10) soll von außen anwählbar sein, z.B durch Dipstellungen oder Sensoren. Ich muss das 2. Array aber dann auslesen um die Zahl darzustellen. Mein Problem besteht darin das ich zwar weiß das ich erst das MSB brauche und diese auch in ein anderes array schreiben sollte aber mir fällt absolut nichts ein wie ich die Bitfolge umändere und somit später über die DIN es an die Matrix richtig wieder ausgebe. Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht herzlich im voraus :)
Markus Buricke schrieb: > > Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht > herzlich im voraus :) Leg dir deine 'Vorlagen-Arrays' gleich so zurecht, dass du sie einfach in den Ausgabetreiber kopieren kannst ohne Bitmanipulationen machen zu müssen.
Karl Heinz schrieb: > Markus Buricke schrieb: > >> >> Ich hoffe um eine kleine Hilfestellung und bedanke mich schonmal recht >> herzlich im voraus :) > > Leg dir deine 'Vorlagen-Arrays' gleich so zurecht, dass du sie einfach > in den Ausgabetreiber kopieren kannst ohne Bitmanipulationen machen zu > müssen. Denn ob du mittels
1 | code char zahl[10][8] = { {0b00000000, 0b00111100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00100100, 0b00111100}, |
dir das auszugebende Zeichen zeilenweise definierst und als Ausgabe erhalten willst:
1 | |
2 | ........ |
3 | ..XXXX.. |
4 | ..X..X.. |
5 | ..X..X.. |
6 | ..X..X.. |
7 | ..X..X.. |
8 | ..X..X.. |
9 | ..XXXX.. |
oder ob du selber, ganz einfach die Bits anstatt in Zeilen in Spalten in deinem Code organisierst
1 | code char zahl[10][8] = { {0b00000000, 0b0000000, 0b01111111, 0b01000001, |
2 | 0b01000001, 0b1111111, 0b00000000, 0b00000000 }, |
3 | ...
|
ist für dich Jacke wie Hose. Aber Codetechnisch müsstest du im ersten Fall die Spiegelung im Code vornehmen, während du im zweiten Fall die Spiegelung schon im Vorfeld gemacht hast und sie daher dein µC nicht mehr im Code machen muss. Eine derartige Spiegelung ist zwar codetechnisch jetzt nicht das ganz große Kino, aber sie ist lästig und mit ein wenig Vorbereitung auch nicht notwendig.
:
Bearbeitet durch User
Karl Heinz erstmal danke für deine schnelle Antwort. Dieses wäre die einfachste Methode da hast du recht. Nur ich möchte gerne was dazu lernen und verstehen wie sowas geht. Ich würde es vielleicht später erweitern indem ich ins Array die ascii Tabelle hinterlege.
Markus Buricke schrieb: > Karl Heinz erstmal danke für deine schnelle Antwort. > > Dieses wäre die einfachste Methode da hast du recht. Nur ich möchte > gerne was dazu lernen und verstehen wie sowas geht. Na. ja. So wie immer. Bitoperationen halt. Und, Oder, Schiebeoperationen, Negierungen. Wie setzt du denn 1 Bit in einer Variablen? Wie löscht du 1 Bit in einer Variablen? Wie prüfst du, ob 1 Bit in einer Variablen gesetzt ist? Das alles solltest du eigentlich schon längst in den ganzen vorhergehenden Übungen mit Leds, blinkenden Leds, Lauflichtern bis zum Erbrechen geübt haben und im Schlaf beherrschen. Der Rest ist dann nicht mehr als ein paar for-Schleifen drüber gelegt, in denen alle 7-ten Bits der 8 Einzelbytes abgefragt werden und in die 8 Bits des 7.ten Bytes zusammengefasst werden, das dann an die Matrix weitergeht. (die 7 ist hier nur beispielhaft) Mal dir 2 Gitter auf, mit den 8*8 Bit und mal dir Pfeile ein, welches Bit vom Ausgangsgitter an welche Position im Ergebnisgitter kommen muss. Dann ergeben sich die Schleifen recht zwangsläufig
1 | for( j = 0; j < 8; j++ ) |
2 | { |
3 | for( i = 0; i < 8; i++ ) |
4 | { |
5 | if( Bit_j_vom_Byte_i ist gesetzt ) |
6 | Setze Bit_i_vom_Byte_j im Ergebnis |
7 | else |
8 | Lösche Bit_i_vom_Byte_j im Ergebnis |
9 | } |
10 | } |
(optimierungen sind noch möglich, wenn man dann den konkreten Code vor sich hat)
:
Bearbeitet durch User
Karl Heinz schrieb: >
1 | > |
2 | > for( j = 0; j < 8; j++ ) |
3 | > { |
4 | > for( i = 0; i < 8; i++ ) |
5 | > { |
6 | > if( Bit_j_vom_Byte_i ist gesetzt ) |
7 | > Setze Bit_i_vom_Byte_j im Ergebnis |
8 | > else |
9 | > Lösche Bit_i_vom_Byte_j im Ergebnis |
10 | > } |
11 | > } |
12 | > |
Dafür machst du dir eine Funktion, die das für ein 1-Dimensionales Ausgangsarray macht. Und in diese Funktion steckst du dann die 'Arrayzeile' aus deiner Tabelle rein. Ein 2-d Array ist ja auch nichts anderes, als 10 mal ein 1-d Array bestehend aus 8 zusammengehörenden Bytes, die hintereinander im Speicher angeordnet sind. Aus diesen 10 Stück 1-d Arrays wählst du das eine aus, das dich interessiert und übergibst dessen Startadresse an die Funktion.
1 | void foo( uint8_t codes[8] ) |
2 | {
|
3 | uint8_t i; |
4 | |
5 | for( i = 0; i < 8; i++ ) |
6 | mach was mit codes[i] |
7 | }
|
8 | |
9 | void bar() |
10 | {
|
11 | uint8_t totalCodes[10][8] = ... |
12 | |
13 | foo( totalCodes[3] ); // die 4.te Zeile |
14 | foo( totalCodes[5] ); // die 6.te Zeile |
15 | }
|
Organisation ist in der Programmierung das halbe Leben. "Komplizierte" Datenstrukturen bricht man sich zur Verarbeitung eben runter auf die Teile, die man tatsächlich braucht. Bei dir ist das eben dann genau die eine Zeile aus dem kompletten Array, welche dich im Moment interessiert.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.