Vous êtes sur la page 1sur 9

Apprendre programmer un PIC

Partie II - Boutons et LED


Historique des versions
Version 1.0 16.11.2007 oca

Table des matires


Introduction ............................................................................................................2
Faire clignoter une LED ............................................................................................ 2
Allumer et teindre une LED avec deux boutons ............................................................ 5
Allumer et teindre une LED avec un bouton ON/OFF .................................................... 7

1
Introduction
Dans cette partie, nous allons nous familiariser avec la programmation. En utilisant des boutons et
des LEDs. Bien sr, il existe des solutions plus simples que les PIC pour jouer avec des boutons et
des LED, mais ceci nous permettra d'assimiler quelques bases avant de passer des notions plus in-
teressantes des PIC.

Faire clignoter une LED


Lorsque l'on apprend un langage informatique, On commence souvent par crire un programme qui
consiste a afficher "Hello World". Avec la pluspart des langages comme le C, c'est trs simple, mais
avec un PIC, afficher "Hello World" n'est pas vident puisque l'on a pas d'cran pour le moment...
j'ai bien dit pour le moment ;)

Nous allons donc faire plus simple, et commencer par faire clignoter une LED. Voici tout de suite le
programme...

include 16f877_bert
pin_B0_direction = output
forever loop
pin_b0 = on
delay_1s(1)
pin_b0 = off
delay_1s(1)
end loop

Passons sur la premire ligne "include 16f877_bert" qui initialise juste deux trois choses pour nous
et regardons directement la seconde ligne :

pin_B0_direction = output

Un PIC possde plusieurs pin, qui peuvent servir d'entre ou de sortie. Dans ce programme nous al-
lons utiliser un pin nomme "b0" comme une sortie, c'est a dire que nous allons faire varier la ten-
sion sur cette pin ce qui allumera notre LED.

Nous avons ensuite la ligne :

forever loop

Toutes le instruction qui se trouve entre "forever loop" et "end loop" seront executes cycliquement
temps que le PIC est sous tension.

La ligne suivante est

pin_b0 = on

