Vous êtes sur la page 1sur 6

TP Initiation à la programmation du µC PIC 16F84A

en Mikro C
I) Objectifs :
Le présent TP a pour but la programmation des ports d’entrée sortie A et B. En premier
lieux on verra allumage en séquence de 8 leds relie au port B, puis on introduira la
programmation des microcontrôleurs avec le langage C afin de permettre allumage en
séquence de 8 leds relie au port B de bas au haut et vice-versa à l’aide de boutons poursois.
On présentera aussi le logiciel Mikro C pour création de projet.

II) Manipulations

 Premier partie : Allumage en séquence de 8 leds relie au port B


 Ecrire dans MPLAB le programme suivant en langage assembleur
 Avec Proteus, schématiser vos circuits et charger le fichier généré en *.hex dans le
PIC

 Deuxième partie : Allumage en séquence de 8 leds relie au port B de bas au haut


ou vice-versa à l’aide de boutons poursois.
 Ecrire dans mikroC le programme suivant en langage C
 Avec Proteus, schématiser vos circuits et charger le fichier généré en *.hex
dans le PIC

III) Présentation le logiciel Mikro C.8-2 pour création de projet


Le mikroC PRO pour PIC organise des applications dans des projets, composé d'un seul
fichier de projet (extension. mcppi) avec un ou plusieurs fichiers sources (extension).
La meilleure façon de créer un projet c’est à l'aide de l'assistant nouveau projet,
(menu Project> New Project ) ou en cliquant sur l'icône nouveau projet à partir de la
barre d'outils du projet.
1
 Commencez par donner un nom dans Project Name, dans notre cas TP 1.

2
 Par la suite, spécifiez l'emplacement où votre projet sera enregistré.
 Dans la fenêtre description vous pouvez ajouter une description du projet à
réaliser.
 Dans la rubrique DEVICE sélectionné le type du microcontrôleur sur lequel
vous travaillez, faut saisir aussi la valeur de fréquence de l'oscillateur 4MHZ
(Oscilateur XT, et le WDT si nécessaire)
 Dernière étape - Cliquez sur ok pour créer votre nouveau projet
A ce stade, une nouvelle fenêtre vide s’affiche afin que vous pussiez y
saisir votre programme

3
ALLUMAGE 8 LEDS EN SEQUENCE

RADIX DEC
INCLUDE "P16F84.INC"
ORG
COUNT_1 EQU 0C ;Counter
COUNT_2 EQU 0D ;Counter
SORTIE EQU 0E
CARRY EQU 00 ;Carry bit

4
ALLUMAGE 8 LEDS EN SEQUENCE AVEC 2 BOUTTONS
radix hex

INCLUDE"P16F84.INC"

COUNT_1 EQU 0C ;Compteur


COUNT_2 EQU 0D ;Compteur
PIC84 EQU 03FF ;

CARRY EQU 00
SORTIE EQU 0E
ORG PIC84
GOTO INIT ;aller à INIT

INIT ORG 0000H


MOVLW 00 ;En W, nombre 0
TRIS PORTB ;Port B configuré comme sortie
MOVLW 0FF
TRIS PORTA ;Port A configuré comme entrée
MOVLW 0FF ;En W, nombre 255
MOVWF COUNT_1 ;COUNT_1 en W
MOVLW 0FF
MOVWF COUNT_2
MOVLW 01
MOVWF SORTIE ;SORTIE = 1

;Programme principal

MOVF SORTIE,1 ;En W, sortie


MOVWF PORTB ;Sortie en PORT_B
CALL DELAY ;Routine de retard
MAIN BTFSS PORTA,3 ;Bouton P1 pressé?
CALL UP ;Si oui, la routine UP
BTFSS PORTA,5 ;Bouton P2 pressé?
CALL DOWN ;Si oui, la routine DOWN
CALL DELAY
clrwdt
GOTO MAIN

UP BCF 0PTION,CARRY ;La remise à zéro du bit carry C


RLF PORTB ;tourner à gauche
BTFSS STATUS,CARRY ;Est ce la dernière position?
RETURN ;Si non, returne
RRF PORTB ;Si oui,la condition initiale
RETURN ;Return

DOWN BCF STATUS,CARRY ;La remise à zéro du bit carry C


RRF PORTB ;tourner à droite
BTFSS STATUS,CARRY ;Est ce la dernière positione ?
RETURN ;Si non, returne
RLF PORTB ;Si oui,la condition initiale
RETURN ;Return

;Routine de retard

DELAY DECFSZ COUNT_1,1 ;Décrémente COUNT_1


GOTO DELAY ;Si on n'a pas 0, aller à DELAY
MOVLW 0FF
MOVWF COUNT_1 ;Recharge COUNT_1
DECFSZ COUNT_2,1 ;Décrémente COUNT_2
GOTO DELAY ;Si on n'a pas 0, aller à DELAY
MOVLW 0FF
MOVWF COUNT_1 ;Recharge COUNT_1
MOVLW 0FF
MOVWF COUNT_3 ;Recharge COUNT_2
RETURN ;aller au programme principal
End

void main() 5
{
unsigned char J = 1;
TRISB = 0; // PORTB est configure en
sortie
ALLUMAGE 8 LEDS EN SEQUENCE
a) lumage en séquence de 8 LED relie au port B

ALLUMAGE 8 LEDS EN SEQUENCE AVEC 2 BOUTTONS


void main()

unsigned char J = 1;

unsigned char a = 0x80;

TRISB = 0; // PORTB est configure en sortie

for(;;) // Boucle sans fin

while(PORTA.f0=1)

PORTB = J; // Envoyer J au PORTB

Delay_ms(100); // Pause 100 ms

J = J << 1; // Décalage à gauche J

if(J == 0) J = 1;

while(PORTA.f1=1)

PORTB = a; // Envoyer J au PORTB

Delay_ms(100); // Pause 100 ms

a = a >> 1; // Décalage à gauche J

if(a == 0x00 ) a = 0x80;

} // Si la dernière LED, allumer la 1èreLED

}
TP n° : 03