Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Support - Cours MikroC

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 45

Support de cours et TP :

Pour classes BTS : 1ELT

=
onc t on t s m l t on d s
s st m s

A.TAOUNI
Lycée Alkhaouarizmy
CASABLANCA

Programmation avec MikroC PRO


Simulation en Proteus ISIS
ort d co rs onc t on t s m l t on d s s st m s 1 ELT

Table des matières

1. Le compilateur MikroC et les PICmicro……………………………………………………………………………………………………… 3


1.1 Le compilateur mikroC PRO……………………………………………………………………………………………………………………. 4
2. Principes du Langage C………………………………………………………………………………………………………………………..…… 6
2.1 Déclaration des variables en C…………………………………………………………………………………………………………………. 6
2.2 Les formats numériques dans le langage C……………………………………………………………………………………………….. 8
2.3 Les opérateurs en langage C ……………………………………………………………………………………………………………………. 9
2.4 Les fonctions en langage C………………………………………………………………………………………………………………………. 13
2.5 Création d’un programme en langage C……………………………………………………………………………………………………. 15
2.6 Formes conditionnelles et itération en langage C ……………………………………………………………………………………. 15
2.6.1 Création des conditions logiques en C…………………………………………………………………………………………… 16
2.6.2 L’instruction conditionnelle if et if else…………………………………………………………………………………………… 16
2.6.3 L’instruction switch case……………………………………………………………………………………………………………… 17
2.6.4 Les formes itératives while et do while………………………………………………………………………………………….. 18
2.6.5 La forme itérative for…………………………………………………………………………………………………………………….. 18
2.6.6 Utilisation des formes itératives imbriquées 18

3. Le simulateur ISIS de Proteus…………………………………………………………………………………………………………………… 20


3.1 Les bases du simulateur ISIS……………………………………………………………………………………………………………………. 20
4. Création du premier programme en MikroC PRO..…………………………………………………………………………………… 24

5. Affichage des données ……………………………………...…………………………………………………………………………………… 30


5.1 Affichage à 7 segments …………………………………………………………………………………………………………………………. 30
5.1.1 Contrôle de l’affichage 7 segments………………………………………………………………………………………………. 30
5.1.2 Contrôle de l’affichage dynamique 7 segments …………………………………………………………………………… 33
5.2 Afficheur LCD…………………………………………………………………………………………………………………………………………. 35
5.2.1 Fonctions d’affichage des caractères……………………………………………………………………………………………. 39
5.2.2 Fonctions d’affichage des chaines de caractères ………………………………………………………………………….. 41
5.2.3 Affichage des valeurs numériques ………………………………………………………………………………………………. 42
6. Systèmes d’entrée des données ……………………………………………………………………………………………………………… 45
6.1 Utilisation des boutons …………………………………………………………………………………………………………………………. 45
6.2 Utilisation des Dip Switch 47
7. Conversion AD et DA ………………………………………………………………………………………………………………………………. 50
7.1 Conversion AD ou ADC ………………………………………………………………………………………………………………………….. 50
7.2 Conversion DA ou DAC…………………………………………………………………………………………………………………………… 51
7.2.1 Conversion DA avec PWM……………………………………………………………………………………………………………. 51
7.2.2 Conversion DA avec réseau R 2R…………………………………………………………………………………………………. 54
8. Les PICs………………… ………………………………….……………………………………………………………………………………………. 58
8.1 Les microcontrôleurs …………………………..……………………………………………………………………………………………….. 58
8.2 Les PICs de Microchip…………………………..………………………………………………………………………………………………… 58
8.3 Identification du PIC ………………………………………………………………………………………………………………………………. 58

Support de cours Page 1


ort d co rs onc t on t s m l t on d s s st m s 1 ELT

9. Affichage des données …………………………………..…...…………………………………………………………………………………… 60


9.1 Organisation du 16F84 …………………………………………………………………………………………………………………………. 60
9.2 La mémoire du PIC …………………………………….……………………………………………………………………………………………. 60
9.3 L’horloge…………………………………………………………………… …………………………………………………………………………… 61
9.4 L’ALU et l’accumulateur W ……………………………………………………………………………………………………………………. 62
9.5 Brochage du PIC ……………………………………………………………………………………….…………………………………………….. 62
9.6 Les registres …………………………………………………………………………………………..….…………………………………………… 63
9.6.1 Registre d’état ……………………………………………………………………………………………………………………………… 64
9.6.2 Registres du Timer…………………………………………………………………………………………………………………………. 64
9.6.3 Registres des ports ……………………………………………………………………………………………………………………….. 64
9.7 Les interruptions …………………………………………………………………………………………………………………………………….. 65
9.8 L’EEPROM des données…………………………………………………………………………………………………………………………… 65
10. Le PIC 16F877………… ………………………………….……………………………………………………………………………………………. 67
10.1 Les éléments de base du PIC 16F877 …..……………………………………………………………………………………………….. 67
10.2 Organisation du PIC 16F877 ………………..………………………………………………………………………………………………… 67
10.3 Organisation de la mémoire RAM……..…………………………………………………………………………………………………. 68
10.4 Registres ………………………………………………………………………………………………………………………………………………. 68
10.5 Le convertisseur A/N 70

11. Les capteurs …… …........................................................................................................................ ………………… 71


11.1 Capteur de température LM35…..……………………………………………………………………………………………….. 71
11.2 Capteur de température ………………..………………………………………………………………………………………………… 73

TD/TP ..………………… ………………………………….……………………………………………………………………………………………. 76

Support de cours Page 2


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

1. Le compilateur MikroC et les PICmicro

Un microcontrôleur est un circuit électronique encapsulé dans un circuit de haut niveau d’intégration.
Les microcontrôleurs sont commercialisés par différents fabricants comme Freescale, Motorola, Intel,
Philips, et Microchip.

Microchip en particulier, est un fabricant des circuits électroniques. Dans leurs lignes de production,
on trouve les microcontrôleurs PICmicro, qui sont disponibles dans des différentes familles, certaines
d'entre elles sont: 12F, 16F, 18F, 24F, 30F, 33F etc.…

Le promoteur du projet choisit la famille et la référence qui répondent à ses besoins, comme un PIC
12F675 ; microcontrôleur 8 broches avec des modules intégrés de base tels que le Timer et l’ADC. Un
microcontrôleur comme le 16F877 dispose de 40 broches et des modules tels que: Timer, ADC,
USART, I2C, PWM, entre autres. On peut facilement voir la différence entre ces deux PIC.

Figure 1-1

La documentation technique, la commercialisation massive et l'incroyable quantité d'informations


publiées sur les microcontrôleurs PIC, les rendent idéals pour l’enseignement. L’entreprise Microchip
a le portail web www.microchip.com où on peut télécharger des informations et des applications
logiciels qui facilitent le développement avec ses microcontrôleurs.

Fondamentalement, le développement d’une application à base de microcontrôleur PIC consiste à


identifier les problèmes de développement, éditer, déboguer le programme machine et programmer le
microcontrôleur avec un programmateur spécifique pour PICmicro. Microchip fournit des
programmateurs spécialisés dans différentes échelles, peut-être le plus populaire est le PICSTART
plus, mais il ya d'autres comme PICkit2, PICkit3. Bien qu'il existe des programmateurs commerciaux
un développeur peut construire ou acheter un programmateur éducatif à faible coût, pour cela, il y a
amplement d'information sur Internet.

Figure 1-2

Support de cours Page 3


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Un microcontrôleur a une architecture de base similaire à celle d'un PC ,dispose d'un bloc OTP ou
mémoire Flash dans lequel sont stockées les instructions du programme, cette section est similaire au
disque dur de l'ordinateur, le PICmicro a une RAM, qui joue le même rôle de la mémoire vive d'un
ordinateur personnel, le microcontrôleur possède des ports d'entrée et de sortie qui sont similaires aux
périphériques d'entrée et de sortie pour ordinateur tel que souris, une imprimante, un écran, un clavier,
et autres.

Ces caractéristiques du microcontrôleur le rendent idéal pour la création de petites applications qui ont
une interface utilisateur, comme des claviers, des boutons, des lecteurs de la mémoire de stockage de
masse, et des capteurs de différentes grandeurs telles que la température, l'humidité, la pression, la
lumière, la proximité, etc. De même, il est possible de créer des environnements de visualisation avec
des afficheurs numériques, alphanumériques et graphiques. Les ports série comme USART et l'USB
peuvent créer des communications série et des communications sans fil avec d'autres appareils. En
bref, les possibilités sont sans fin.

1.1 Le compilateur MikroC PRO

La programmation des microcontrôleurs est basée sur le code machine, qui est connu comme code
assembleur, ce code contient les instructions du programme, le code assembleur est bien détaillé et
difficile à écrire. Le programme en code assembleur est très long et difficile à comprendre. La création
des compilateurs de haut niveau a rendu facile la création et l'édition de programmes, bien entendu les
microcontrôleurs ne font pas exception. Dans le commerce, il ya plusieurs variétés de compilateurs des
différents fabricants et avec différents langages de haut niveau.

On peut acheter les compilateurs PICC, CCS, PIC Basic, entre autres. L'étude de ce document se
concentre sur le compilateur MikroC PRO, qui est un compilateur de langage C pour les
microcontrôleurs PICmicro famille 12F, 16F, 18F et.

MikroC PRO est un logiciel avec une grande variété des helps, supports et d'outils, qui facilite la
création des projets et des applications pour les microcontrôleurs PICmicro.

