Lezione 6 di 43

Lezione 05

πŸŽ“ PIC16 β€” From Zero to Hero Β· Lezione 05

Operazioni logiche πŸ”€

ANDLW   ANDWF   IORLW   IORWF   XORLW   XORWF
Mascherare bit, accendere pin, fare toggle β€” tre pattern che usi ogni giorno.

🎯 Cosa impari in questa lezione

  • Come funzionano AND, OR, XOR bit per bit su 8 bit
  • ANDLW/ANDWF β€” mascherare (isolare) bit specifici
  • IORLW/IORWF β€” settare bit specifici a 1 senza toccare gli altri
  • XORLW/XORWF β€” invertire (toggle) bit specifici
  • I tre pattern fondamentali: mask Β· set Β· toggle
  • PerchΓ© queste istruzioni modificano solo il flag Z (mai C nΓ© DC)

πŸ“‹ Scheda lezione

Modulo1 β€” Assembly Base
Lezione05 di 42
Livello⭐⭐ Principiante+
Tempo~25 minuti
Istruzioni6 nuove
Flag STATUSZ soltanto

🧠 Tre operazioni, tre scopi precisi

Le operazioni logiche lavorano bit per bit: ogni bit del primo operando viene combinato con il bit corrispondente del secondo, indipendentemente dagli altri. Il risultato ha sempre 8 bit. Niente carry, niente overflow β€” solo Z se il risultato Γ¨ 0x00.

Tavole di veritΓ  per singolo bit β€” le regole di AND, OR, XOR AND (&) risultato = 1 solo se ENTRAMBI sono 1 A B A AND B 000 010 100 111 OR (|) risultato = 1 se ALMENO UNO Γ¨ 1 A B A OR B 000 011 101 111 XOR (^) risultato = 1 se i due bit sono DIVERSI A B A XOR B 000 011 101 110
Figura 1 β€” Tavole di veritΓ : AND azzera, OR setta, XOR inverte

β‘  AND β€” isolare bit (mascheratura)

Sintassi
ANDLW k
Operazione
W AND k β†’ W
Sintassi
ANDWF f,d
Operazione
W AND f β†’ dest
Flag
Z soltanto

AND Γ¨ la maschera: i bit a 0 nella maschera “spengono” i bit corrispondenti nel risultato, i bit a 1 li “lasciano passare” invariati. Usatissimo per estrarre il nibble basso, ignorare bit di stato, testare singoli bit.

AND β€” estrarre nibble basso di PORTB (bit 3..0) W = 1011 0110 = 0xB6 AND 0x0F = 0000 1111 bit 7..4 = 0 β†’ azzerati; bit 3..0 = 1 β†’ passano risultato = 0000 0110 = 0x06 (solo nibble basso estratto)

; Estrarre nibble basso (bit 3..0)
MOVF PORTB, W ; W = stato PORTB
ANDLW 0x0F ; W = W AND 0x0F β†’ bit 7..4 azzerati

; Estrarre nibble alto (bit 7..4)
MOVF PORTB, W
ANDLW 0xF0 ; W = W AND 0xF0 β†’ bit 3..0 azzerati

; Testare se i bit 1 e 0 di una variabile sono entrambi 0
FLAGS EQU 0x0C
MOVF FLAGS, W
ANDLW b’00000011′ ; isola bit 1 e bit 0
; Z=1 se entrambi erano 0

πŸ’‘ Regola pratica AND: metti 1 nella maschera dove vuoi vedere il bit originale, metti 0 dove vuoi azzerarlo. Se dopo l’AND il risultato Γ¨ 0 (Z=1), tutti i bit di interesse erano a 0.


β‘‘ OR β€” settare bit a 1

Sintassi
IORLW k
Operazione
W OR k β†’ W
Sintassi
IORWF f,d
Operazione
W OR f β†’ dest
Flag
Z soltanto

OR Γ¨ il setter: i bit a 1 nella maschera forzano a 1 i bit corrispondenti nel risultato, i bit a 0 lasciano invariato ciΓ² che c’era. Usato per accendere LED, abilitare periferiche, settare flag di stato.

OR β€” accendere i LED su RB7, RB6 e RB0 senza toccare gli altri PORTB = 0010 1100 = 0x2C OR 0xC1 = 1100 0001 bit a 1 β†’ forzati a 1; bit a 0 β†’ invariati risultato = 1110 1101 = 0xED (RB7, RB6, RB0 ora accesi)

; Accendere RB7, RB6 e RB0 senza toccare gli altri bit
MOVF PORTB, W
IORLW b’11000001′ ; OR forza a 1 i bit 7, 6 e 0
MOVWF PORTB

