2x7 Segment Anzeige mit Schaltern

OP #1046388
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
OP #1046447
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.
Gast #1046458
>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... ?
Gast #1046474
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??
OP #1046486
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?
Gast #1046490
>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.
OP #1046504
ö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
Gast #1046513
>ö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.
OP #1046526
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
Gast #1046569
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.
Gast #1046585
>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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.