Nie znam mikrokontrolera PIC, więc podam bardziej ogólną odpowiedź. (edytuj: odpowiedź specyficzna dla PIC dodana na dole tego postu)
Szczególnie mniejsze mikrokontrolery, takie jak 8-bitowe i ich pochodne, są ograniczone w tym, co mogą zrobić w pojedyncza instrukcja. Instrukcja może zawierać adres docelowy skoku, ale nie dwa z nich, więc then-else
nie działa. Masz tylko część if-then
, ale to wystarczy. Istnieją dwa podejścia. Niektóre kontrolery pozwalają na przeskoczenie do podanego adresu, jeśli warunek jest spełniony, inne pozwalają tylko na pominięcie następnej instrukcji. W pierwszym przypadku twój kod będzie wyglądał następująco:
jeśli test zakończy się sukcesem goto test-successtest-failed pierwsza instrukcja bloku `else` ... goto ciągła test-sukces pierwsza instrukcja` then` block ... kontynuuj pierwszą instrukcję po if-then-else
Jeśli możesz tylko pominąć następną instrukcję, napiszesz coś takiego jak
jeśli-test-się powiedzie pomiń następną instrukcję goto test-failedtest-success pierwsza instrukcja bloku `then` ... goto continuetest-failed pierwsza instrukcja bloku` else` ... kontynuuj pierwszą instrukcję po if-then-else
Sam test również ma ograniczone możliwości. Jakby nie można podać dwóch liczb, aby je porównać. To, co robisz, to ładowanie akumulatora pierwszą liczbą iw następnej instrukcji odejmowanie drugiej liczby. Spowoduje to ustawienie / wyczyszczenie kodów warunków, takich jak zero i flagi przenoszenia. Instrukcje warunkowe będą testować te flagi. Więc jeśli chcesz napisać if A = B then do-equal else do-not-equal
to będzie
załaduj akumulator z A odejmij B od akumulatora, jeśli zero -flag set goto do-equaldo-not-equal pierwsza instrukcja bloku `else` ...
goto continueo-equal pierwsza instrukcja bloku `then` ... kontynuuj pierwszą instrukcję po if-then-else
Ważne: instrukcja zestawu instrukcji powie ci, na które kody warunków wpłynie dana instrukcja. Na przykład w Z80 instrukcja ld
(oznaczająca „load accumulator”) nie zmieni żadnych flag. Więc tutaj ładowanie akumulatora nie jest wystarczające do określenia, czy dane są zerowe.
edytuj
OK, więc poszukałem kilku informacji i znalazłem następujące informacje:
PIC ma tylko 2 warunkowe instrukcje skoku, BTFSS
i BTFSC
.
BTFSS : Test bitowy F, Pomiń, jeśli ustawiono
Składnia: BTFSS f, b
gdzie f jest rejestrem [0..127]
i b jest bitem w tym rejestrze, który ma być testowany [0..7]
Opis: Jeśli bit w rejestrze to 0
, wykonywana jest następna instrukcja. Jeśli bit ma wartość 1
, następna instrukcja jest odrzucana, a zamiast niej wykonywany jest NOP
.
BTFSC : Bit Test F, Pomiń, jeśli wyczyść
Składnia: BTFSC f, b
gdzie f jest rejestrem [0..127]
i b jest bitem w tym rejestrze, który ma być testowany [0..7]
Opis: Jeśli bit w rejestrze to 1
, wykonywana jest następna instrukcja. Jeśli bit ma wartość 0
, następna instrukcja jest odrzucana, a zamiast tego wykonywany jest NOP
.