L'étude de cet environnement de développement est possible, parce que l'étudiant peut télécharger une
démo ou version étudiant, qui a les mêmes caractéristiques que la version complète, la seule limite est
la taille du code machine ne peut pas excéder 2Koctets, une capacité suffisante pour un premier
apprentissage. La version de démonstration peut être téléchargée à partir du site Web:
www.mikroe.com.

La figure suivante montre l'aspect visuel de l'environnement de développement.

Support de cours Page 4


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 1-3

Le compilateur de haut niveau en langage C utilise des structures, facilitant la programmation,


optimisant les opérations mathématiques, et les processus grâce à l'utilisation de fonctions prédéfinies
et des fonctions que le développeur peut créer et l'utilisation d'un ensemble de variables, caractère,
nombre entier, et réel. Le compilateur crée automatiquement le code assembleur et un code enregistré
dans un fichier avec l'extension *. Hex, ce fichier est le résultat principal de la compilation, avec
lequel le microcontrôleur sera programmé électriquement ou pour être utilisé pour une simulation sur
ordinateur.

Support de cours Page 5


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

2. Principes de langage C

Le langage C datant de 1972, a été créé par les laboratoires Bell en raison de la nécessité de réécrire
les systèmes d'exploitation UNIX afin d'optimiser le code assembleur. De la même manière, le langage
C a été l'évolution des langages précédents appelé B et BCPL. Le nouveau langage C, a rapidement
pris la main pour ses fonctionnalités et sa facilité à la mise en œuvre dans des différents systèmes de
calcul.

La forme du langage C, est basée sur une structure complexe, nécessitant une étude approfondie. Pour
la programmation des microcontrôleurs, l’étudiant n’a besoin que des notions fondamentales qui le
permettent de se lancer et de créer les premiers projets en MikroC PRO. La fin ce chapitre est axé sur
la connaissance des notions de base pour commencer à étudier les microcontrôleurs avec ce document.

2.1 Déclaration des variables en C

Les variables de base dans ce compilateur spécifique sont:

bit
char
short
int
long
float
double

Les variables bit peuvent stocker un booléen qui peut être vrai ou faux, 0 ou 1.

Les variables char sont utilisées pour stocker des caractères codés avec le code ASCII. Il est utile pour
stocker des lettres ou des textes.

Une variable short contient un entier 8 bits qui peut prendre des valeurs : -127 à 127.

Les variables de type int sont des entiers 16 bits, cette variable peut stocker des nombres : -32767 à
32767.

La variable type long stocke un entier sur 32 bits, sa plage de valeurs est:

-2147483647 à 2147483647.

Les variables type double et float permettent de stocker des nombres avec virgule.

Les variables ci-dessus peuvent être déclarées, y compris le signe positif et négatif, ou peuvent être
déclarées au moyen de la directive unsigned.

Support de cours Page 6


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Dans le tableau ci-dessous, on peut voir les caractéristiques des variables.

Type de variable Taille en octets Valeurs


Bit 1 0 ou 1
Char 1 -127 à 127
Short 1 -127 à 127
Int 2 - 32767 à 32767
Long 4 - 2147483647 à 2147483647
Float 4 -1.5x10^45 à 3.4x10^38
Double 4 -1.5x10^45 à 3.4x10^38
unsigned char 1 0 à 255
unsigned short 1 0 à 255
unsigned int 2 0 à 65535
unsigned long 4 0 à 4294967295

Tableau 2.1

La déclaration des variables s'effectue en indiquant le type de la variable suivi d'un nom que le
développeur attribue arbitrairement à la variable. Au moment de la déclaration d'une variable, il est
possible de lui donner une valeur initiale, mais ceci n'est pas strictement nécessaire. Enfin, la
déclaration doit se terminer par un point-virgule (;).

Dans les exemples suivants, on peut voir comment les déclarations sont faites:

bit VARIABLE1_BIT; //Déclaration d'une variable type bit.


char CARACTERE; // Déclaration d'une variable type char.
char CARACTERE2='J'; //Déclaration d'une variable de type char initialisée
//avec la valeur ASCII le caractère J.
int ENTIER=1234; // Déclaration d'une variable entière initialisée avec
//la valeur 1234.
float DECIMAL=-12.45; // Déclaration d'une variable avec un point virgule
//initialisée avec la valeur -12,45.
double DECIMAL2=56.68; // Déclaration d'une variable avec un point virgule
//initialisée avec la valeur 56,68.
long ENTIER2=-954261; // Déclaration d'une variable entière de type long
// initialisée avec la valeur -954261.

Les exemples suivants montrent comment déclarer des variables non signées:

unsigned char CARACTERE; //Déclaration d'une variable type char non signé.
unsigned int ENTIER; //Déclaration d'une variable type entier non signé.
unsigned long ENTIER2; // Déclaration d'une variable type entier long non
//signé.

Les variables peuvent également être déclarées dans un format qui associe plusieurs variables dans un
même nombre, ce format est connu comme une chaine de variables ou un vecteur et peut-être même
un tableau de variables, en conclusion ce genre de déclaration peut avoir une ou plusieurs dimensions.

L'exemple suivant montre un vecteur de caractère, ou également connu sous le nom chaîne de
caractères:

char Text[20]; //Chaîne avec 20 emplacements de mémoire.

Support de cours Page 7


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

De même des chaînes de variables peuvent être déclarées avec des valeurs initiales, ce genre de
déclaration peut être vu dans l'exemple suivant:

char Text[20] = “Nouveau Texte”; //Déclarer une chaîne


//initialisée avec le texte: Nouveau texte.
int Eniers[5]={5,4,3,2,1}; // Déclarer une chaîne d'entiers avec des
//valeurs initiales.
float Decimals[3]={0.8,1.5,5.8}; // Déclaration d'une chaîne de nombres
//décimaux initialisée....

