Chapitre : Microcontroleurs
Leçon N°2 : Applications a base de PIC
1-Commande d’un afficheur LCD
2- Gestion d’un clavier
3-Conversion Analogique-Numérique
4-Modulation de largeur d’une impulsion
Activité n°3 : Commande d’un afficheur LCD
-Réaliser l’activité n°3, voir manuel d’activité pages : 93 et 94
I- Les afficheurs LCD :
Les afficheurs à cristaux liquides, autrement appelés afficheurs LCD .
1-Brochage
Un circuit intégré spécialisé est chargé de la gestion du module. Il remplit
une double fonction : d'une part il commande l'affichage et de l'autre se
charge de la communication avec l'extérieur (PIC).
Broche Type Fonction
VSS Masse
Alimentation
VDD Alimentation positive +5V
VEE réglage du contraste de l'afficheur (0 à 5V) .
RS sélection : commande ou données
Commande
R/W Lecture ou écriture (Read/Write)
E Entrée de validation (Enable)
D7,D6,D5,D4,D3,D2,D1,D0 Mode 8bits : Données de 8 bits bidirectionnelles
Données
D7,D6,D5,D4 Mode 4bits : Données de 4 bits bidirectionnelles
2-La mémoire
-L'afficheur possède deux types de mémoire : mémoire d'affichage (stocke des caractères) et mémoire du
générateur de caractères.
-L'afficheur est en mesure d'afficher 200 caractères :( 8 caractères définissables par l'utilisateur + 96
caractères ASCII + 64 caractères japonais + 32 caractères spéciaux (accent, lettres grecques, ...)
3-Le jeu de commandes prédéfinies par le langage MikroPascal :
*Lcd_Init
Prototype procedure Lcd_Init();
Description Initialiser le module LCD en respectant les connexions déclarées
Exemple // connexion du module LCD var LCD_RS_Direction : sbit at TRISB4_bit;
var LCD_RS : sbit at RB4_bit; var LCD_EN_Direction : sbit at TRISB5_bit;
var LCD_EN : sbit at RB5_bit; var LCD_D4_Direction : sbit at TRISB3_bit;
var LCD_D4 : sbit at RB3_bit; var LCD_D5_Direction : sbit at TRISB2_bit;
var LCD_D5 : sbit at RB2_bit; var LCD_D6_Direction : sbit at TRISB1_bit;
var LCD_D6 : sbit at RB1_bit; var LCD_D7_Direction : sbit at TRISB0_bit;
var LCD_D7 : sbit at RB0_bit; …
Lcd_Init();
*Lcd_Out
Prototype procedure Lcd_Out(ligne: byte; colonne: byte; var texte: string);
Imprime le texte sur l'écran LCD à partir de la position spécifiée.
Description • ligne: la position de départ numéro de ligne
• Colonne: la position de départ numéro de colonne
• Texte: texte à rédiger
Le module LCD doit être initialisé. Voir routine Lcd_Init.
Exemple1 Lcd_Out(1, 3, "Hello!"); // écrire texte « Hello! » sur LCD à la position ( ligne 1, colonne 3) :
Exemple2 Lcd_Out_CP ("Hello!"); // écrire texte « Hello! » sur LCD à la position actuelle du curseur
Microcontrôleur Page 9/23
*Lcd_Chr
Prototype procedure Lcd_Chr(ligne: byte; colonne: byte; caractere: byte);
Afficher caractère sur l'écran LCD à la position spécifiée.
Description • ligne: écrire position de numéro de ligne
• colonne: écrire position de numéro de colonne
• caractère : caractère à écrire
Le module LCD doit être initialisé. Voir routine Lcd_Init.
Exemple1 Lcd_Chr(2, 3, 'i'); // écrire le caractère « i » sur LCD à la position (ligne2, colonne3)
Exemple2 Lcd_Chr_CP( 'i'); // écrire le caractère « i » sur LCD à la position actuelle du curseur
*Lcd_Cmd
Prototype procedure Lcd_Cmd( commande: byte);
Description Envoie une commande à LCD
• commande: commande à envoyer
Le module LCD doit être initialisé. Voir routine Lcd_Init.
Exemple Lcd_Cmd(_LCD_CLEAR); //effacer l’écran LCD
*Liste des commandes LCD
Commande LCD Description Commande LCD Description
_LCD_FIRST_ROW Déplacez le curseur sur le 1er rang _LCD_BLINK_CURSOR_ON Activer Curseur clignote
_LCD_SECOND_ROW Déplacez le curseur sur le 2eme rang _LCD_MOVE_CURSOR_LEFT Déplacer le curseur à gauche
_LCD_CLEAR Effacer écran _LCD_MOVE_CURSOR_RIGHT Déplacez le curseur à droite
_LCD_RETURN_HOME Curseur Retour à la position initiale _LCD_TURN_ON Activer l’affichage LCD
_LCD_CURSOR_OFF Désactiver curseur _LCD_TURN_OFF Désactiver l’affichage
_LCD_UNDERLINE_ON Activer Souligner curseur
*Evaluations :
A partir du programme de l’activité N°3, vérifier par simulation sous ISIS quelques commandes
Activité n°4 : Serrure codée
-Réaliser l’activité n°4, voir manuel d’activité pages : 94 et 97
II- Clavier matriciel :
1-/ Principe du clavier matriciel : Un clavier matriciel 4*4 (16 touches) dispose uniquement de 8 broches
pour la gestion de ses touches. L’organisation est de 4 colonnes et 4 lignes. (COM : vers la masse)
2-/ Décodage : correspondance Code-Touche :
Code Touche Code Touche Procédure décodage
1 0 9 8 procedure decodage; 5: a := 4; 12: a := 'B';
2 1 10 9 begin 6: a := 5; 13: a := ‘C';
3 2 11 A case kp of 7: a := 6; 14: a := ‘D';
4 3 12 B 1: a := 0; 8: a := 7; 15: a := ‘E';
5 4 13 C 2: a := 1; 9: a := 8; 16: a := ‘F';
6 5 14 D 3: a := 2; 10: a := 9; end;
7 6 15 E 4: a := 3; 11: a := 'A'; end;
8 7 16 F
Microcontrôleur Page 10/23
3-/ Le jeu de commandes prédéfinies par le langage MikroPascal :
*Keypad_Init( );
procedure Keypad_Init( );
Description Initialiser le port pour travailler avec clavier.
var keypadPort : byte at PORTB;
Exemple Keypad_Init(); // Initialiser PORTB pour communication avec keypad
*Keypad_Key_Click( );
function Keypad_Key_Click( ): byte;
-Si une touche enfoncée : le code est de 1 à 16.
Description
-Si aucune touche n’est actionnée (au repos) : le code est 0.
var kp : byte;
Exemple kp := Keypad_Key_Click(); // kp={0,1,2,…,16}
4-/ Bibliothèque du son :
*Sound_Init
procedure Sound_Init(var son_port : byte; son_pin : byte);
Configurer la broche du PIC pour la production sonore.
Description son_port: adresse de port de sortie audio
son_pin: broche de sortie son
Exemple Sound_Init(PORTC,3); // Initialiser le son sur la broche RC3
*Sound_Play
procedure Sound_Play(freq_in_hz, duration_ms : word);
Génère le signal d'onde carrée sur la broche appropriée.
Description freq_in_hz : la fréquence du signal en Hertz (Hz)
duration_ms : durée du signal en millisecondes (ms)
Exemple Sound_Play(1000, 100); // générer un son de 1KHz et de durée de 100ms
Microcontrôleur Page 11/23
III- Conversion Analogique Numérique : CAN ou ADC
1-/ principe de fonctionnement :
Le convertisseur analogique-numérique (CAN ou ADC) permet de convertir une grandeur analogique (tension Ue) en
une valeur numérique (nombre N) :
Activité : afficheur de température
Pour lire et afficher la température on utilise un microcontrôleur PIC16F876A, un afficheur LCD2*16 et un capteur
de température LM35 qui fournit à sa sortie une tension proportionnelle à température (10mV/°C) :
1-/ exprimer T en fonction de Uc :
T ---> Uc T =………………………………………
1°C ---> 10mV
2-/ exprimer Uc en fonction de N, en déduire T en fonction de N:
Uc ---> N
5V ---> 1023
Uc =…………………………………………………
T = ……………………………………………………
Microcontrôleur Page 12/23
2-/ Programmation en langage Mikropascal
Programme conversion ; // entête : non du programme
Var // déclaration des variables
valeur_conversion : word ; // 2 octets car le résultat de conversion est sur 10 bits
variable_calcul : real ; // 4 octets pour le calcul pour ne pas avoir un dépassement de taille lors de la
multiplication
temperature : byte; // 1 octet car la température est comprise entre 2 et 150
valeur_afichage : string[3]; //chaine de 3 caractères pour afficher la température
LCD_RS : sbit at portc.0; // Connections de l'LCD
……………………………………………;
LCD_D4 : sbit at portc.2;
LCD_D5 : sbit at portc.3;
…………………………………………….;
LCD_D7 : sbit at portc.5;
LCD_RS_Direction : sbit at TRISC.0;
LCD_EN_Direction : sbit at TRISC.1;
……………………………………………………;
LCD_D5_Direction : sbit at TRISC.3;
……………………………………………………;
…………………………………………………..;
Begin // début
lcd_init(); // initialisation de l'LCD
lcd_cmd(……………………………………..); // désactivation du curseur de l'LCD
lcd_out(1,1,'T='); // préparation de l'affichage, afficher « T= »
adc_init(); // initialisation du module CAN
while true do // boucle tant que infinie
begin // début boucle
N := adc_read(…….); // convertir la tension Uc au RA0 en un nombre N
Tr := …………………………………..; // conversion N en Tr (réel)
Te:= byte(Tr ); // conversion : Tr (réel) ---> Te (entier)
byteToStr(Te,Ta); // conversion : Tr (entier) ---> Ta (caractère) « si Tr=25 alors Ta=25 »
lcd_out(1,3,Ta); // affichage de la contenue de Ta
lcd_chr(1,6,%11011111); // affichage du symbole degré: ° « voir code ASC II»
lcd_chr(1,7,…………………); // affichage de C pour Celsius
delay_ms(500); // attente de 500ms puis rafraichissement de l'affichage
end; // fin boucle
end. // fin programme
3-/ Bibliothèque d’un CAN :
*ADC_Init();
procedure ADC_Init();
Description -Initialiser le module ADC de PIC.
Exemple ADC_Init(); // Initialiser le module ADC
ADC_Read( )
function ADC_Read(channel : byte) : word;
- lire la tension analogique sur le channel et le convertir en une valeur numérique
Description
-initialiser le module et configurer le channel spécifié comme entrée.
var tmp : word; // tmp : valeur numérique de 0..1023
Exemple
tmp := ADC_Read(2); // Lire la valeur analogique sur canal 2 dans tmp
Microcontrôleur : Programmation en langage évolué : MikroPascal Page 13
4-/ Conversion d’un nombre en une chaine de caractère :
ByteToStr
procedure ByteToStr(nombre : byte; var chaine : array[3] of char);
Description Convertir un nombre en une chaine de caractères,
var N : byte;
txt : array[3] of char;
Exemple
N := 24;
ByteToStr(N, txt); // N = 24 = nombre , txt ="˽24" = 3 chaines de caractère
5-/ Autres procédures de conversion des données :
ByteToStr( ) ShortToStr( ) WordToStr( ) IntToStr ( ) LongIntToStr ( ) LongWordToStr( ) FloatToStr( )
byte(260) // égale à 4 Word(20,5) //arrondit à 20
IV-Modulation de largeur d’une impulsion : MLI ou PWM
Activité n° 7: Ventilateur sur un concentrateur USB
-Réaliser l’activité n°4, voir manuel d’activité pages : 94 et 97
1-/ Principe :
La PWM est un module intégré dans le PIC qui consiste à générer un signal carré de période constante mais à
rapport cyclique α variable. (C’est le principe d’un hacheur série)
2-/ Programmation en langage Mikropascal :
Programme Commentaires
program ACT7; // Programme
var // déclaration variable
alpha : byte; // rapport cyclique alpha
N : word; // nombre numérique ( 0 à 1023)
begin // début programme
PWM1_init(………); // initialiser le MLI à une fréquence 250Hz
ADCON1:=$80; // configuration du registre ADCON1
…………………………………; // démarrer le MLI
while true do // boucle infinie
begin // début boucle
N:= adc_read(……..); // convertir tension au canal RA0 en nombre N
alpha:=N/4;
// alpha =Nx255/1023 = N/4
PWM1_set_duty(alpha);
// fin boucle while
end;
// fin programme
end.
2-/ Bibliothèque d’un MLI :
*PWM1_Init( );
procedure PWM1_Init(const freq : longint);
Description -Initialise le module de PWM avec rapport cyclique 0.
- freq : une fréquence constante souhaitée de PWM en Hz (dépend de Fosc)
Exemple PWM1_Init(1000); // Initialiser PWM module at 1KHz:
Microcontrôleur : Programmation en langage évolué : MikroPascal Page 14
*PWM1_Start();
procedure PWM1_Start();
-Démarrer PWM.
Description -PIC possède un module CCP1.
-PWM1_Init doit être appelée avant d'utiliser cette routine.
Exemple PWM1_Start();
* PWM1_Set_Duty( );
procedure PWM1_Set_Duty(alpha : byte);
-alpha peut prendre des valeurs de 0 à 255.
Description
-PWM1_Init: doit être appelée avant cette routine.
Exemple -PWM1_Set_Duty(192); / / Mettre le rapport cycle à 75%:
3-/ Registre ADCON1 :
ADCON1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Microcontrôleur : Programmation en langage évolué : MikroPascal Page 15