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