; Settare il bit GIE (bit 7 di INTCON) per abilitare interrupt
MOVF INTCON, W
IORLW b’10000000′ ; setta GIE, lascia tutto il resto invariato
MOVWF INTCON

; Alternativa piΓΉ compatta con IORWF direttamente su RAM
MOVLW 0x80
IORWF INTCON, F ; INTCON |= 0x80 (stesso risultato, 2 istruzioni)

πŸ’‘ Regola pratica OR: metti 1 nella maschera dove vuoi forzare a 1, metti 0 dove vuoi lasciare invariato. OR non puΓ² mai mettere un bit a 0 β€” usa AND per quello.


β‘’ XOR β€” invertire bit (toggle)

Sintassi
XORLW k
Operazione
W XOR k β†’ W
Sintassi
XORWF f,d
Operazione
W XOR f β†’ dest
Flag
Z soltanto

XOR Γ¨ il toggle: i bit a 1 nella maschera invertono il bit corrispondente (0β†’1 o 1β†’0), i bit a 0 lasciano invariato. Perfetto per il lampeggio LED: basta fare XOR con la stessa maschera ogni volta.

XOR ha anche una proprietΓ  speciale: A XOR A = 0. Se fai XOR di un registro con sΓ© stesso ottieni zero. Questa Γ¨ la forma piΓΉ veloce per azzerare W (anche se CLRW Γ¨ piΓΉ leggibile).

XOR β€” toggle di RB3 e RB1 (lampeggio selettivo) PORTB = 1011 0010 = 0xB2 XOR 0x0A = 0000 1010 bit a 1 β†’ invertiti; bit a 0 β†’ invariati risultato = 1011 1000 = 0xB8 (RB3 e RB1 invertiti)

; Toggle di RB0 β€” lampeggio LED ogni volta che esegui questo codice
MOVLW 0x01 ; maschera: solo RB0
XORWF PORTB, F ; RB0 cambia stato ad ogni esecuzione

; Toggle di tutti i pin PORTB (tutti cambiano insieme)
MOVLW 0xFF
XORWF PORTB, F ; alternativa ON/OFF totale

; Confronto: A == B? (XOR β†’ Z=1 se uguali)
MOVF VALORE_A, W
XORWF VALORE_B, W ; Z=1 se A==B (tutti i bit coincidono)

; Azzerare W con XOR (trucco accademico)
XORLW 0xFF ; W = complemento di W
XORLW 0xFF ; W = W originale (doppio XOR = identitΓ )

πŸ” XOR come confronto: A XOR B = 0 (Z=1) se e solo se A e B sono identici bit per bit. È un modo rapido per confrontare due byte senza usare la sottrazione β€” e senza toccare C nΓ© DC.


πŸ“Š I tre pattern β€” riepilogo visivo

MASK β€” AND Bit maschera = 1 β†’ passa Bit maschera = 0 β†’ azzerato ANDLW / ANDWF β†’ isolare, testare, pulire nibble SET β€” OR Bit maschera = 1 β†’ forzato a 1 Bit maschera = 0 β†’ invariato IORLW / IORWF β†’ accendere LED, abilitare flag TOGGLE β€” XOR Bit maschera = 1 β†’ invertito Bit maschera = 0 β†’ invariato XORLW / XORWF β†’ lampeggio, confronto, swap
Figura 2 β€” I tre pattern logici: mask (AND), set (OR), toggle (XOR)
IstruzioneOperazionedestCDCZUso tipico
ANDLW kW AND kWβ€”β€”βœ…maschera costante
ANDWF f,dW AND fW o fβ€”β€”βœ…maschera su registro
IORLW kW OR kWβ€”β€”βœ…setta bit con costante
IORWF f,dW OR fW o fβ€”β€”βœ…setta bit su registro
XORLW kW XOR kWβ€”β€”βœ…toggle, confronto
XORWF f,dW XOR fW o fβ€”β€”βœ…toggle su registro

β€” = flag non modificato dall’istruzione. Nessuna delle sei istruzioni modifica C o DC.


πŸ’» Programma β€” i tre pattern in azione

; ============================================
; Lezione 05 β€” AND, OR, XOR
; Prof. D.Bertolino Β· WebPicSimulator
; ============================================
LIST p=16F84A
#include <p16f84a.inc>
REG EQU 0x0C
ORG 0x00

; — Pattern AND (MASK) —
MOVLW 0xB6 ; W = 1011 0110
ANDLW 0x0F ; [1] W=? Z=? (nibble basso)

MOVLW 0xB6
ANDLW 0xF0 ; [2] W=? Z=? (nibble alto)

