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 specificiIORLW/IORWFβ settare bit specifici a 1 senza toccare gli altriXORLW/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
| Modulo | 1 β Assembly Base |
| Lezione | 05 di 42 |
| Livello | ββ Principiante+ |
| Tempo | ~25 minuti |
| Istruzioni | 6 nuove |
| Flag STATUS | Z 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.
β AND β isolare bit (mascheratura)
ANDLW kANDWF f,dAND Γ¨ 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.
; 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
IORLW kIORWF f,dOR Γ¨ 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.
; 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)
XORLW kXORWF f,dXOR Γ¨ 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).
; 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
| Istruzione | Operazione | dest | C | DC | Z | Uso tipico |
|---|---|---|---|---|---|---|
ANDLW k | W AND k | W | β | β | β | maschera costante |
ANDWF f,d | W AND f | W o f | β | β | β | maschera su registro |
IORLW k | W OR k | W | β | β | β | setta bit con costante |
IORWF f,d | W OR f | W o f | β | β | β | setta bit su registro |
XORLW k | W XOR k | W | β | β | β | toggle, confronto |
XORWF f,d | W XOR f | W 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
| # | Istruzione | W | REG | Z | Note |
|---|---|---|---|---|---|
| 1 | ANDLW 0x0F | 0x06 | β | 0 | 0xB6 AND 0x0F = 0x06 (nibble basso) |
| 2 | ANDLW 0xF0 | 0xB0 | β | 0 | 0xB6 AND 0xF0 = 0xB0 (nibble alto) |
| 3 | ANDLW 0xFF | 0x00 | β | 1 | 0x00 AND 0xFF = 0x00 β Z=1! |
| 4 | IORLW 0xC1 | 0xED | β | 0 | 0x2C OR 0xC1 = 0xED |
| 5 | IORWF REG,F | 0x40 | 0xF6 | 0 | 0xB6 OR 0x40 = 0xF6 (bit 6 settato) |
| 6 | XORLW 0xFF | 0x55 | β | 0 | 0xAA XOR 0xFF = 0x55 (complemento) |
| 7 | XORLW 0x3C | 0x00 | β | 1 | 0x3C XOR 0x3C = 0x00 β Z=1! |
| 8 | XORLW 0x42 | 0x00 | 0x42 | 1 | 0x42 XOR 0x42 = 0 β Z=1 (sono uguali) |
ποΈ Prova tu!
- Hai una variabile
STATOche vale0xA7. Scrivi una sequenza che azzera i bit 7 e 5 senza toccare gli altri. Qual Γ¨ la maschera AND da usare? Quanto vale STATO dopo? - 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? - 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 SWAPFRLF, RRF, COMF, SWAPF β spostare bit,
invertire byte, scambiare nibble attraverso il Carry.
Β© Prof. D. Bertolino Β· PIC16 From Zero to Hero Β· WebPicSimulator Β· Lezione 05