La déclaration des variables doit respecter quelques règles de base pour éviter les erreurs et les
incohérences dans la compilation de code, à cet effet il faut tenir compte des conseils suivants:
Les noms des variables ne doivent pas être répétés.
Les variables ne doivent pas commencer par un chiffre.
Une variable ne peut pas utiliser des caractères spéciaux comme: / * ‘;} {- \! . %.

Des exemples de déclarations de variables qu’on ne peut pas faire, c'est:

bit 1_VARIABLE-;
char -CARÁCTERE!;
int 3ENTIER*;

De même, on peut créer des structures d'informations comme une nouvelle variable créée par le
développeur. Ces structures sont réalisées avec les variables prédéfinies et peuvent être des
déclarations des variables ou des variables tableaux. De telles structures sont déclarées par
l'intermédiaire de la directive: typedef struct, et la façon de déclarer une variable créée par le
développeur est la suivante:

typedef struct
{
char Nom[10];
int age;
}Utilisateur;

Voici comment utiliser une variable personnalisée par le développeur:


Utilisateur U;
U.age = 25;
U.Nom[0]=’A’;
U.Nom[1]=’h’;
U.Nom[2]=’m’;
U.Nom[3]=’e’;
U.Nom[4]=’d’;

2.2 Les formats numériques dans le langage C :

Les applications en langage C utilisent des nombres de différentes bases de numération, alors pour le
fonctionnement des microcontrôleurs en bas niveau, tous les nombres sont convertis en base 2 (deux
nombres binaires 0 et 1). L’être humain n’est pas habitué à penser et à traiter des opérations en cette
base numérique.
Dès les premières étapes de la formation académique les écoles et les collèges apprennent aux
étudiants à penser et à traiter tous les calculs en base 10, c'est à dire avec des nombres décimaux. C'est
pourquoi les compilateurs du langage C travaillent avec des nombres décimaux facilitant les
conceptions pour le développeur. Outre le système décimal, le compilateur du langage C peut

Support de cours Page 8


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

travailler avec les autres bases telles que binaire, hexadécimal et rend plus facile à effectuer des calculs
et des tâches qui seraient plus complexe en décimal.
Les systèmes de numération en base 2, 10, et 16, sont implémentés dans le compilateur du langage C.
L’écriture des nombres décimaux, est la forme la plus simple, ils sont écrits en langage C de la même
manière conventionnelle qu’on a appris dès les premiers cours des mathématiques. Les nombres
binaires sont écrits avec le préfixe 0b suivi par le nombre binaire. Un exemple d'écriture est:
0b10100001 qui est équivalent au nombre décimal 161.

Les nombres en base 16 ou hexadécimal sont désignées avec 0x en entête suivi d'un nombre en
hexadécimal, l'expression 0x2A, est un exemple d'un nombre hexadécimal en langage C, qui est
équivalent à 42 en décimal. Les nombres binaires ne peuvent avoir que deux chiffres sont 0 et 1. Les
nombres hexadécimaux peuvent comprendre des chiffres parmi les suivants: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
A, B, C, D, E et F.

2.3 Les opérateurs en langage C

Le langage C permet de faire des opérations arithmétiques de base entre des variables ou des
constantes. Les opérations arithmétiques disponibles sont:
Somme
soustraction
Multiplication
Division
Modulo
L'exemple suivant montre la somme arithmétique de deux nombres ou plus:
int A;
int B;
int C;
C = A+B; //cet expression stocke la somme de A et B dans la variable C.
C = A+B+C; //cet expression stocke la somme de A, B et C dans
//la variable C.

L'exemple suivant montre la soustraction arithmétique entre deux nombres ou plus:

int A;
int B;
int C;
C = A-B; //cet expression stocke la différence de A et B dans
//la variable C.
C = A-B-C; //cet expression stocke la différence de A, B et C dans la
//variable C.

L'opération mathématique de multiplication peut être effectuée entre deux ou plusieurs variables, cet
opération est réalisée avec l'astérisque (*), cette expression peut être vue plus clairement dans les
exemples suivants:

int A;
int B;
int C;
C = A*B; //cet expression stocke la multiplication entre A et B dans la
//variable C.
C = A*B*C; //cet expression stocke la multiplication entre A, B et C dans
la //variable C.

Support de cours Page 9


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

La division arithmétique en langage C est spécifiée par la barre oblique (/), dans l'exemple suivant, on
peut voir sa mise en œuvre:
int A;
int B;
int C;
C = A/B; //cet expression stocke la division entre A et B dans
//la variable C.

L’opération modulo calcule le reste d'une division arithmétique, le calcul du modulo est indiqué par le
caractère pour cent (%), l'application de cette opération peut être vue dans l'exemple suivant:

C = A%B; //cet expression stocke le reste de la division entre A et B dans


//la //variable C.

Les opérations arithmétiques peuvent être utilisées en combinaison, c'est à dire que on peut mélanger
plusieurs opérations en une seule expression, pour voir plus clairement on va observer les exemples
suivants:

int A;
int B;
int C;
C = (A+B)/C; //cet expression est équivalente à C = (A+B) ÷C.
C = (A/B)*C; //cet expression est équivalente à C = (A÷B) X C.

D'autres opérateurs mathématiques raccourcis peuvent être utilisés lorsqu’on veut une modification
constante des variables, par exemple, il est possible d'incrémenter ou de décrémenter une variable
d'un certain nombre, tout comme il est possible de faire cette opération avec la multiplication et la
division. Pour comprendre ce concept, on observe plus clairement les exemples suivants:

A++; //Cet opérateur incrémente de un la valeur de A.


A--; //Cet opérateur décrémente de un la valeur de A.
A+=4; //Cet opérateur incrémente de 4 la valeur de A.
A-=5; //Cet opérateur décrémente de 5 la valeur de A.
A/=4; //Cet opérateur divise la valeur de A par 4.
A*=3; //Cet opérateur multiplie la valeur de A par 3.
A+=B; //Cet opérateur incrémente de B la valeur de A.
A*=B; //Cet opérateur multiplie la valeur de A par B.

Autres opérations mathématiques plus complexes peuvent être effectuées en langage C, à l'aide des
fonctions prédéfinies dans la bibliothèque mathématiques. Ce sujet sera traité plus tard, quand les
déclarations des fonctions seront étudiées.
Les opérateurs logiques permettent d'effectuer des actions ou des opérations qui respectent la logique
numérique soulevée par le mathématicien anglais George Boole au XIXe siècle. Boole a posé les
opérations booléennes OU, ET, NON, XOR, NOR, NAND, XNOR, qui sont largement étudiées dans les
cours de la logique combinatoire et systèmes numériques séquentielles.
Les opérations logiques sont effectuées en langage C entre deux variables ou des constantes, bit à bit
de même poids dans une variable ou un nombre. Pour voir et comprendre les exemples, on rappelle
d'abord les tables de vérité des opérations logiques comme indiqué ci-dessous:

Support de cours Page 10


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Inverseur NOT
Entrée Sortie
0 1
1 0

OR inclusive NOR inclusive OR exclusive ou XOR


Entrée 1 Entrée 2 Sortie Entrée 1 Entrée 2 Sortie Entrée 1 Entrée 2 Sortie
0 0 0 0 0 1 0 0 0
0 1 1 0 1 0 0 1 1
1 0 1 1 0 0 1 0 1
1 1 1 1 1 0 1 1 0

NOR exclusive ou XNOR AND NAND


Entrée 1 Entrée 2 Sortie Entrée 1 Entrée 2 Sortie Entrée 1 Entrée 2 Sortie
0 0 1 0 0 0 0 0 1
0 1 0 0 1 0 0 1 1
1 0 0 1 0 0 1 0 1
1 1 1 1 1 1 1 1 0

Les opérations logiques en C, sont réalisées avec des caractères spéciaux qui désignent chacun. Dans
l'exemple, on peut voir des applications de ces opérateurs logiques:

Opération NON logique, ou complément, désigné par le caractère tilde (~);

unsigned short VALEUR1 = 0b01010000 // variable initialisée au nombre binaire 80.


unsigned short RESULTAT;
RESULTAT = ~ VALEUR1 // La variable RESULTAT contient le complément de
//VALEUR1 , 175.

Opération logique OU, OU inclusive, est désignée par le caractère barre verticale (|);

unsigned short VALEUR1 = 0b01010000 // variable initialisée en binaire avec le nombre 80.
unsigned short VALEUR2 = 0b01011111 // variable initialisée en binaire avec le nombre 95.
unsigned short RESULTAT;
RESULTAT = VALEUR1 | VALEUR2 // La valeur de l'opération logique ou est stockée dans
//la variable RESULTAT, 95.

Opération XOR, ou exclusif, est notée avec l'accent circonflexe (^);

unsigned short VALEUR1 = 0b01010000 // variable initialisée en binaire avec le nombre 80.
unsigned short VALEUR2 = 0b01011111 // variable initialisée en binaire avec le nombre 95.
unsigned short RESULTAT;
RESULTAT = VALEUR1^ VALEUR2 // La valeur de l'opération logique ET
//est stockée dans RESULTAT, 15.
ET logique est notée avec l'esperluette (&);

unsigned short VALEUR1 = 0b01010000 // variable initialisée en binaire avec le nombre 80.
unsigned short VALEUR2 = 0b01011111 // variable initialisée en binaire avec le nombre 95.
unsigned short RESULTAT;
RÉSULTAT = VALEUR1 &VALEUR2; // La valeur de l'opération logique ET
// est stockée dans le RESULTAT, 80.

Support de cours Page 11


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

La mise en œuvre de NAND, NOR est XNOR, sont semblables aux opérations logiques ET,
OU, XOR, avec l’ajout du caractère tilde ( ) de la complémentation, on observe les exemples:

unsigned short VALEUR1 = 0b01010000 // variable initialisée en binaire avec le nombre 80.
unsigned short VALEUR2 = 0b01011111 // variable initialisée en binaire avec le nombre 95.
unsigned short RESULTAT;
RESULTAT = ~(VALEUR1|VALEUR2) // La valeur de l'opération logique NOR est stockée
//dans RESULTAT.
RESULTAT =~(VALEUR1 & VALEUR2) // La valeur de l'opération logique NAND est stockée
//dans RESULTAT.
RESULTAT =~(VALEUR1^ VALEUR2 ) // La valeur de l'opération logique XNOR est stockée
//dans RESULTAT.

Le décalage des bits d'une variable binaire est utile pour des procédés et des tâches impliquant
la manipulation de données au niveau des bits. Le décalage à droite d’une variable ou d’une
constante, en langage C, est réalisé par double caractère supérieur à (>>), de la même manière
pour le décalage à gauche qui est réalisé par (< <). L'opération de décalage fait perdre des bits
et insère des zéros dans les nouveaux bits. Dans les exemples suivants, on voit la mise en
œuvre de ces opérateurs:

short Donnee=0xFF // Déclaration des variables.


short RESULTAT;
RESULTAT = Donnee>> 4 //cet opération stocke dans la variable RESULTAT le
//résultat de décalage à droite de 4 bits la variable
//Donnee, la valeur du résultat final est 0x0F.
RESULTAT= Donnee << 4, //cet opération stocke dans la variable RESULTAT le
//résultat de décalage à gauche de 4 bits de la
variable //Donnee, la valeur du résultat final est 0xF0.

Les opérations logiques et arithmétiques mentionnées ci-dessus sont résumées dans le tableau suivant:

Description de l'opération Opérateur


Somme +
Reste -
Division /
Modulo ou reste de la division entière %
Incrémenter ++
Décrémenter --
Opération OU |
Opération ET &
Opération Ou exclusive ^
Complément à 1
Décalage à droite >>
Décalage à gauche <<

Tableau 2-2

Support de cours Page 12


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

2.4 Les fonctions en langage C :


Une fonction est une partie du code qui effectue une tâche spécifique chaque fois qu'elle est invoquée
par le flux du programme principal. Les fonctions ont deux caractéristiques essentielles, une ou
plusieurs paramètres d'entrée et un paramètre de sortie. Ces paramètres peuvent être des variables ou
des tableaux, tout comme ces paramètres d'entrée et de sortie peuvent être vides.
La structure des fonctions peut être vue dans les exemples suivants:

void nom_fonction (void) // Fonction avec des paramètres d'entrée et de sortie


//vides.
{ // Début de la fonction avec accolade.
// Code où la routine de fonction à exécuter.
} // Fin de la fonction avec accolade.

void nom_fonction(int A) // Fonction avec un paramètre d'entrée A entier et de


//sortie vide.
{ // Début de la fonction
// Code où la routine de fonction à exécuter.
} // Fin de la fonction.

int nom_fonction(void) // Fonction avec paramètre d'entrée vide et de sortie


//entier.
{ // Début de la fonction.
// Code où la routine de fonction à exécuter.
} // Fermeture de la fonction.
int nom_fonction(int A) // Fonction avec un paramètre d'entrée et de
sortie //tout entiers.
{ // Début de la fonction.
//Code où la routine de fonction à exécuter.
} // Fermeture de la fonction.

Les noms désignant les fonctions répondent aux mêmes règles de dénomination de variables.
L'exemple suivant montre une fonction qui est capable de calculer le produit de deux nombres avec
virgule:

float produit(float A, float B) // Fonction pour calculer le produit de A et B.


{ //Début de la fonction.
float RESULTAT;
RESULTAT=A*B //Produit de A et B.
return RESULTAT; //La fonction retourne le résultat stocké dans
//RESULTAT.
} //Fermeture de la fonction.

Une fonction peut utiliser une autre fonction pour exécuter des fonctions plus complexes. Pour voir
cette situation, on voit l'exemple suivant, qui calcule l'aire d'un cercle en fonction de son rayon:

Support de cours Page 13


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Surface

Rayon

Figure 2-1

L'aire du cercle est calculé par l'équation A = πr ², où la valeur de π est d'environ 3,1416.

float Valeur_PI ( void ) //Fonction qui retourne la valeur de π.


{ //Début de la fonction
float PI=3.1416;
return PI;
} //Fin de la fonction

Dans le cas où une fonction utilise des variables locales, la déclaration doit être faite au début de celui-
ci, avant toute autre action ou instruction.

float Aire_Cercle(float Rayon) //Fonction pour calculer l’aire d’un cercle.


{ //Début de la fonction
float Aire;
Aire= Valeur_PI()*Rayon*Rayon; //Calcul de l’aire d’un cercle.
return Aire;
} //fin de la fonction

Les fonctions sont créés par le développeur, mais il y en a certaines qui sont prédéfinies dans le
compilateur et peuvent être consultées et mises en œuvre en respectant les paramètres d'entrée et de
sortie, la plus importante d'entre elles est la fonction main() ou principale. L'importance de cette
fonction réside dans le fait que c'est sur elle que court tout le programme du microcontrôleur. Elle est
automatiquement exécutée quand le microcontrôleur est alimenté. La fonction main() dans le cas
particulier des microcontrôleurs ne contient ni paramètres d'entrée ou ni de sortie, sa déclaration peut
être vue dans l'exemple suivant:

void main( void ) //Déclaration de la fonction main.


{ // Début de la fonction main.
// Code pour le programme principal du
//microcontrôleur.
} // fin de la fonction main.

Les déclarations des fonctions, écrites par le développeur, doivent être déclarées avant la fonction
main().

Dans le cas d'une fonction qui appelle une autre fonction, la fonction appelée doit être déclarée avant
la fonction qui fait l'appel.

Les fonctions trigonométriques et d'autres fonctions mathématiques telles que logarithmes, et


exponentielle, peuvent être utilisées avec la bibliothèque prédéfinie par le compilateur. Cette
bibliothèque est appelée C_Math.h.

Support de cours Page 14


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

2.5 Création d'un programme en langage C


La structure d'un programme en langage C est relativement simple, il est d'abord essentiel de déclarer
des variables globales qui on juge nécessaires pour le fonctionnement du programme. Les variables
globales sont reconnues par toutes les parties du programme, y compris les fonctions propres au
développeur et la fonction main().

La prochaine étape est de faire des déclarations de fonctions conçues par le développeur pour des
tâches spécifiques dans le programme. Par la suite, la fonction main() est déclarée, au début on doit
déclarer des variables qui sont nécessaires au sein de la même fonction main(). Le code ci-dessous doit
configurer et initialiser les ports du microcontrôleur et les modules qui sont essentiels à l'application.
Enfin, on écrit le code qui contient le programme de l’application utilisateur. Dans l'exemple ci-
dessous, on peut voir la structure d’un programme:

int Variable1; //Déclaration des variables globales.


char Variable2;
float Variable3;
//Déclaration de fonctions propres au développeur.
float Valeur_PI ( void )
{
float PI=3.1416;
return PI;
}

float Calcul_Aire_Cercle( float Rayon )


{
float Aire;
Aire = Valeur_PI()*Rayon*Rayon; //Calcul de l’aire.
return Aire;
}
void main( void ) //Déclaration de la fonction main ou principale
{
float Valeur_Rayon; //Déclaration des variables de la fonction main.
float Valeur_Aire;
TRISB=0; //Configuration de ports et des modules.
TRISC=0;
PORTB=0;
PORTC=0;
while( 1 ) //Code de l’application.
{
Valeur_Aire=Calcul_Aire_Cercle( Valeur_Rayon );
}
}

2.6 Formes conditionnelles et itération en langage C

Les formes conditionnelles et itératives font partie intégrante de la structure de n'importe quel code en
langage C. Les instructions conditionnelles if, if else, et switch case permettent de réaliser des menus,
prendre des décisions, et de contrôler le flux du programme ou de l'application. Les structures
itératives while, do while et for, permettent de créer des boucles itératives, qui régissent des tâches et
des processus développés dans le programme.

Support de cours Page 15


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Les conditions logiques permettent de prendre des décisions en fonction d’un test. Les conditions
logiques retournent seulement deux valeurs possibles: vrai ou faux. Lorsque la condition logique se
fait directement sur une variable ou un nombre, la condition est fausse lorsque sa valeur est 0 et
renvoie vrai pour une valeur différente 0.

Les formes conditionnelles utilisées dans le langage C sont : NOT, ou la négation, OR ou ou inclusif ,
AND , ou et . On peut également utiliser des comparaisons entre deux valeurs telles que supérieur à,
inférieur à ou supérieur ou égal à, inférieur ou égal à, différents de, et égal à. L'utilisation de la
négation se fait avec le caractère d’exclamation(!), la condition OU est effectuée avec les caractères
double barres verticales (||) , La condition AND ou et, est utilisée avec double esperluette ( && ), la
condition supérieur à est utilisée avec le caractère ( > ) , la condition inférieur à est utilisée avec le
caractère (< ) , supérieur ou égal à est faite avec les caractères ( >= ) , l'état inférieur ou égal à , se fait
avec (<= ) , l'égalité est réalisée avec les caractères double égal ( == ) et l'état différent est utilise les
caractères de l'égalité et d'exclamation ( != ) . Pour bien comprendre ces opérateurs, on observe et on
analyse les exemples suivants :

short A;
short B;
(A==10)&&(B==20) //La condition est vraie si A vaut 10 et B vaut 20.
(A!=5)&&(B>2) // La condition est vraie si A es différent de 5 et B est
//supérieur à 2.
(A<=4)&&(B>=6) // La condition est vrai si A est inférieur ou égal 4 et
si //B est supérieur ou égal 6.
!(A>3)&&(B!=4) // La condition est vrai si A n’est pas supérieur 3 et si
B //est différente de 4.

L'instruction if évalue une condition logique et exécute un partie de code si et seulement si le résultat
de la condition est vrai. On observe l'instruction if dans l'exemple suivant:

short Valeur;
if( Valeur>100 ) //La condition est vraie si la variable Valeur est
//supérieure à 100.
{
// Partie de code qui est exécutée si la condition est
//vraie.
}

La structure if else est la même que if , la seule différence est que dans le cas où la condition est
fausse, c’est la partie de code associée à else qui est exécutée. Pour comprendre cette situation, on
prend l'exemple suivant:

short Valeur;
if( Valeur>100 ) //La condition est vraie si la variable Valeur est
supérieure à 100.
{
// Partie de code qui est exécutée si la condition est
//vraie.
}
else
{

Support de cours Page 16


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

// Partie de code qui est exécutée si la condition est


//fausse.
}

Le if et if else peuvent être imbriqués pour créer des structures plus complètes et complexes, ce cas
peut être vu clairement dans l'exemple suivant:

short Valeur1; //Déclaration des variables.


short Valeur2;
if( Valeur1>30 ) //test de if.
{
// Partie de code qui est exécutée si la condition est
//vraie.
if( (Valeur2==4)&&(Valeur1<50) ) //Seconde if imbriquée.
{
// Code qui s'exécute lorsque la seconde if a une
//condition vraie.
}
}

L’instruction switch case, fonctionne d'une manière similaire à l'instruction if, mais la différence c’est
qu’on n’évalue pas une condition mais la valeur d'une variable, et qu’on exécute une partie de code
pour chaque valeur possible de la variable.
Les valeurs écrites dans les case sont les cas possibles de la variable, le développeur les choisit en
fonction du besoin. Pour les cas des valeurs qui n’ont pas d'intérêt pour le développeur, une partie de
code s'exécute par défaut, en utilisant la directive default.

Chacun des fragments du code édités doit se terminer par l’instruction break pour rompre le flux de la
structure switch case, cet action est nécessaire parce que si deux cas se suivent les fragments de codes
correspondants vont s’exécuter jusqu'à la directive break ou jusqu'à la fin la structure switch case.
Pour bien comprendre le fonctionnement de l'instruction switch prenons l'exemple suivant:
short Valeur;
switch( Valeur ) //Evaluation de la variable Valeur.
{
case 0: // Fragment de code correspondant à la variable Valeur égale 0 .
break; //Rupture du cas 0.
case 1: // Fragment de code correspondant à la variable Valeur égale 1.
break; // Rupture du cas 1.
case 10: // Fragment de code correspondant à la variable Valeur égale 10.
break; // Rupture du cas 10.
case 20: // Fragment de code correspondant à la variable Valeur égale 20.
break; // Rupture du cas 20.
case 50: // Fragment de code correspondant à la variable Valeur égale 50.
break; // Rupture du cas 50.
default: // Fragment de code correspondant à la variable Valeur égale 0.
break; //Rupture de default.
}

Support de cours Page 17


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Le cycle itératif répète et exécute un fragment de programme à condition que la condition énoncée
dans while soit vraie. Pour savoir comment déclarer ce type de forme itérative, on prend l'exemple
suivant:

short CONT=0; //Déclaration de la variable entière qui compte jusqu’à 100.


while( CONT<100 ) //Déclaration de la boucle while.
{
CONT++; //Incrémentation de la variable CONT.
}

Mettre en œuvre une boucle do while est similaire à la boucle while, à la différence qu’on entre dans la
boucle, le fragment de code est exécuté, puis il évalue la condition contenue dans while. En
conclusion, le code est exécuté au moins une fois avant l'évaluation de la condition. Dans l'exemple ci-
dessous, on peut voir comment utiliser ce type de boucle:

short CONT=0; //Déclaration de la variable entière qui compte jusqu’à 100.


do //Déclaration de la boucle do while.
{
CONT++; //Incrémentation de la variable CONT.
} while( CONT<100 );

La forme itérative for est une structure similaire à la boucle while, la différence est que for a une
définition de la condition, entre les parenthèses, plus complexe. La condition a trois paramètres, le
premier est un champ pour donner les valeurs initiales à un ou plusieurs variables, le second champ
permet de créer une condition logique qui fait répéter le fragment du code for tant qu’elle est vraie, le
dernier champ réalise la modification d’une ou plusieurs variables, telles que: incrémentation,
décrémentation, etc.

Les variables qui sont modifiées dans le dernier champ sont généralement les mêmes qui ont été
initialisées dans le premier champ, mais ce n'est pas une règle. On observe la structure for sur
l’exemple suivant:

for( _INITIALISATION_ ; _CONDITION_; _MODIFICATION_ )


{
}

Pour connaitre le fonctionnement de la boucle for on observe l’exemple suivant:

short A; //Déclaration des variables.


short B;
for( A=0, B=100; (A<100)||(B>20); A++, B-- ) //structure de la boucle for.
{
// Code qui s'exécute lorsque la condition de for est vraie.
}

La plupart des applications utilisent des boucles imbriquées pour accroître la fonctionnalité et
optimiser la taille du code machine final. L’imbrication des boucles consiste à exécuter une boucle

Support de cours Page 18


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

dans une autre. Une boucle peut contenir une ou plusieurs boucles imbriquées. Pour mieux
comprendre ce concept, on considère l'exemple suivant:

short COL; //Déclaration des variables.


short LIN;
short MATRICE[10][10]; //Déclaration d’un vecteur bidimensionnel.
for( COL=0; COL<10; COL++ ) //Déclaration de la boucle for.
{
//Fragment du code de la première boucle.
for( LIN=0; LIN<10; LIN++ ) //Déclaration de la boucle for imbriquée.
{
//Fragment du code de la boucle imbriquée.
MATRICE[COL][LIN] = COL*LIN;
}
}

Dans l'exemple ci-dessus, les valeurs stockées sont dans une matrice de 10 sur 10, recouvrant toutes
les positions de la matrice.

Support de cours Page 19


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

3. Le simulateur ISIS de PROTEUS :


Le simulateur ISIS de Proteus est un logiciel puissant, développé par la compagnie électronique
Labcenter, qui s'est positionné pour plus de 10 ans comme l'un des outils les plus utiles pour simuler
les microcontrôleurs PICmicro.

L'ISIS permet la simulation des familles des PICmicro les plus populaires tels que: 12F, 16F, 18F. En
plus des PIC, ISIS peut simuler une variété de dispositifs numériques et analogiques, y compris les
afficheurs sept segments, les LCD des caractères et graphiques. ISIS permet de simuler des capteurs
de température, l'humidité, la pression et la lumière, entre autres.

Le simulateur peut simuler les actionneurs tels que des moteurs CC, les servomoteurs, les lampes à
incandescence, entre autres. Il est possible de simuler des périphériques d'entrée et de sortie comme les
claviers, ordinateur et les ports physiques tels que RS232 et USB. Ce simulateur a une grande variété
d'instruments de mesure tels que voltmètres, ampèremètres, oscilloscopes et analyseurs de signaux.

En conclusion ces caractéristiques et d'autres font d'ISIS de Proteus, un outil idéal pour la conception
et l'étude des PICmicro. Une version de démonstration du logiciel peut être téléchargée à partir du site
Web: www.labcenter.com. Sur la photo suivante, on peut voir l'aspect visuel de l'environnement de
développement d'ISIS:

Figure 3-1

L'utilisation et le travail avec ISIS exigent un large éventail d'outils et d'options qu’on doit savoir. On
va les découvrir progressivement au cours des exemples.

3.1 Les bases du simulateur ISIS


La section suivante montre les caractéristiques de base pour commencer la première simulation dans
ISIS. Dans une première étape, on identifie la palette sélecteur d’objets, c'est-à-gauche de l'écran, le
développeur doit identifier la touche P dans la palette comme le montre l'image ci-dessous:

Support de cours Page 20


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 3-2

Lorsqu’on appuie sur la touche P, le programme ouvre une nouvelle fenêtre qui permet de trouver les
dispositifs électroniques à travers la référence commerciale, ou sous la classification adopté par ISIS.
Pour rechercher un dispositif, on entre la référence dans la zone: Keywords, le programme génère une
liste, sur le côté droit de la fenêtre, des dispositifs en fonction de la recherche de l'utilisateur.

Pour sélectionner un dispositif, on double-clique sur sa référence dans la liste donnée. Pour
commencer, on repère les dispositifs suivants: BUTTON, LED-RED, RES, correspondants au bouton
poussoir, LED rouge, et une résistance. Après ce processus, dans la palette on devrait avoir les
appareils suivants:

Figure 3-3

La prochaine étape consiste à trouver les bornes de la masse et l’alimentation, à cet effet, on clique sur
l'icône suivant: dans la palette d'outils, qui se trouve sur le côté gauche de la fenêtre du
programme.

Support de cours Page 21


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Lorsqu’on clique sur cet outil, une liste de terminaux qui apparait, on trouve GROUND et POWER,
qui correspondent respectivement à la référence électrique ou la masse et à l’alimentation ou Vcc. La
borne d'alimentation a une différence de potentiel de 5 volts par défaut. Pour placer ces terminaux
dans la zone de travail, on clique sur les éléments dans la palette des terminaux, puis dans la zone de
travail. Après cette action, la zone de travail devrait être comme la figure suivante:

Figure 3-4

L'étape suivante consiste à fixer les dispositifs dans la zone de travail, on choisit le bouton: dans
la palette d'outils sur la gauche. Pour coller les dispositifs dans l’espace de travail, on procède de la
même manière que les terminaux, enfin on aura l’espace de travail suivant:

Figure 3-5

La prochaine étape est d'effectuer les connexions électriques, pour cet exemple, tous les éléments
sont connectés en série, à cet effet le curseur de la souris prend la forme d'un crayon, pour lier entre
deux bornes on clique sur la première puis la prochaine et le programme termine la connexion. À la
fin des connexions, l’espace de travail devient:

Support de cours Page 22


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 3-6

Enfin, on peut modifier la valeur de la résistance par un double clic de la souris sur la résistance, avec
cette action on affiche une fenêtre pour modifier la valeur de la résistance, qui est par défaut 10k, ce
qu'il faut faire est de la changer à 330.

L'étape suivante consiste à lancer la simulation, la palette située dans le coin inférieur gauche de
l'écran permet de contrôler les simulations. Cette palette a l'apparence suivante:

Figure 3-7

Enfin, on appuie sur le bouton play et la simulation fonctionne, lorsque la simulation est en cours, on
peut appuyer sur le bouton poussoir, et voir l'effet sur la simulation. Cet exemple simple montre le
processus de création d'un schéma sur ISIS.

La création des circuits en ISIS, implique une autre série d'actions qui seront abordés au cours des
exemples.

Support de cours Page 23


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

4. Création du premier programme en MikroC PRO


Le processus suivant doit être appris par cœur, pour mettre en œuvre à chaque fois des nouveaux
projets ou programmes pour les PICmicro. En lançant MikroC PRO, on identifie dans le menu
supérieur l’outil Project, et on choisit New Project… avec cette action, le programme affiche un
assistant facile à utiliser pour créer un nouveau projet. L'aspect visuel de cet assistant est:

Figure 4-1

La prochaine action est de cliquer sur le bouton Next, à cette étape de l'assistant affiche une case pour
sélectionner la référence de PICmicro, qu’on souhaite utiliser. Dans ce champ, on sélectionne le PIC
P16F84A. L'étape suivante est de définir la fréquence d'oscillation avec laquelle travaillera le PIC ;
dans cet exemple on sélectionne 4.000000 MHz. L'option suivante permet de définir le répertoire où le
développeur enregistrera le projet, dans ce répertoire le programme enregistrera tous les fichiers
nécessaires, parmi lesquels le code source qui sera archivé avec l’extension .c, et l’exécutable du PIC
de avec l’extension. hex.

L'étape suivante, l’assistant demande d'ajouter des fichiers à joindre au projet. Lorsqu’on crée un
nouveau projet, cette étape peut être ignorée, et on appuie sur Next, le dernier élément de l'assistant
demande si le développeur veut sélectionner les bibliothèques qu’il va utilisées dans ce travail, par
défaut, ce paramètre sélectionne toutes les bibliothèques utilisables pour ce PIC, le meilleur est de
laisser toutes les bibliothèques actives. Enfin, la configuration est terminée et le projet est créé, à la fin
la fenêtre doit apparaître comme suit:

Support de cours Page 24


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 4-2

A chaque modification effectuée sur le code du programme, on doit compiler le code en appuyant sur
le bouton suivant : il est situé en haut du programme dans la barre d'outils. Cette action produit
des résultats de la compilation qu’on trouve dans la partie inférieure de la fenêtre de programme. Les
messages doivent se terminer par un text ‘’Finished successfully’’.

Pour commencer l’édition d’un projet, on configure les ports du PIC, puis on insère le programme
dans une boucle infinie. Le PIC 16F84A dispose de deux ports A et B, on manipule le registre TRIS
pour configurer les ports en sortie ou entrée. Chaque port a son registre TRIS respectif, qu’on
configure avec trois états possibles, états haut, bas, et haute impédance.

Les registres TRIS ont le même nombre de bits que les ports, par exemple le port B ou PORTB de ce
PIC est de 8 bits, donc le TRISB comporte également 8 bits. Les bits des registres TRIS correspondent
à ceux des ports, et définissent bit à bit l'état du port. Si un bit du TRIS est 0 le même bit du port est en
sortie, et Si un bit du TRIS est 1 le même bit du port est en entrée ou en haute impédance. Pour voir ce
concept plus clairement, on observe et on analyse l'exemple suivant:

TRISB = 0b11110000; // Configure le quartet des bits de poids faible en


//sortie, et le quartet des bits de poids fort en entrée.
PORTB=0b00000000; //Les bits de sortie ont un 0 logique

Cet exemple utilise un bouton et deux LED pour afficher le comportement du programme. On observe
et on analyse le programme ci-dessous:

Support de cours Page 25


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

void main ( void )

unsigned int COMPTEUR=0;

TRISB = 0b11110000; // Configure le quartet des bits de poids faible en


sortie, //et le quartet des bits de poids fort en entrée.
PORTB=0b00000000; // Les bits de sortie ont un 0 logique
while( 1 ) //Boucle infinie
{
if( PORTB.F7==0 ) //test si bit RB7 est à 0
{
if( PORTB.F0==1 ) //test la valeur du bit RB0 et commute sa valeur.
PORTB.F0=0;
else
PORTB.F0=1;
while( PORTB.F7==0 ); //attend que RB7 passe à 1.
}
COMPTEUR++; //Incrémente la valeur du COMPTEUR.
//La condition if qui suit change automatiquement
l’état //du bit RB1tout les 256 incrémentations
if(COMPTEUR&0x0100 ) //test si le bit 8 du COMPTEUR est 1
PORTB.F1=1;
else
PORTB.F1=0;
}
}