MOVLW 0x00
ANDLW 0xFF ; [3] W=? Z=? (AND con tutti 1)

; — Pattern OR (SET) —
MOVLW 0x2C ; W = 0010 1100
IORLW 0xC1 ; [4] W=? Z=? (set RB7, RB6, RB0)

MOVLW 0xB6
MOVWF REG
MOVLW 0x40
IORWF REG, F ; [5] REG=? (setta bit 6, W=0x40 invariato)

; — Pattern XOR (TOGGLE) —
MOVLW 0xAA ; W = 1010 1010
XORLW 0xFF ; [6] W=? Z=? (complemento)

MOVLW 0x3C ; W = 0011 1100
XORLW 0x3C ; [7] W=? Z=? (XOR con sΓ© stesso)

; Confronto A==B con XOR
MOVLW 0x42
MOVWF REG
MOVF REG, W
XORLW 0x42 ; [8] Z=? (REG == 0x42?)

FINE GOTO FINE
END

Mostra soluzione
#IstruzioneWREGZNote
1ANDLW 0x0F0x06β€”00xB6 AND 0x0F = 0x06 (nibble basso)
2ANDLW 0xF00xB0β€”00xB6 AND 0xF0 = 0xB0 (nibble alto)
3ANDLW 0xFF0x00β€”10x00 AND 0xFF = 0x00 β€” Z=1!
4IORLW 0xC10xEDβ€”00x2C OR 0xC1 = 0xED
5IORWF REG,F0x400xF600xB6 OR 0x40 = 0xF6 (bit 6 settato)
6XORLW 0xFF0x55β€”00xAA XOR 0xFF = 0x55 (complemento)
7XORLW 0x3C0x00β€”10x3C XOR 0x3C = 0x00 β€” Z=1!
8XORLW 0x420x000x4210x42 XOR 0x42 = 0 β†’ Z=1 (sono uguali)

πŸ‹οΈ Prova tu!

  1. Hai una variabile STATO che vale 0xA7. Scrivi una sequenza che azzera i bit 7 e 5 senza toccare gli altri. Qual Γ¨ la maschera AND da usare? Quanto vale STATO dopo?
  2. Partendo da PORTB = 0x00, accendi solo i LED sui pin pari (RB6, RB4, RB2, RB0) usando una singola operazione OR. Quale valore usi come maschera?
  3. Sfida: scrivi un mini-programma che usa XOR per fare lampeggiare solo i bit dispari di PORTB (RB7, RB5, RB3, RB1). Il ciclo deve usare GOTO per ripetersi β€” prova a mettere un NOP tra i toggle per simulare un ritardo visivo nello step.

πŸ’‘ Esercizio 1: una maschera AND che azzera bit 7 e bit 5 deve avere quei due bit a 0 e tutti gli altri a 1. Scrivi il byte in binario β€” Γ¨ piΓΉ facile trovare il valore.

❓ Quiz rapido

1. Voglio settare il bit 3 di PORTB a 1 senza toccare gli altri. Quale istruzione uso e con quale maschera?

Mostra risposta

MOVLW b'00001000' (0x08) poi IORWF PORTB, F. OR con 0x08: solo il bit 3 viene forzato a 1, tutti gli altri rimangono invariati.


2. Dopo MOVLW 0x55 / ANDLW 0xAA quanto vale W e quanto vale Z?

Mostra risposta

0x55 = 0101 0101, 0xAA = 1010 1010. AND di due byte con bit complementari = 0000 0000 = 0x00. W = 0x00, Z = 1. Non hanno nessun bit in comune!


3. Le istruzioni logiche modificano C o DC?

Mostra risposta

No β€” AND, OR e XOR modificano solo Z. Non c’Γ¨ concetto di carry o digit carry nelle operazioni logiche (non c’Γ¨ “9 + 1 = 10” bit per bit). C e DC rimangono al valore che avevano prima.


4. Come faccio a azzerare il bit 4 di un registro RAM senza toccare gli altri bit?

Mostra risposta

AND con una maschera che ha il bit 4 a 0 e tutti gli altri a 1: b'11101111' = 0xEF. Sequenza: MOVLW 0xEF / ANDWF REGISTRO, F. (In alternativa, nella prossima lezione vedrai BCF REGISTRO, 4 che fa esattamente questo in una sola istruzione.)

Prossima lezione β†’

Lezione 06 β€” Rotazioni e SWAPF
RLF, RRF, COMF, SWAPF β€” spostare bit,
invertire byte, scambiare nibble attraverso il Carry.

Β© Prof. D. Bertolino Β· PIC16 From Zero to Hero Β· WebPicSimulator Β· Lezione 05