Hallo an alle.
Ich möchte einen Taschenrechner programmieren.
Verwendete IDE : Keil mvision 2
Verwendete CPU : Dallas DS87C520/DS83C520
-> Also Architektur ist 8051( wie in der Überschrift bereits erwähnt )
Und ich verwende im Moment nur den internen Simulator von Keil.
So nun zum Problem:
Ich kann EIN Zeichen einlesen folgendermaßen:
1
getString:
2
jnbri,$;wartenaufTastendruck
3
callpause;10mswarten
4
jnbri,getString;zurückwennTastenprellen
5
mova,sbuf;gedrückteTasteinAkkuladen
6
callsend;gedrückteTasteausgeben
7
cjnea,#0x23,getString;solangenicht#wiederhole
8
9
;Raute-Tastewurdeoffentsichtlichgedrückt
10
ret
Nun als Beispiel: Ich habe eine '1' eingegeben. Er liest diese '1' ein
und gibt sie auch wieder auf dem Screen aus. Nun gebe ich wieder eine
'1' ein und er liest diese wieder ein und gibt sie aus.
Das Problem ist nun, dass ich ja diese Zahl, was eigentlich eine '11'
wäre, mit einer 2. Zahl addieren möchte. Wie mach ich das, dass ich die
Zahlen die ich eingebe wie eine Art String behandeln kann und nicht wie
immer ein einzelnes Zeichen.
Sodass, wenn ich zweimal die '1' drücke am Ende auch eine Zahl: '11'
herauskommt mit der ich richtig rechnen kann.
In C wäre das die Funktion strcat( also hänge Zeichen an Zeichenkette ),
nur wie ist das in Assembler ?
Vielen Dank für Eure Hilfe
Mfg coVo2k
Im Prinzip genauso.
Erstmal must du festlegen wie deine Strings in Assembler aussehen
sollen.
Am einfachsten waere hier die C Notation zur verwenden. Also ASCII
Zeichen mit 0x0 zu terminierung.
Dann resevierst du dir einen Speicherbereich wo die Zahl abgespeicher
werden soll. Auf diesem Speicherbereich stellst du einen Ptr . Wenn das
erste Zeichen eingelesen ist speicherst du es an dieser Stelle. Dann
erhoehst du deinen Ptr . An dieser Stelle schreibst du dann mal die Ende
0 rein. Beim naechsten Zeichen wiederholt sich das spielchen. So baut
sich jetzt langsam im Speicher dein Eingabe String auf.
Bei irgendeiner von dir festgelegten Taste wird die Eingabe beendet und
mit der berechnung begonnen. Aber Achtung die Zeichen liegen hier im
ASCII Code vor und nicht als binaerwert. Du must also vorher noch eine
ASCII -> Integer konvertierung durchfueheren.
Gruss Helmi
Hallo,
ich habe mal einen wissenschaftlichen Taschenrechner mit Stoppuhr auf
einem PIC programmmiert. Da ich HP-Fan bin, natürlich mit UPN :-)
Naja, du musst dir vorher ein paar theoretische Gedanken machen:
Welche Eingaben schliessen die Eingabe einer Zahl ab? Das sind die
Rechenfunktionen (und ENTER bei UPN). Aber was ist mit dem unären Minus
(Vorzeichenwechsel)? Und was ist mit dem Zehner-Exponenten, ist mit
dessen Eingabe die Eingabe der Zahl direkt abgeschlossen (dann ist keine
Korrektur möglich).
Und wie Peter schon gesagt hat, Warum mit Strings abquälen? Entweder BCD
oder binär (wie bei Peter). Dann muss man sich aber auch des Nachteils
der binären Darstellung bewusst werden, und sowohl bei BCD wie binär
brauchst du intern mehr Stellen, als auf dem Display, weil du korrekt
runden willst.
Cordic oder Coridic heisst der Algortihmus, der gleichzeitig
Winkelfunktionen und Logarithmen berechnen kann. Ansonsten halt über
eine Reihenentwicklung annähern.
siehe
http://de.wikipedia.org/wiki/CORDIC
>Allein schon floating-point-Zahlen werden ein Vergnügen>werden...
Ooch die sind kein grosses Problem wenn man weiss wie eine
Floatingpointzahl aufgebaut ist.
Gruss Helmi
Hallo an alle.
Ich danke euch erstmal für die rege Teilnahme an meiner Frage.
Aber ich habe vielleicht ein paar Fakten vergessen, die manche Frage
schon von alleine klären sollte.
Was ich hier vorhabe ist ein Projekt für das Studium. Es dient als
Abschlussarbeit für ein Fach, genannt Mikroprozessortechnik.
Dieser Taschenrechner soll nur die 4 Grundrechenarten unterstützen.
Also keine Winkelfunktionen oder ähnliches.
Und es soll mit Assembler, genauer mit der Keil IDE und der
8051-Architektur umgesetzt werden.
Ich habe aus euren Antworten versucht etwas nützliches zu programmieren,
komme aber hier schon wieder auf ein neues Problem.
1
test:
2
;1.Ziffereingegeben
3
mova,#0x01;1.Ziffer=1
4
movr4,a;schreibedie1inregister4
5
movb,#0x10;gibdenmul.faktor10anb
6
mulab;multipliziereaundb
7
movr4,a;gebedasergebnisinr4(1*10=10)
8
9
;2.Ziffereingeben
10
mova,#0x03;eingegebeneszeichenisdie3
11
movr5,a;SpeicheredieZiffer3.temporärinr5
12
movb,#0x10;balsmultiplikator10
13
mova,r4;aktuellezahlinavonr4schreiben
14
;mulab;multipliziereaundb
15
adda,r5;addieredie3ana(=13)
16
movr4,a;schreibeergebniswiederinr4
Das Problem ist das a und b Hex-Zahlen annehmen also steht dann im
Debugger für r4 : 0x13.
Wenn ich jetzt eine weitere Ziffer eingebe hängt er diese natürlich
nicht an r4 dran da die Zeichenweite überschitten ist.
Muss ich da jetzt noch temporär eine Hex-Binärumwandlung durchführen ?
Oder was ist der Schritt in die richtige Richtung?
Und nebenbei, weiß jemand wie man in der KEIL - IDE das Simulator
Fenster ( Serial Window #1 ) clear screenen kann ?
Wie man das dann über ein Entwicklungsboard macht z.b. MCS-51 weiß ich
ja aber in dem Simulator hat man ja offentsichtlich keine Ports.
Vielen Dank im Vorraus.
Mfg coVo2k
Tut mir leid, aber die Antwort findest du schon weiter oben: Werde dir
erstmal über die Zahlendarstellung klar, nimm die ein Blatt Papier und
probiere es aus. Das brauchst du eh später als Dokumentation.