L étape suivante est de faire la simulation sur ISIS, les résistances des LED doivent être changées à
330Ω, l’entrée Master CLeaR , MCLR doit être connecté à Vcc pour que le PIC ne redémarre pas ,à la
fin on devrait voir la forme suivante:

Figure 4-3

Support de cours Page 26


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Avant de lancer la simulation, on doit charger le fichier .Hex. Pour procéder on double clique sur le
PIC, et une fenêtre qui permet de rechercher le fichier .Hex, dans cette fenêtre on peut également
ajuster la fréquence d'oscillation. Par défaut, cette valeur est de 1 MHz, à des fins de simulation dans
ce cas, on doit sélectionner 4 MHz, cette fenêtre se présente comme suit:

Figure 4-4

Pour des fins de la programmation physique du microcontrôleur, il est important de tenir compte des
conditions de la configuration du PIC, chacun des microcontrôleurs Microchip possède un champ de
mémoire qui caractérise le comportement réel de la PIC, entre elles on peut souligner, le type
d'oscillateur ou horloge de traitement, par exemple quand on utilise un quartz de 4MHz, l'oscillateur
doit être réglé sur XT, si l'oscillateur est de 20MHz on utilise la configuration HS. S'il s'agit d’un
quartz d'une faible vitesse comme 400KHz, on utilise la configuration LP, et si un oscillateur est mis
en œuvre en utilisant un circuit RC ou une résistance en série avec un condensateur, on utilise l’option
RC.

