Le jeu d 'instruction du PIC 16F84


A                                                                                                                                                                                        

ADDLW         : Additionner le registre W et une valeur immédiate , la somme est stockée en W
( la série PIC 16C5x ne comprend pas cette instruction)
( W ) + v   ->   ( W )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )

Syntaxe  :
Addlw  0x0F               W + Ox0F le résultat est  stocké dans W

ADDWF         : Additionner le registre W et ( f ) , la somme est stockée en ( d )
( W ) + ( f )   ->   ( d )

f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1 
Indicateurs positionnés :
C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
  
Exemple :
#define W  0                       on affecte 0 à la variable W utilisée ci - après
Movf  valeur1, W              on met la valeur 1 dans le registre W
Addwf  valeur2, W            valeur 1 + valeur 2    stocké dans W
 

ANDLW
         : Opération " ET " entre le contenu du registre W et une constante c

( W ) AND c   ->   ( W )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si le résultat stocké dans W est nul ( Z=1 )

Exemple  :
Port_A   equ    05h            on affecte 05 à la variable Port_A utilisée ci - après
#define W     0                   on affecte 0 à la variable W utilisée ci - après
Movf  Port_A, W              on met le contenu du port A dans le registre W
Andlw  55h                       on masque un bit sur 2   ( 55 h = 0101 0101 )

ANDWF         : Opération " ET " entre le contenu du registre W et f le résultat est en d

( W ) AND ( f )   ->   ( d )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si le résultat stocké dans W ou f est nul ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f  

Exemple  :
R_etat   equ    03h            on affecte 03 à la variable R_etat  utilisée ci - après
Movlw 00000111b           on met le contenu 00000111  dans le registre W
Andwf  R_etat, F             on masque et on configure le registre d' état
 

B                                                                                                                                               
 
BCF         : Efface le bit spécifié de f

0   ->   ( f{b} )
f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1
Indicateurs positionnés :  Aucun

Exemple  :
Port_b   equ    06h            on affecte 06 à la variable Port_B  utilisée ci - après
BCF  Port_b, 2                on met à 0 le bit 2 du port B

BSF         : Positionne le bit "b" de f à 1

1   ->   ( f{b} )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :  Aucun
Exemple  :
Port_b   equ    06h            on affecte 06 à la variable Port_B  utilisée ci - après
BSF  Port_b, 3                on met à 1 le bit 3 du port B

BTFSC         : Vérifier l'état du bit b de f et sauter l'instruction suivante si b = 0

"Saute l' instruction si" ( f{b} ) = 0

Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionnés :  Aucun

Exemple  :
Ex1   equ    0Ah                 on affecte le registre 0A  à la variable ex1 utilisée ci - après
#define flag_Z 02h             on affecte le flag Z  à la variable flag_Z utilisée ci - après
R_etat   equ    03h            on affecte 03 à la variable R_etat  utilisée ci - après

Incf  Ex1                           on incrémente la variable Ex1 ( registre 0A )
Btfsc  R_etat,flag_Z          on vérifie si il y a un débordement ( Z=1 )
Movlw 54h                        si débordement ( Z=1 ) alors on met la valeur 54 dans le registre W

BTFSS
         : Vérifier l'état du bit b de f et sauter l'instruction suivante si b = 1

"Saute l' instruction si" ( f{b} ) = 1
Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionnés :  Aucun
 
Exemple  :
Ex1   equ    0Ah                 on affecte le registre 0A  à la variable ex1 utilisée ci - après
#define flag_Z 02h           on affecte le flag Z  à la variable flag_Z utilisée ci - après
R_etat   equ    03h            on affecte 03 à la variable R_etat  utilisée ci - après

Incf  Ex1                           on incrémente la variable Ex1 ( registre 0A )
Btfss  R_etat,flag_Z          on vérifie qu ' il n' y a pas de  débordement ( Z=0 )
Movlw 54h                        si aucun débordement ( Z=0 ) alors on met la valeur 54 dans W
   
 
C                                                                                                                                               
 
CALL         : Appel du sous programme s
( PC ) + 1   ->   Haut de la pile
s   -> ( PC )

Nombre de cycle d'horloge : 2
Indicateurs à positionnés :
PA0 à PA2 ( pour les PIC 16 C 5x )
Registre PCLATH pour les autres PIC

