Ich bin mit dem PIC-Mikrocontroller nicht vertraut, daher werde ich eine allgemeinere Antwort geben. (Bearbeiten: PIC-spezifische Antwort am Ende dieses Beitrags hinzugefügt)
Insbesondere kleinere Mikrocontroller wie 8-Bit und ihre Ableitungen sind in ihrer Leistung in einem einzigen Befehl begrenzt. Ein Befehl kann die Zieladresse für einen Sprung enthalten, aber nicht zwei davon, then-else
ist also out. Sie haben nur das if-then
Teil, aber das ist genug. Es gibt zwei Ansätze. Bei einigen Controllern können Sie zu einer bestimmten Adresse springen, wenn eine Bedingung erfüllt ist, bei anderen können Sie nur die nächste Anweisung überspringen. Im ersteren Fall sieht Ihr Code wie folgt aus:
if-test-succeeds goto test-success
test-failed first instruction of `else` block
...
goto continue
test-success first instruction of `then` block
...
continue first instruction after if-then-else
Wenn Sie nur die nächste Anweisung überspringen können, schreiben Sie so etwas wie
if-test-succeeds skip next instruction
goto test-failed
test-success first instruction of `then` block
...
goto continue
test-failed first instruction of `else` block
...
continue first instruction after if-then-else
Der Test selbst hat auch begrenzte Möglichkeiten. Als ob Sie nicht zwei Zahlen übergeben können, um sie zu vergleichen. Sie laden den Akku mit der ersten Zahl und subtrahieren in der nächsten Anweisung die zweite Zahl. Dies führt dazu, dass Bedingungscodes wie die Null- und Übertragsflags gesetzt / gelöscht werden. Bedingte Anweisungen testen diese Flags. Also, wenn Sie schreiben möchten, if A = B then do-equal else do-not-equal
würde dies werden
load accumulator with A
subtract B from accumulator
if zero-flag set goto do-equal
do-not-equal first instruction of `else` block
...
goto continue
do-equal first instruction of `then` block
...
continue first instruction after if-then-else
Wichtig: In der Bedienungsanleitung wird angegeben, welche Bedingungscodes von einer bestimmten Anweisung betroffen sind. Zum Beispiel kann der in dem Z80 - ld
Befehl (für „Last Akkumulator“) wird nicht alle Flags ändern. Hier wird also der Akku geladen nicht aus, um festzustellen, ob die Daten Null sind.
OK bearbeiten , also habe ich einige Nachforschungen angestellt und Folgendes gefunden:
Der PIC hat nur 2 bedingte Sprunganweisungen, BTFSS
und BTFSC
.
BTFSS : Bittest F, Überspringen, wenn gesetzt
Syntax: BTFSS f, b
wobei f ein Register [0..127]
und b das Bit in dem zu testenden
Register ist [0..7] Beschreibung: Wenn das Bit im Register ist 0
Der nächste Befehl wird ausgeführt. Wenn das Bit ist1
der nächste Befehl verworfen und NOP
stattdessen a ausgeführt.
BTFSC : Bittest F, Überspringen, wenn
gelöscht Syntax: BTFSC f, b
wobei f ein Register [0..127]
und b das Bit in dem zu testenden
Register ist [0..7] Beschreibung: Wenn das Bit im Register ist 1
Der nächste Befehl wird ausgeführt. Wenn das Bit ist, wird 0
der nächste Befehl verworfen und NOP
stattdessen a ausgeführt.