De même, il est possible de configurer d'autres options telles que l'utilisation du chien de garde et la
protection du code en mémoire FLASH et l’EEPROM, cette dernière option est très importante pour
protéger les informations du microcontrôleur et d'empêcher le programme ou les données de la
mémoire d’être lues. Pour modifier la configuration du PIC, on doit chercher Edit Project ...qui se
trouve dans l’onglet Project du menu principal de MikroC PRO.

L'accès à cet outil est expliqué dans la figure suivante:

Support de cours Page 27


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 4-5

Support de cours Page 28


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 4-6

Support de cours Page 29


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

5. Affichage des données


La conception des systèmes à microcontrôleurs implique parfois l’affichage des données à l’utilisateur.
A cet effet on peut utiliser des afficheurs 7 segments, l’afficheur de caractère à cristaux liquides LCD
et l’afficheur LCD à écran graphique. Dans ce chapitre, on étudie et on illustre ces dispositifs par des
exemples.

5.1 Affichage à 7 segments


Un afficheur 7 segments est un dispositif qui permet de visualiser un nombre limité de caractères
essentiellement numériques, mais il est possible de visualiser quelques caractères comme: b, d, E, A,
ou F, C, -. L'afficheur 7 segments est un ensemble de LED, disposées de sorte qu’on visualise les
caractères en activant les segments convenables.