Exemple  :
R_etat   equ    03h            on affecte 03 à la variable R_etat  utilisée ci - après
#define f 1                        on affecte la valeur 1 à la variable f
#define Pa0 05h               on affecte la valeur 05 à la variable Pa0

Movlw 00111111b            on charge un masque pour modifier le registre d' etat
bsf R_etat, Pa0                 on met le bit 5 du registre d état ( PA0 ) à 1
Andwf R_etat, f                on sélectionne la page 1 pour un PIC 16 C 56 ( 0200 - 03FF )
Call sous_P                     Appel du sous programme sous_P à la 2 eme page de programme
     
CLRF         : Efface le contenu de ( f )
00   ->   ( f )

Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z=1
Syntaxe  :  CLRF registre

CLRW         : Efface le contenu du registre W
00   ->   W
Nombre de cycle d'horloge : 1  
Indicateurs positionnés :
Z = 1
Syntaxe  :  CLRW

CLRWDT         : Réinitialise le temporisateur du chien de garde
00   ->   WDT
00   ->   prédiviseur de WDT
Nombre de cycle d'horloge : 1

Indicateurs positionnés :
TO = 1
PD = 1
Syntaxe  :  CLRWDT

COMF         : Stocke en d le complément de f
f/   ->   (d)
f est l'emplacement mémoire d 'un registre  

Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si résultat stocké dans W ou f est nul ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on charge une valeur dans un registre ici 55h  puis on complémente cette valeur qui devient alors AAh.

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f
Movlw 01010101b            on charge 55h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Comf Reg_temp, f           on complémente le contenu du registre temporaire
 
D                                                                                                                                               

DECF         : Décrémente f et range le résultat dans d
(f) - 1   ->   (d)
f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul  ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on charge une valeur dans un registre ici 01h  puis on décrémente cette valeur qui devient alors 00h ( flag Z = 1 dans cet exemple ) .

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f
Movlw 01h                        on charge 01h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Decf Reg_temp, f             on décrémente le contenu du registre temporaire

DECFSZ         : Décrémente f et sauter l 'instruction suivante si f = 0

(f) - 1   ->   ( d ) et sauter l' instruction suivante si f=0

f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionnés :  Aucun

d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
   
 
G                                                                                                                                               
 

GOTO         : Branchement inconditionnel à l' adresse a
a   ->   PC
Nombre de cycle d'horloge : 2
Indicateurs à positionnés :
PA0 : extension à 9 bits pour les PIC ( PIC 16c56 et 16c57 )
PA1 : extension à 10 bits pour le PIC ( PIC 16c57 )
PA2 : extension future
Registre PCLATH pour les autres PIC

Exemple  :
             Goto fin                    Va à l'étiquette nommée "fin"
-
-
-
fin :                                        Etiquette fin
 
 
 
I                                                                                                                                               


INCF         : Incrémente f et range le résultat dans d
(f) + 1   ->   (d)
f est l'emplacement mémoire d 'un registre 
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul  ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on charge une valeur dans un registre ici 55h  puis on incrémente cette valeur qui devient alors 56h.
Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                        on affecte la valeur 1 à la variable f

Movlw 01010101b            on charge 55h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Incf Reg_temp, f              on complémente le contenu du registre temporaire

INCFSZ         : Incrémente f et sauter l'instruction suivante si (f) = 0

(f) + 1   ->   (d) et saute si le résultat = 0

f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1 ou 2
Indicateurs positionnés :  Aucun
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

IORLW         : Opération logique "OU" entre le registre W et une constante c

( W ) OR c -> ( W ) 
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si résultat stocké dans le registre W est nul  ( Z=1 )

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou logique avec ne valeur immédiate

Movlw 01010101b            on charge 01010101b dans le registre W
Iorlw   11110000b            aprés le ou logique W = 11110101b

IORWF         : Opération logique "OU" entre le registre W et f résultat dans d

( W ) OR ( f ) -> ( d )
Nombre de cycle d'horloge : 1
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul  ( Z=1 )

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou logique avec le contenu d'un registre temporaire, le résultat est dirigé vers le registre temporaire..

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f

