Hi, ich stehe gerade vor dem Problem, dass ich nicht weiß, wie ich die darzustellende Zahl einer 7-Segment Anzeige mit Schaltern beeinflussen kann. Situation: zwei 7 Segment Anzeige 4 Schalter Mikrocontroller 80535 Jeder Schalter hat einen Wert. Der erste 1, der zweite 2, der dritte 4 und der vierte 8. sodass maximal die Ziffer 15 mit den Schaltern bestimmt werden kann. Nur ich weiß nicht wie ich anhand der Schalterstellung eine Zahl auf eines der Anzeigen bringen kann. Erstmal ist nur wichtig das die erste der beiden Anzeigen geht. In C würde ich das so schreiben: if(Schalter1 == 1 && Schalter2 == 0 && Schalter3 == 0 && Schalter4 == 0) { ersteAnzeige = 00110000; // für die eins Binär } else if(Schalter.... usw. Hoffe es ist klar geworden. Irgendwie muss ich warscheinlich für jede Zahl eine Bitkette irgendwo(wo?) irgendwie(wie?) speichern und dann anhand einer IF ähnlichen Abfrage in die Anzeige schieben?! Ich habe schon den Befehl cmp ausprobiert, nur funktioniert der wohl nicht bei diesem uC. Gibt es noch eine andere Möglichkeiten. Mit addieren und subtrahieren und so? Wäre echt dankbar über Hilfe... Auch wenn es nur ein Lösungsansatz ist PS: Bin Anfänger in Sachen Assembler und es muss in Assembler sein. Kein C
Schaltplan? Folgendes musst du dir bedenken: Was muss ich wo ausgeben, um welche Zahl darzustellen?
einen Schaltplan hab ich nicht. Welche Eingänge ich auf 1 bzw auf 0 stellen muss weiß ich. 0 = 00111111 1 = 00110000 2 = 01011011 3 = 01111001 4 = 01110100 5 = 01101101 6 = 01101111 7 = 00111000 8 = 01111111 9 = 01111101 Hoffe das hat weitergeholfen. Die 2. Anzeige wird angeschaltet wenn das höchste Bit auf 1 ist.
Die Taster kann ich mit P5.0 - P5.3 ansteuern. Wenn das bit von p5.0 gesetzt ist ist der Schalter betätigt
>Die Taster kann ich mit P5.0 - P5.3 ansteuern.
Wie genau?
P5.0 => Schalter für 1
P5.1 => Schalter für 2
P5.2 => Schalter für 4
P5.3 => Schalter für 8
So wäre es ideal... ?
Na das ist doch ideal. Folgende Denkansätze: >0 = 00111111 >... >9 = 01111101 könnte man in einem Array abspeichern:
1 | uint8_t au8SegData[] = { 0b00111111, 0b00110000, 0b01011011, 0b01111001, |
2 | 0b01110100, 0b01101101, 0b01101111, 0b00111000, |
3 | 0b01111111, 0b01111101 }; |
Weiterhin folgende Überlegung: >P5.0 => Schalter für 1 >P5.1 => Schalter für 2 >P5.2 => Schalter für 4 >P5.3 => Schalter für 8 Wenn du dir diese vier Bits des Ports als binäre Zahl vorstellst, und zB mit den Schaltern eine 5 einstellst, wie sieht dann das Bitmuster, resp. die (4bit gropße) Zahl aus??
Ich weiß nicht ob du das meinst, aber wenn ich eine 5 mit den Schaltern darstelle, dann steht in P5 00000101 Wenn ich so ein Array habe, wie greife ich dann darauf zu und schieben dann den Inhalt in meinen anderen Port?
>00000101 Ja das ist korrekt. und jetzt wandel das mal in eine Dezimalzahl um! >Wenn ich so ein Array habe, wie greife ich dann darauf zu und schieben >dann den Inhalt in meinen anderen Port?
1 | PORT_X = au8SegData[variable]; |
Der Platzhalter variable steht für eine Ziffer zwische 0..9, weil das Array oben 10 Elemente hat.
Dezimal ist das dann 5... ist das nicht C Code was da steht? Sowas wie = oder ; (außer für Kommentare) gibt es doch nicht in Assembler oder?
>Dezimal ist das dann 5... Geht dir ein Licht auf? >ist das nicht C Code was da steht? Ja. Das ist C.
öhm ne^^ ich brauche Assembler Code. Mit C Code kann ich nichts anfangen Edit: Oder meinst du das ich den inhalt von dem Port als Index für das Array verwenden kann? Jedoch ist dies ja nur in C so. Assembler ist aber gefordert
>öhm ne^^ >aber wenn ich eine 5 mit den Schaltern >darstelle, dann steht in P5 eine 00000101 >Dezimal ist das dann 5... Ok. Jetzt mach das mal für alle anderen Schalterstellungen! Schalterstellung => Bitmuster => Dezimal >Mit C Code kann ich nichts anfangen Warum hast du dann mit C angefangen? >>if(Schalter1 == 1 && Schalter2 == 0 && Schalter3 == 0 && Schalter4 == 0) EDIT: >Oder meinst du das ich den inhalt von dem Port als Index für das Array >verwenden kann? So ist das gemeint. >ich brauche Assembler Code Dann halt in asm.
Als Beispiel Anders wusste ich nicht wie ich es einfach darstellen kann.
1 | P5.0 = 1 = 00000001 |
2 | P5.1 = 2 = 00000010 |
3 | P5.1 + P5.0 = 3 = 00000011 |
4 | P5.2 = 4 = 00000100 |
5 | P5.2 + P5.0 = 5 = 00000101 |
6 | P5.2 + P5.1 = 6 = 00000110 |
7 | P5.2 + P5.1 + P5.0 = 7 = 00000111 |
8 | P5.3 = 8 = 00001000 |
9 | P5.3 + P5.0 = 9 = 00001001 |
Fällt dir was auf? bzgl. der Schalterstellung und der Dezimalzahl?
Das jeder mit jedem irgendwann mal in Verbindung steht. Oder was meinst du?
Nein. Das die Zahl, die du mit den Schaltern einstellst, auch als Dezimalzahl, also im Eingangsregister steht.
Was meinst du mit Eingangsregister? Hast du vielleicht ein Beispiel in Assembler?
Welcher Prozessor? Na über irgendein Register muss man doch die Eingänge einlesen können. Genauso wie du Port5 als Ausgang nutzen möchtest, gibt es ein Register (wahrscheinlich heißt das sogar Port5) was du beschreibst, um die Ausgänge auch wirklich zu setzen.
ein 80535 wenn ich einen schalter setzen möchte verwende ich setb P5.0 oder mov p5,#00000001B
>80535 Iiiiiiiih... >wenn ich einen schalter setzen möchte verwende ich >setb P5.0 >oder mov p5,#00000001B Du meinst, wenn du einen Ausgang schalten willst. Und wie werden Eingänge abgefragt?
Ich weiß nicht ob du das meinst aber auf dieses Bild bezogen http://upload.wikimedia.org/wikipedia/commons/1/18/7Segment_24.svg ist P4.0 = d P4.1 = e P4.2 = f P4.3 = a P4.4 = b P4.5 = c P4.6 = g und als Bitmuster ist P4 dann #0gcbafedB
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.