Codice Assembly
per Pic

Il set di istruzioni dei pic è limitato a 35 istruzioni
Un programma in assembler è formato da tre parti fondamentali:
Ogni linea di programma è formata da codice mnemonico e operandolI commenti vanno fatti anteponendo un punto e virgola(;)
Le istruzioni del programma non partono mai dalla prima colonna


Funzione Descrizione  
addwf    f,d  add w f somma W e f e pone il risultato W  (d=0) o in f (d=1)
andwf     f,d and w f esegue AND tra W ed f e pone il risultato in W (d=0) o in f (d=1)
clrf        f  clear f azzera f
clrw          clear  w azzera w
comf     f,d complementa f e pone il risultato in w (d=0) o in f (d=1)
decf     f, d decrementa  f e pone il risultato in w  (d=0)  o in f (d=1)
decfsz   f,d decrementa f e pone il risultato in w  (d=0) o in f (d=1); salta l'istruzione successiva se il risultato dell'operazione è zero
incf       f, d inrementa f e pone il risultato in w (d=0) o in f (d=1)
incfsz    f,d incrementa f e pone il risultato in w  (d=0) o in f (d=1); salta l'istruzione successiva se il risultato dell'operazione è zero
iorwf  f,d EXNOR tra w ed f  e pone il risultato in w (d=0) o in f (d=1)
movf    f,d sposta f in W (d=0) o in f (d=1)
movwf   f sposta w in f
nop nessuna operazione
rlf       f,d ruota a sinistra attraverso il carry, il contenuto di f e pone il risultato in w (d=0) o in f (d=1)
rrf       f,d ruota a destra attraverso il carry, il contenuto di f e pone il risultato in w (d=0) o in f (d=1)
subwf   f,d sottrae w ed f e pone il risultato in w (d=0) o in f (d=1)
swapf   f,d scambia i semibyte di f e pone il risultato in w (d=0) o in f (d=1)
xorwf    f,d ex or tra w ed f e pone il risultato in w (d=0) o in f (d=1)
bcf        f,b bit clear f azzera il bit b di f (b=0,1,2...7)
bsf         f,b pone a 1 il bit b di f  (b=0,1,2...7)
btfss      f,b testa il bit b di fe e salta  e salta l'istruzione successiva se esso è zero (b=0,1,2...7)
addlw    k  add literal and w somma il valore k all'accumulatore
andlw     k esegue una AND tra l'accumulatore e k
call         k chiama la subroutine all'indirizzo k
clrwdt azzera il watchdog
goto        k salta all'istruzione k
iorlw        k esegue la EXNOR con w e f
movlw     k carica il valore k nell'accumulatore
retfie ritorna dalla routine di servizio all'interrupt
retlw      k ritorna dalla subroutine ponendo il valore k nell'accumulatore w
return ritorna dalla subroutine
sleep     pone il microcontrollore in standby
sublw    k sottrae il valore k dall'accumulatore w
xorlw     k esegue la EX OR tra w e il valore k

Esempio 1: setta le porte come ingresso o uscita ma genera un loop infinito
list   p=16f84        ;direttiva
                             ; inizio programma
inizio: movlw 14h   ; inizio è una label che può avere un nome qualsiasi
          tris     05h  ; pone il valore 14h in port A per settarla in ingresso o in uscita
          movlw   0bh
          tris        05h
          goto      inizio
          end
Esempio 2: decremento di un valore in un file register
list    p=16f84
start:    movlw  05h       ;carica un valore in accumulatore
            movwf  0Ch      ; passa il valore dell'accumulatore nel registro 0ch
abcora: decfsz    0Ch,1 ; decrementa il valore di 0ch e lo pone in och stesso. Se il valore è nullo salta l'istruzione                                         ;successiva
            goto      ancora
            end
esempio 3: configurazione delle porte come ingressi o come uscite
list p=16f84            ;direttive
port_a   equ   05h   ; in questa direttiva si dà all'indirizzo 05h il nome di port_a
port_b   equ   06h   ; in questa direttiva si dà all'indirizzo 06h il nome di port_b
radix       dec          ; tutti i numeri senza b finale o h finale sono decimali
             org   00h                 ; si parte dall'indirizzo di programma 00h
                                            ; inizio del programma