Movlw 01010101b            on charge 55h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Movlw 00001111b           on charge 0Fh dans le registre W
Iorwf Reg_temp, f           ou logique avec W le contenu du registre temporaire= 01011111b
 
M                                                                                                                                               

MOVF         : Copier le registre ( f ) dans ( d )
(f) + 1   ->   (d)
f est l'emplacement mémoire d 'un registre
Nombre de cycle d'horloge : 1  
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul  ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on copie le contenu d'un registre temporaire dans le registre W

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define W 0                        on affecte la valeur 0 à la variable W

Movf Reg_temp, W            on copie Reg_temp dans W

MOVLW         : Charge une constante c dans le registre W

c   ->   ( W )

Nombre de cycle d'horloge : 1
Indicateurs positionnés :  Aucun

Exemple  :
Dans cet exemple on charge une valeur dans le registre W
Movlw 01010101b            on charge 55h dans le registre W

MOVWF         : Charge le registre W dans le registre f

( W )   ->   ( f )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :  Aucun

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on charge le contenu vers un registre temporaire..

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f
Movlw 01010101b            on charge 55h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
 
N                                                                                                                                               


NOP        : Aucune opération
(PC) + 1   ->   (PC)

Nombre de cycle d'horloge : 1
Indicateurs positionnés :  Aucun
Syntaxe : NOP
 
 
O                                                                                                                                               


OPTION         : Charger le registre OPTION

( W )   ->   ( OPTION )

Nombre de cycle d'horloge : 1
Instruction utilisable sur les PIC de la famille 16 C 5x ( reconnue par les autres PIC )
Indicateurs positionnés : Aucun
 
Exemple  :
Dans cet exemple on utilise la broche RTCC avec cadence horloge externe et prédivision de 8
le flanc actif sur la broche RTCC = front montant
( se reporter au tableau qui suit )

#define Def_option  22h           on affecte 22 à la variable Def_option (22 correspond à l'énoncé )

Movlw  Def_option                  on met la variable Def_option dans le registre W
Option                                      transfert du contenu de W dans le registre OPTION
 
 
 
R                                                                                                                                               

RETFIE         : Retour d' interruption
1   ->   GIE
Haut de pile   -> ( PC )
( la série PIC 16C5x ne comprend pas cette instruction)
Nombre de cycle d'horloge : 2
Indicateurs  positionnés :  aucun
Syntaxe : RETFIE           retour d' interruption
 

RETLW c         : Retour de routine , chargement d ' une valeur c dans le registre W

c   ->   ( W )
Haut de pile   -> ( PC )
Nombre de cycle d'horloge : 2
Indicateurs à positionnés :  PA0 à PA2 pour PIC 16C56 et 16C57
Syntaxe : RETLW  0afh         retour de sous programme et on charge 0afh dans W

RETURN         : Retour de sous programme

Haut de pile   -> ( PC )
( la série PIC 16C5x ne comprend pas cette instruction)
Nombre de cycle d'horloge : 2
Indicateurs  positionnés :  aucun
Syntaxe : RETURN           retour d'un sous programme

RLF         : Rotation à gauche de ( f ) au travers du bit carry © le résultat va dans d

Carry   ->   ( d0 )
( f0 )   ->   ( d1 )
( f1 )   ->   ( d2 )
( f2 )   ->   ( d3 )
( f3 )   ->   ( d4 )
( f4 )   ->   ( d5 )
( f5 )   ->   ( d6 )
( f6 )   ->   ( d7 )
( f7 )   ->   ( Carry )

d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
Nombre de cycle d'horloge : 1

Indicateurs positionnés :
Éventuellement le bit C

RRF         : Rotation à droite de ( f ) au travers du bit carry © le résultat va dans d

( f0 )   ->   Carry
( f1 )   ->   ( d0 )
( f2 )   ->   ( d1 )
( f3 )   ->   ( d2 )
( f4 )   ->   ( d3 )
( f5 )   ->   ( d4 )
( f6 )   ->   ( d5 )
( f7 )   ->   ( d6 )
Carry ->   ( d7 )

Nombre de cycle d'horloge : 1 
Indicateurs positionnés : :
Éventuellement le bit C
 
S                                                                                                                                               

SLEEP         : Mise en veille du microcontrôleur  ( Power Down mode )

0    -> PD
1    -> TO
00    -> WDT
00    -> Prédiviseur de WDT
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
PD=0 et TO=1