Les afficheurs 7 segments ont une désignation standard, à chaque segment on attribue une lettre de "a"
jusqu’à "g". La description et l'apparence physique de ces afficheurs sont illustrées sur les images
suivantes:

Figure 5-1

Les afficheurs à 7 segments sont fabriqués en deux formats; anode commune et cathode commune, les
afficheurs à 7 segments existent également dans un format dynamique, ces derniers utilisent deux
chiffres ou plus dans un seul boitier reliant tous les segments en parallèle, mais avec bornes communes
séparées. Les figures suivantes montrent des afficheurs 7 segments dans leur forme dynamique:

Figure 5-2

L’entrée DP, qu’on peut voir sur la figure ci-dessus, est le huitième segment. Il est mis en œuvre dans
certains affichages et correspond à la virgule, il est utilisé si la demande l'exige.

Pour effectuer le premier exemple avec cet afficheur on doit savoir comment réaliser l’affectation des
broches du PIC. A chaque segment de l'afficheur, on doit relier une broche du PIC. Pour faire une
conception optimale, on peut attribuer les broches en ordre consécutif d’un port, par exemple le

Support de cours Page 30


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

segment "a" est relié à la broche RB0, le "b" à la broche RB1, et ainsi de suite, jusqu'au segment "g" à
la broche RB6. Cependant, le développeur peut faire l’affectation des broches d’une manière
arbitraire.

Il est important de connaitre un outil contenu dans le logiciel MikroC PRO qui permet d’éditer les
digits de l’afficheur. Pour cela on utilise Tools dans la barre de menu, et on choisit l’outil Seven
Segment Editor.

Avec cette action, ressort une nouvelle fenêtre où on peut éditer d’une manière simple les segments de
l'afficheur à 7 segments. Au moment de l’édition de l’afficheur, apparait la valeur constante qui doit
être utilisée sur les sorties du port désigné pour son contrôle. L'éditeur permet de mettre en œuvre des
constantes pour l'afficheur anode ou cathode commune. De la même façon, on peut utiliser les valeurs
en décimal ou hexadécimal. L'aspect visuel de l'éditeur est:

Figure 5-3

L’utilisation de cet outil signifie que toutes les broches de l’afficheur sont attribuées au même port, et
dans un ordre consécutif comme on a vu ci-dessus. Pour la visualisation des chiffres dans l’afficheur,
on doit organiser les informations de ces digits dans un ordre consécutif, dans le cas de cet exemple de
0 à 9. A cette fin, la forme la plus simple est l'utilisation d'un tableau de données contenant les codes
des 10 chiffres. Dans l'exemple suivant, on déclare un tableau constant avec les codes des 10 chiffres,
et on utilise un afficheur à cathode commune. On observe comment déclarer des constantes qui
doivent être insérées avant la fonction main:

const unsigned short DIGITS[] =


{
0x3F, //Code du digit 0
0x06, // Code du digit 1
0x5B, // Code du digit 2
0x4F, // Code du digit 3
0x66, // Code du digit 4
0x6D, // Code du digit 5
0x7D, // Code du digit 6
0x07, // Code du digit 7
0x7F, // Code du digit 8
0x6F, // Code du digit 9
};

Support de cours Page 31


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Pour afficher les chiffres dans l'afficheur à 7 segments, cet exemple va utiliser le port B du PIC
16F84A. La visualisation des numéros est contrôlée par une routine, qui change le chiffre après une
temporisation réalisée par une fonction delay_ms, cette fonction qui est prédéfinie dans les
bibliothèques du compilateur. Cette fonction a pour paramètre d’entrée un entier représentant le temps
en millisecondes, pendant lequel le PIC effectue un retard, de la même manière on peut utiliser la
fonction delay_us, qui est identique à delay_ms mais en microsecondes.

Alors, le code source du PIC pour cet exemple est le suivant:

const unsigned short DIGITS[] =