qui met une tension (celle d'alimentation) sur la sortie B0 (et donc cela allume la LED.

delay_1s(1)

Cette ligne permet d'attendre une seconde sans rein faire... sinon la LED clignoterait trop vite !

pin_b0 = off

2
Apprendre programmer un PIC

On teint la LED

delay_1s(1)

Et on attend nouveau une seconde avant de recommencer au debut de la boucle...

Voici un petit schma de principe (sans la partie alimentation et sans le clock).

Figure 1. Un PIC et une LED sur la pin B0

Le programme peut tre test avec le simulateur "PICShell". afin que PICShell puisse dessiner la
LED, Il faut ajouter la ligne ";@led_red pin_b0" qui ne modifie pas le programme, mais qui indique
a PICShell qu'une led rouge se trouve sur la pin B0

Il faut galement ajouter la ligne suivante : ";@use_virtual_delay" qui indique a PICShell que le
temps d'attente est simul. Sans cette ligne, PICShell n'arrive pas a simuler l'instruction "de-
lay_1s(1)" ass rapidement.

Voici donc le programme complet tester dans PICShell :

;@use_virtual_delay
include 16f877_bert
;@led_red pin_b0
pin_B0_direction = output
forever loop
pin_b0 = on
delay_1s(1)
pin_b0 = off
delay_1s(1)
end loop

3
Partie II - Boutons et LED

Et voici une image du resultat, avec la petite led rouge dans le carr en bas droite.

Figure 2. Un PIC et une LED sur la pin B0

4
Allumer et teindre une LED avec deux boutons
Le programme suivant utilise deux boutons et une led. Le premier bouton allume la led. Le
deuxime bouton teint la led.

Le premier bouton se trouve sur la pin_c0, configure come une entre Le deuxime bouton se
trouve sur la pin_c1, configure come une entre La led se trouve sur la pin B0 configure comme
une sortie

Voici le shma de principe

Figure 3. Deux boutons, un PIC et une LED

Et voici le code du programme:

include 16f877_bert
;@led_red pin_b0
;@mpd but_on pin_c0
;@mpd but_off pin_c1
pin_B0_direction = output
pin_C0_direction = input
pin_C1_direction = input
pin_b0 = off
forever loop
if pin_c0 == on then
pin_b0 = on
end if
if pin_c1 == on then
pin_b0 = off
end if
end loop

Ce programme utilise une nouvelle annotation : ";@mpd". Elle ne change rien au fonctionnement du
programme, mais elle indique au simulateur PICShell qu'il y a un bouton traiter.

Attention, il existe plusieurs sorte de bouton...

"mpd" veut dire : Momentary Pull Down

5
Un bouton momentan est un bouton qui ne garde pas son tat (il revient sa position initiale
lorsque l'on arrte de presser dessus...)

Le Pull Down est un systme qui comporte un bouton et une rsistance, qui va appliquer une tension
de 0V lorsque l'on ne presse pas sur le button, et de VCC (5V par ex.) lorsque l'on presse dessus.
Voici le schma d'un "Momentary Pull Down"

Figure 4. Le Momentary Pull-Down

On utilise l'instruction "if" pour tester si un bouton est press. "if pin_c0 == high then" veut dire : "si
la pin C0 est "on" alors..."

Notre programme pourrait donc tre traduit par :

si la pin c0 est "on" alors


allume la led qui est sur la pin b0
si la pin c1 est "on" alors
teint la led qui est sur la pin b0

6
Apprendre programmer un PIC

Allumer et teindre une LED avec un bouton ON/OFF


Le plus simple est d'utiliser un interrupteur "permanent", comme ceci :

Figure 5. Un interrupteur "permanent" de type "Pull-Down"

Avec le code suivant :

;@no_debug_all
include 16f877_bert
;@led_red pin_c1
;@ppd button pin_c0
pin_C0_direction = input
pin_C1_direction = output
forever loop
if pin_c0==high then
pin_c1 = high
else
pin_c1 = low
end if
end loop

Que l'on peut mme simplifier de la manire suivante, puisque dans ce programme, la pin_c1 et
pin_c0 ont toujours le mme tat (high ou low)

;@no_debug_all
include 16f877_bert
;@led_red pin_c1
;@ppd button pin_c0
pin_C0_direction = input
pin_C1_direction = output
forever loop
pin_c1 = pin_c0
end loop

Dans ce cas, l'utilisation d'un bouton "permant" simplifie bien les choses... car il garde lui mme
"mchaniquement" son tat. Dans certains cas, les boutons permanents peuvent cependant poser
problmes, Par exemple dans le cas ou l'on voudrait avoir un bouton "reset" qui teint la led...

Voici donc comment faire un ON/OFF avec un bouton momentan, qui lui ne garde pas son tat.

7
Partie II - Boutons et LED

Figure 6. Un interrupteur "momentan" de type "Pull-Down"

;@no_debug_all
include 16f877_bert
;@led_red pin_c1
;@mpd button pin_c0
pin_C0_direction = input
pin_C1_direction = output
pin_c1 = low
forever loop
if pin_c0 == high then
if pin_c1 == high then
pin_c1 = low
else
pin_c1 = high
end if
while pin_c0==high loop end loop
end if
end loop

On a donc deux tests "if" l'un dans l'autre... le premier test nous permet de savoir si on a press sur
le bouton, le deuxime test regarde si la led est allumer au moment ou teinte, de faon pouvoir in-
verser son tat (l'teindre si elle tait allumer, et l'allumer si elle tait teinte...).

On peut galement simplifier ce programme, car JAL propose le signe "!" qui permet justement
d'inverser un tat...

;@no_debug_all
include 16f877_bert
;@led_red pin_c1
;@mpd button pin_c0
pin_C0_direction = input
pin_C1_direction = output
pin_c1 = low
forever loop
if pin_c0 == high then
pin_c1 = ! pin_c1
while pin_c0==high loop end loop
end if
end loop

8
La ligne "pin_c1 = ! pin_c1" sert mettre la pin c1 dans l'tat inverse de son tat actuel.

Regardons maintenant cette drle de ligne "while pin_c0==high loop end loop"... Elle sert attendre
que l'on relache le bouton. Si on ne met pas cette ligne, la led va clignoter trs vite lorsque l'on laisse
le bouton press...pire, l'tat de led va tre difficle prevoir lorsque l'on relache le bouton...La diffi-
cult, c'est de garder en tte que nous sommes dans une boucle (forever loop)... Finalement le
mieux, c'est encore d'essayer... Faites un petit test dans PICShell en supprimant cette ligne "while
pin_c0==high loop end loop" et vous verrez le problme...

On est bien d'accord, l'utilisation d'un bouton momentan est un peu plus compliqu que l'utilisation
d'un bouton permanent... mais cela l'avantage d'avoir "toute la logique au mme endroit, dans le
PIC.". Dans des programme plus complet, l'utilisation de bouton momentan devient vraiment un
plus...

Vous aimerez peut-être aussi