Non conosco il microcontrollore PIC, quindi darò una risposta più generale. (modifica: risposta specifica per PIC aggiunta in fondo a questo post)
Soprattutto i microcontrollori più piccoli, come 8 bit e i loro derivati, sono limitati in ciò che possono fare in un singola istruzione. Un'istruzione può contenere l'indirizzo di destinazione per un salto, ma non due, quindi then-else
è fuori. Hai solo la parte if-then
, ma è sufficiente. Esistono due approcci. Alcuni controller ti consentono di passare a un determinato indirizzo se una condizione è soddisfatta, altri ti consentono solo di saltare l'istruzione successiva. Nel primo caso il tuo codice apparirà come segue:
if-test-successs goto test-successtest-failed prima istruzione di `else` block ... goto continuetest-success prima istruzione di` then` blocca ... continua la prima istruzione dopo if-then-else
Se puoi solo saltare l'istruzione successiva, scrivi qualcosa come
if-test-successs salta la prossima istruzione goto test-failedtest-success prima istruzione del blocco `then` ... goto continuetest-fallita prima istruzione del blocco` else` ... continua prima istruzione dopo if-then-else
Anche il test stesso ha possibilità limitate. Come se non potessi passare due numeri per confrontarli. Quello che devi fare è caricare l'accumulatore con il primo numero e nell'istruzione successiva sottrarre il secondo numero. Ciò farà sì che i codici di condizione come lo zero e i flag di trasporto vengano impostati / cancellati. Le istruzioni condizionali testeranno questi flag. Quindi, se vuoi scrivere if A = B then do-equal else do-not-equal
questo diventerebbe
carica accumulatore con A sottrai B dall'accumulatore se zero -flag set goto do-equaldo-not-equal prima istruzione del blocco `else` ...
goto continuedo-equal prima istruzione di `then` block ... continua prima istruzione dopo if-then-else
Importante: il manuale del set di istruzioni ti dirà quali codici condizione saranno influenzati una data istruzione. Ad esempio, nella Z80 l'istruzione ld
(per "load accumulator") non cambierà alcun flag. Quindi qui caricare l'accumulatore non è sufficiente per determinare se i dati sono zero.
modifica
OK, quindi ho fatto qualche ricerca e ho trovato quanto segue:
Il PIC ha solo 2 istruzioni di salto condizionale, BTFSS
e BTFSC
.
BTFSS : Bit Test F, Salta se impostato
Sintassi: BTFSS f, b
dove f è un registro [0..127]
e b è il bit in quel registro da testare [0..7]
Descrizione: Se il bit nel registro è 0
, viene eseguita l'istruzione successiva. Se il bit è 1
, l'istruzione successiva viene scartata e viene invece eseguito un NOP
.
BTFSC : Bit Test F, Salta se Cancella
Sintassi: BTFSC f, b
dove f è un registro [0..127]
e b è il bit in quel registro da testare [0..7]
Descrizione: Se il bit nel registro è 1
, viene eseguita l'istruzione successiva. Se il bit è 0
, l'istruzione successiva viene scartata e al suo posto viene eseguito un NOP
.