{
0x3F, //Code du digit 0
0x06, //Code du digit 1
0x5B, //Code du digit 2
0x4F, //Code du digit 3
0x66, //Code du digit 4
0x6D, //Code du digit 5
0x7D, //Code du digit 6
0x07, //Code du digit 7
0x7F, //Code du digit 8
0x6F, //Code du digit 9
};
void main ( void )
{
unsigned short COMPTEUR=0;
TRISB = 0; // Configuration du port B en sortie
while( 1 ) //Boucle infinie
{
PORTB = DIGITS[COMPTEUR]; //Visualisation du chiffre correspondant à la valeur
//de la variable COMPTEUR.
COMPTEUR++; //Incrémentation la valeur de compteur.

delay_ms(1000); //Retard de 1 seconde.


}
}

L'étape suivante consiste à effectuer la simulation dans ISIS, pour cet effet, les dispositifs suivants
sont découverts: 16F84A, RES, et 7SEG-COM-CATHODE. Pour la liaison entre le PIC et l'afficheur,
on devrait utiliser les résistances de 330Ω. Par la suite, on réalise le circuit suivant :

Circuit 5-1

Support de cours Page 32


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

A l’exécution de la simulation, on doit voir sur l’afficheur un comptage des nombres de 0 à 9, avec
une cadence d’une seconde entre chiffres et chiffre.

La mise en œuvre des afficheurs dynamiques utilise la même théorie d'un seul afficheur, l'affichage
dynamique consiste à afficher un seul chiffre à la fois. Par exemple, si on veut afficher quatre chiffres,
on active l’afficheur des unités, ensuite on l’éteint et on active le chiffre des dizaines, puis on l'éteint et
le chiffre des centaines est activé, enfin on fait la même chose avec l’afficheur des milliers.

Ce processus doit être effectué à une vitesse de manière à tromper l'œil humain, de sorte à voir comme
si tous les chiffres ont été actifs. Cette gestion d’affichage minimise les connexions électriques et la
consommation d'énergie, car en réalité un seul afficheur est actif à la fois.

Vue la perception de l’œil humain, les modifications doivent être de 25Hz ou plus, donc tous les
chiffres doivent être montrés pendant une durée égale à l'inverse de 25Hz ,est égale à 40ms. Pour cet
exemple, on utilise 4 afficheurs donc le temps d’affichage de chaque chiffre doit être un quart de la
période qui est 10ms. Le moyen le plus efficace pour afficher les chiffres est d’utiliser une fonction.

Avec 4 digits, il est possible d’afficher un nombre de 0 à 9999, à ce nombre on associe une variable de
type entier. Pour voir chaque chiffre séparément, il est nécessaire de calculer chacun des chiffres, par
exemple pour déduire le chiffre des milliers on divise le nombre par mille, puis soustraire les milliers
du nombre entier, ce processus est répété jusqu'à atteindre les unités. L’activation des afficheurs doit
se faire par un autre port, dans cet exemple elle est faite par le port A.

Pour comprendre ce processus, on observe et on analyse la fonction suivante:

// Déclaration des constantes pour l’afficheur.


const unsigned short DIGITS[] =
{
0x3F, //Code du digit 0
0x06, //Code du digit 1
0x5B, //Code du digit 2
0x4F, //Code du digit 3
0x66, //Code du digit 4
0x6D, //Code du digit 5
0x7D, //Code du digit 6
0x07, //Code du digit 7
0x7F, //Code du digit 8
0x6F, //Code du digit 9
};
//Fonction pour l’un affichage dynamique.
void Affichage( int Nombre )
{
unsigned short U; //Variable pour les unités.
unsigned short D; //Variable pour les dizaines.
unsigned short C; //Variable pour les centaines.
unsigned short M; //Variable pour les milliers.
M = Nombre/1000; //Calcul des milliers.
C = (Nombre-M*1000)/100; //Calcul des centaines.
D = (Nombre-M*1000-C*100)/10; //Calcul des dizaines.
U = (Nombre-M*1000-C*100-D*10); //Calcul des unités.
PORTB = DIGITS[U]; //Visualisation des unités.
PORTA.F0=1; //Activer le premier afficheur
delay_ms(10); //Retard de 10ms
PORTA=0; //Désactiver tout les afficheurs.

Support de cours Page 33


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

PORTB = DIGITS[D]; // Visualisation des dizaines.


PORTA.F1=1; //Activer le second afficheur
delay_ms(10); // Retard de 10ms
PORTA=0; // Désactiver tout les afficheurs.
PORTB = DIGITS[C]; //Visualisation des centaines.
PORTA.F2=1; //Activer le troisième afficheur
delay_ms(10); // Retard de 10ms
PORTA=0; // Désactiver tout les afficheurs.
PORTB = DIGITS[M]; //Visualisation des centaines.
PORTA.F3=1; // Activer le troisième afficheur
delay_ms(10); // Retard de 10ms
PORTA=0; // Désactiver tout les afficheurs.
}

void main ( void )


{
unsigned short N=0; //Variable de comptage.
int Nombre=0;
TRISB = 0; //Configurer le port B en sortie
TRISA = 0; // Configurer le port A en sortie
PORTA = 0; //Désactiver tout les afficheurs
while( 1 ) //Boucle infinie
{
//Visualiser la valeur du Nombre.
Affichage(Nombre); //cette fonction dure approximativement 40ms.
//On compte 12 incrémentations de N pour faire une
//incrémentation
//du Nombre approximativement chaque 500ms.
N++;
if( N==12 )
{
N=0; //Initialiser le compteur N.
Nombre++; //Incrémentation de la valeur Nombre.
if( Nombre==10000 ) //Test si Nombre vaut 10000
Nombre=0; //Initialisation à 0 si nombre = 10000.
}
}
}

On compile le programme. Finalement, on réalise la simulation sur ISIS avec les dispositifs suivants
16F84A, RES, 7SEG-MPX4-CC,7404. Le circuit est le suivant:

Support de cours Page 34


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Circuit 5-2

Pour des raisons pratiques, les inverseurs 7404 peuvent être remplacés par un réseau de
transistors, comme on le voit dans l'image ci-dessous:

Circuit 5-3

Lorsque la simulation est en marche, ce circuit devrait afficher un nombre de 0 à 9999 avec une
cadence de 500ms entre chaque incrément.

5.2 Afficheur LCD


Les afficheurs de caractères à cristaux liquides LCD sont des modules préfabriqués qui contiennent
des pilotes inclus. Ces écrans disposent d'un bus de données et un bus de commande, pour la
manipulation de ces appareils, le compilateur MikroC PRO dispose d'une bibliothèque prédéfinie pour
contrôler les LCD. L'apparence physique des LCD et celle dans ISIS sont présentées dans la figure
suivante:

Support de cours Page 35


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 5-4

Les afficheurs LCD, permettent de visualiser les caractères figurant dans le code ASCII. En plus du
code ASCII, LCD affiche jusqu'à 8 caractères conçus par le développeur. Une autre caractéristique
fondamentale des afficheurs LCD, tenant physiquement sur 8 bits, est la possibilité de configurer les
connexions avec seulement 4 bits. La connexion 8-bit implique un plus grand nombre de fils à utiliser,
pour une meilleure vitesse de travail, par conséquent les connexions de 4 bits réduits le nombre de fils,
mais diminue la vitesse. La bibliothèque prédéfinie dans MikroC PRO fonctionne avec une
configuration de 4 bits.

Pour voir la bibliothèque prédéfinie pour ce dispositif et d'autres, contenues dans MikroC PRO, on
choisit View dans la barre de menu, et on appuie sur l’un onglet : Library Manager. Lorsqu’on appuie
sur cet onglet un menu montrant les différentes bibliothèques qu’on peut utiliser avec les PIC.

Dans ce nouveau menu, on identifie la bibliothèque Lcd, par la suite on peut appuyer sur une des
fonctions contenues dans la bibliothèque pour voir l'aide. L'aspect visuel de cet outil est illustré dans la
figure suivante:

Support de cours Page 36


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 5-5

L'implémentation de l'afficheur LCD, requiert l'utilisation des instructions et des commandes


séquentielles pour la configuration et l’utilisation de l’afficheur, cependant, la bibliothèque de MikroC
PRO minimise ce travail, car elle se charge de faire tous ces réglages, ce qui rend beaucoup plus facile
le travail développeur.

Comme première étape pour l'utilisation du LCD, il est nécessaire de définir les broches de connexion,
puis l’exécution de la fonction d’initialisation du LCD : Lcd_Init(). La définition des broches de
connexion est assurée par le développeur d’une façon arbitraire selon son choix. Pour répondre à cet
objectif, on utilise la déclaration suivante des constantes :

//Broches de sortie du LCD


sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
//Bits de configuration TRIS
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

Support de cours Page 37


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Pour changer les broches, il suffit de changer les noms des sorties du port utilisé dans l'exemple
précédent. Comme on peut le voir dans la présentation ci-dessus seulement 6 broches sont nécessaires
pour faire fonctionner le LCD, avec 4 bits de données et 2 bits de contrôle.

A la fin, on doit appeler la fonction d’initialisation dans la fonction main après configuration des ports.
La fonction main doit être comme suit:

void main( void )


{
Lcd_Init(); //Initialisation du LCD.
while(1) //Boucle infinie.
{
}
}

Après l’édition du code ci-dessus, l'afficheur LCD est initialisé et devrait être prêt à commencer
l’affichage des caractères, se positionnant dans la première ligne et la première colonne, montrant le
curseur clignotant.