inizio:     movlw   012h           ; dato di configurazione della porta A
             tris         port_a        ; pin port_a  Ra4= Ra1=1, il resto è zero, cioè di uscita
             movlw    005h          ; dato di configurazione della porta B
             tris         port_b        ; configura la porta b Rb0=Rb2=1, il resto è zero
             end        
         
esempio 4: configurazione delle porte come ingresso o come uscita. Se le porte vengono poste come ingresso, saranno in alcuni casi con livello logico alto e altre volte con livelllo logico basso. Si vuole realizzare un programma che legga lo stato logico delle porte poste come ingresso e passi i valori in uscitagenerando dei segnali tipo led acceso o led spento

list p=16f84  
inizio:     movlw      01fh   ; pone gli ingressi RB0=RB1=RB2=RB3=RB4=1, cioè come ingresso
              tris           06h   ; passa il valore al registro 06h (porta b)
              movlw      00h    ; pone tutte le porte come uscita
              tris           05h     ; passa il valore al registro di indirizzo 05h (porta a)
ancora:   movf        06f, 0 ; prende i valori della porta B e li passa all'accumulatore
              movwf     05h    ; passa i valori dell'accumulatore all'indirrizzo 05h
              goto         ancora
               end
esempio 5:in questo programma viene acceso o spento il led in RA0 configurato come uscita se il livello logico della porta RB0 è alto, altrimenti lo spegne

list   p=16f84
inizio:     movlw       01h         ; pone il pin RB0 come ingresso
             tris             06h
              movlw       00h        ; pone il pin RA0 come uscita
ancora:  btsfc          06h,0      ; legge il bit 0 della porta B e salta all'istruzione successiva se zero
             goto           accendi
             bfc             05h,0      ; pone a 0 il bit 0 della porta A
             goto           ancora
accendi: bsf             05h,0       ; porta a livello logico alto il bit 0 della porta A
              goto           ancora
              end
esempio 6 : si vuole pilotare un led posto su Ra0 tramite un interruttore posto su Rb0
inizio:   movlw       001h
            tris           06h
            movlw      00h
            tris            05h
            bcf            05h,0   ;spegne il led
             bcf           0ch,0    ; pone a livello basso il bit 0 di flag
ancora: btfsc          06h,0   ; legge lo stato di Rb0 (bit 0 della porta B), salta se zero
             goto        attendi
             goto         ancora
attendi:   btfsc        06h,0    ; legge lo stato di Rb0 salta se zero (pulsante non premuto)
             goto         attendi
             comf        0ch,1      ; complementa il flag, cambia lo stato del led
             btfss         0ch,0      ;controlla lo stato del flag e salta se alto
             goto spegni
             bsf             05h,0    ; pone alto il bit zero della porta A
             goto          ancora
spegni:    bcf          05h,0      ; pone basso bit 0 porta A
             goto          ancora
              end

  
esempio 7: lettura da una locazione di memoria EEPROM

list   p=16f84
 eeadr      equ  09h
eedata      equ 08h
eecon1      equ  88h
             movlw        05h        ;decide da quale locazione di memoria leggere
             movwf        eeadr      ; pone l'indirizzo nel registrio controllo indirizzo
             bsf              eecon1,0    ;attiva la lettura
             end
esempio 8:  si  vuole scrivere il dato 12h in 05h della memoria EEPROM. Questo programma va completato scrivendo nelle direttive l'associazione dei nomi dei registri ai  loro indirizzi
 list p=16f84
                bcf          intcon, 7             ;disabilita tutti gli interrupt
                movlw     05h
                movwf     09h                    ;scrive l'indiriizzo 05h  dove scrivere
                 movlw     12h        
                movwf      08h                    ; scrive il dato nel registro eedata
                movlw       55h
                 movwf      eecon2
                movlw        aah
                movwf        eecon2
                 bsf             eecon1,1       ; pone a 1 il  bit di scrittura
                  bsf            intcon,7          ; riabilita gli interrupt
                  end
 

Decoder: i numeri binari vengono immessi sulla porta A e visualizzati su un display a 7 segmenti ad anodo comune collegato su B

 





 
HOME