Académique Documents
Professionnel Documents
Culture Documents
Pic Bouton Led
Pic Bouton Led
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.
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.
forever loop
Toutes le instruction qui se trouve entre "forever loop" et "end loop" seront executes cycliquement
temps que le PIC est sous tension.
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)
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.
;@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.
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
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.
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"
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..."
6
Apprendre programmer un PIC
;@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
;@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...