Les LCD sont fabriqués dans différentes formes et couleurs, ils sont disponibles avec des écrans vert,
bleu et jaune, avec des distributions de caractères sous forme de matrice comme les LCD 2 lignes, 16
colonnes. Ceux-ci sont connus comme 2x16, de la même manière on peut trouver des 1x16, 2x16, 2x8,
2x20, 4x20, entre autres. Pour les exemples de ce chapitre, on utilisera l'afficheur 4x20.

Pour démarrer la simulation de l'afficheur LCD, on cherche le dispositif de LM044L, et PIC 16F84A
dans le simulateur ISIS. La référence LM044L dans ISIS correspond à un LCD de 4x20. Enfin, on
effectue les connexions comme indiqué dans le circuit suivant:

Circuit 5-4

L’afficheur LCD a une broche nommée VEE, cette broche fonctionne comme contrôleur du contraste
de l'écran, mais dans la simulation, elle n'a pas d'effet. Cette broche peut être reliée à la masse pour

Support de cours Page 38


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

générer le contraste le plus élevé, certains grands écrans nécessitent une tension négative externe pour
contrôler le contraste. Pour des raisons pratiques, le contraste peut être ajusté par l'intermédiaire d'un
potentiomètre, comme indiqué dans le circuit suivant:

Circuit 5-5

La prochaine étape consiste à afficher à l'écran des informations. A cet effet, on peut utiliser quatre
fonctions. Deux de ces fonctions permettent d'afficher des caractères, et les deux autres des chaînes de
caractères.

Pour afficher les caractères, on peut procéder de deux façons, la première affiche simplement les
caractères dans l'ordre consécutif pris par l'afficheur et la seconde fonction imprime les caractères dans
la ligne et la colonne désignées par le développeur.

La première fonction d’affichage des caractères est Lcd_Chr_Cp (char out_char) ; lorsque cette
fonction est invoquée affiche sur l'écran le caractère qui correspond au code ASCII, qui est le
paramètre d'entrée out_char. Avec l'impression d'un nouvel caractère sur l’afficheur LCD, le curseur
se déplace automatiquement d'une position. Pour voir le fonctionnement de cette fonction, on observe
l'exemple suivant:

void main( void )


{
Lcd_Init(); //Initialisation du LCD.
Lcd_Chr_Cp(‘S’); //cette fonction affiche lettre à lettre le mot “Salut”.
Lcd_Chr_Cp(‘a’);
Lcd_Chr_Cp(‘l’);
Lcd_Chr_Cp(‘u’);
Lcd_Chr_Cp(‘t’);
while(1) //Boucle infinie.
{
}
}

Après l'exécution de la simulation, on devrait observer ce qui suit sur l'afficheur LCD:

Support de cours Page 39


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 5-6

Pour l'affichage des caractères au moyen des cordonnées ligne, colonne, la fonction mise en œuvre:
Lcd_Chr(char row, char column, char out_char); cette fonction imprime le caractère out_char, dans
la colonne column et la ligne row. Dans l'exemple ci-dessous, on peut voir comment utiliser cette
fonction:

void main( void )


{
Lcd_Init(); //Initialisation du LCD
Lcd_Chr_Cp(‘S’); //Ces functions impriment lettre à lettre le mot
“Sal ”.
Lcd_Chr_Cp(‘a’);
Lcd_Chr_Cp(‘l’);
Lcd_Chr_Cp(‘ ’);
Lcd_Chr_Cp(‘t’);
Lcd_Chr( 1, 6, ‘1’); //Imprime le caractère 1, dans la ligne 1, colonne 6
Lcd_Chr( 2, 7, ‘2’); // Imprime le caractère 2, dans la ligne 2, colonne 7
Lcd_Chr( 3, 8, ‘3’); // Imprime le caractère 3, dans la ligne 3, colonne 8
Lcd_Chr( 4, 9, ‘4’); // Imprime le caractère 4, dans la ligne 4, colonne 9
while(1) //Boucle infinie.
{
}
}

Après l'exécution de la simulation, on devrait observer ce qui suit sur l'afficheur LCD:

Support de cours Page 40


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 5-7

L'utilisation de chaînes est similaire aux deux fonctions précédentes, pour cela on peut afficher des
chaines de caractères à un point arbitraire à l'aide des coordonnées ligne et colonne. Pour imprimer
une chaîne de caractères à la position courante du curseur, on utilise la fonction suivante:
Lcd_Out_Cp (char * text) ; elle a un paramètre d'entrée unique qui est un pointeur vers la chaîne. Pour
voir comment utiliser cette fonction, on observe l'exemple suivant:

void main( void )


{
Lcd_Init(); //Initialisation du LCD.
Lcd_Out_Cp(“salut tout le Monde”);
while(1) //Boucle infinie.
{
}
}

La mise en œuvre de cette fonction peut être faite avec des chaînes de caractères constantes ou
variables, des chaines constantes sont indiquées par des guillemets au début et à la fin du texte, par
exemple "Salut tout le Monde ", la forme variable est déclarée : char texte [20] = "Salut tout le Monde
". Après avoir exécuté la simulation, on a comme montré dans la figure suivante:

Support de cours Page 41


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Figure 5-8

Pour imprimer une chaîne de caractères avec une coordonnée comme point de départ, on implémente
la fonction : Lcd_Out(char row, char column, char *text);. Cette fonction est similaire à la
précédente, à la différence qu’on inclut les données row et column, qui font référence respectivement à
la ligne et la colonne. Pour bien comprendre le fonctionnement de cette fonction d'observe et on
analyse l'exemple suivant:

void main( void )


{
Lcd_Init(); //Initialisation du LCD.
Lcd_Out( 1, 1, “Ligne 1, Colonne 1” );
Lcd_Out( 2, 2, “Ligne 2, Colonne 2” );
while(1) //Boucle infinie.
{
}
}

Après la compilation et la simulation de cet exemple, on devrait observer sur l'écran LCD comme suit:

Figure 5-9

La visualisation des valeurs numériques est indispensable dans de nombreux développements. Par
exemple, lorsqu’on souhaite afficher l'état d'une variable, ou un capteur tel que : température,
humidité, la pression, etc...

Pour atteindre cet objectif, on peut recourir aux fonctions de conversion prédéfinies par le compilateur.
Pour cela, on peut utiliser la bibliothèque: Conversions, qui contient des fonctions qui convertissent
une valeur numérique en une chaîne de caractères.

Si on veut afficher une valeur de type entier, on utilise la fonction : IntToStr(int input, char *output);
cette fonction a deux paramètres d'entrée sont: input, qui est une valeur entière à afficher, et output,
qui est un pointeur sur une chaîne où on veut écrire la forme texte de la valeur intput. Pour comprendre
ce type de conversion, on observe et on analyse l'exemple suivant:

void main( void )

Support de cours Page 42


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

{
int ENTIER=123; //Déclaration d’une variable entière avec valeur
//initiale 123.
char Text[20]; //Chaine de caractères pour l’affichage des données.
Lcd_Init(); //Initialisation du LCD.
IntToStr( ENTIER,Text ); //Fonction de conversion.
Lcd_Out_Cp(Text); //Impression du texte dans l’écran LCD.
while(1) //Boucle infinie.
{
}
}

L’impression des nombres entiers en chaîne de caractères avec cette fonction, réserve toujours un
champ fixe de 7 caractères, c'est à dire si le nombre est inférieur à 7 chiffres le reste du texte est
complété par des espaces vides. Après compilation du programme et simulation sur ISIS, on a un
résultat comme dans la figure suivante:

Figure 5-10

L’impression des nombres décimaux (avec virgule) peut être fait avec la fonction:
FloatToStr(float fnum, char *str);. La philosophie de fonctionnement de cette fonction est identique à
la précédente, qui fait des conversions d'entiers. Pour réaliser l'exemple suivant, on doit modifier la
référence du microcontrôleur, cela est dû à la capacité de mémoire du PIC 16F84A, qui n'est pas
suffisante pour les exercices suivants.

void main( void )


{
int ENTIER=123; //Déclaration d’une variable entière avec la valeur initiale
123.
float DECIMAL=12.76543; //Déclaration d’une variable avec point décimal
//initialisation à 12,76543.
char Text[20]; // Chaine de caractères pour l’affichage des données.
Lcd_Init(); //Initialisation du LCD.
IntToStr( ENTIER,Text ); //Fonction de conversion entière .
Lcd_Out(1,1,Text); //Impression du texte en sur l’écran LCD.
FloatToStr( DECIMAL,Text ); //Fonction de conversion décimale.
Lcd_Out(2,1,Text); // Impression du texte en sur l’écran LCD.
while(1) //Boucle infinie.
{
}
}

Support de cours Page 43


Support de cours : Conception et simulation des systèmes à PIC 1 ELT

Après la simulation, on a le résultat sur la figure suivante:

Circuit 5-6

Le même processus peut être suivi pour autres types de variables telles que: short avec la fonction:

ShortToStr(short input, char *output);

Les variables long avec la fonction:

LongToStr(long input, char *output);

Des variables unsigned short avec la fonction:

ByteToStr(unsigned short input, char *output);

Variables unsigned long avec la fonction:

LongWordToStr(unsigned long input, char *output);

Les variables unsigned int avec la fonction:

WordToStr(unsigned int input, char *output);

Support de cours Page 44

Vous aimerez peut-être aussi