Syntaxe :  SLEEP
La consommation de courant est minimale.

SUBLW         : Soustraction entre une valeur et le registre W
v - ( W )  -> ( W )
( la série PIC 16C5x ne comprend pas cette instruction)  
Nombre de cycle d'horloge : 1
Indicateurs positionnés :

C si retenue ( C=1 )
DC si la somme des quatre bits de poids faible est > 15 ( DC=1 )
Z si la somme est nulle ( Z=1 )

Syntaxe : SUBLW 0x01           éxécute la soustraction 01 - contenu de W résultat dans W
                                                (  méthode du complément à 2 )

SUBWF     : Soustraire le contenu du registre W du contenu du registre f résultat dans d

( f ) - ( W )   -> ( d )
Nombre de cycle d'horloge : 1
Indicateurs positionnés :
Z si résultat stocké dans le registre W ou f est nul  ( Z=1 )
C = 1   si   f > W  ou  f = W
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on la soustraie avec le contenu d'un registre temporaire, le résultat est dirigé vers le registre temporaire..
(  méthode du complément à 2 )

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f

Movlw 00001010b            on charge 0Ah dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Movlw 00000001b           on charge 01h dans le registre W
Subwf Reg_temp, f          on soustraie avec W le registre temporaire= 00001001b

SWAPF     : Échange de quartets entre le registre ( f ) et ( d )

( f bit 0 à bit 3)   ->   ( d bit 4 à bit 7 )
( f bit 4 à bit 7)   ->   ( d bit 0 à bit 3 )
Nombre de cycle d'horloge : 1
Indicateurs positionnés : Aucun
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f
 
T                                                                                                                                               


TRIS         : Charge le registre TRIS f
Cette instruction concerne les PIC 16 C 5x ( compatible avec les autre PIC )
( W )    ->  ( TRIS f )
Nombre de cycle d'horloge : 1
Indicateurs positionnés : Aucun

TRIS 5 configure le port A
TRIS 6 configure le port B
TRIS 7 configure le port C
si bit = 0 alors la broche est en sortie

Exemple  :
Dans cet exemple les broches A0 A1 et A7 du port A  sont déclarées  en sortie, les autres broches en entrées
#define Sens_port_A 01111100b       on affecte 7C ( en hexa ) à la variable Sens_port_A
Port_A   equ    05h                         on affecte 05 à la variable Port_A ( adresse du port A )
Movlw  Sens_port_A               on met la variable Sens_port_A dans le registre W
Tris Port_A                          transfert du contenu de W dans le registre de direction du Port A
 
X                                                                                                                                               


XORLW         : Opération logique XOR ( ou exclusif ) entre le contenu de W et une constante c
 
( W ) XOR c   ->  ( W )
Nombre de cycle d'horloge : 1  
Indicateurs positionnés:  
Z si résultat stocké dans le registre W est nul  ( Z=1 )

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou exclusif avec une valeur immédiate , le résultat est dirigé vers le registre W

Movlw 01010101b            on charge 55h dans le registre W
Xorlw 00111100b             ou exclusif avec W le contenu du registreW = 01101001b

XORWF         : Opération logique XOR ( ou exclusif ) entre le contenu de W et f le résultat en d
( W ) XOR ( f )    ->  ( d )

Nombre de cycle d'horloge : 1  
Indicateurs positionnés :
Z si résultat stocké dans le registre W est nul  ( Z=1 )
d est paramétrable
si d= 0 le résultat va dans le registre W
si d= 1 le résultat va dans le registre f

Exemple  :
Dans cet exemple on charge une valeur dans le registre W puis on éxécute un ou exclusif avec le contenu d'un registre temporaire, le résultat est dirigé vers le registre temporaire..

Reg_temp   equ    0Ah       OA correspond à l'adresse d' un registre temporaire
#define f 1                         on affecte la valeur 1 à la variable f

Movlw 01010101b            on charge 55h dans le registre W
Movwf  Reg_temp            on met W dans le registre temporaire
Movlw 00001111b           on charge 0Fh dans le registre W
Xorwf Reg_temp, f           ou exclusif avec W le contenu du registre temporaire= 01011010b
 




Le jeu d'instructions des PIC
[Menu général]