« Utiliser les PIC 16F et 18F/Exercices/Les ports et le langage C » : différence entre les versions

Contenu supprimé Contenu ajouté
m Page créée avec « ==Exercice 4 (d'après les TPs)== Le PORTB est relié à un ensemble de LEDs permettant la réalisation de chenillards. Un chenillard est donné par le progr... »
 
Ligne 1 :
==Exercice 4 (d'après les TPs)1==
Interfaçage d'un clavier
 
Sur un PC, le clavier est complètement décodé. C'est à dire que lorsqu'une touche est appuyée, sa position sur le clavier est envoyée sur la liaison PS2. Le fait d'envoyer la position et non le code ASCII permet de gérer les claviers en divers langues.
 
Pour de petites applications, on utilise un clavier à 12 touches. Il est composé de simples contacts et le décodage est réalisé par le système informatique. Avec seulement 8 touches, un PORT de 8 bits en entrée suffit. Si le clavier possède plus de 8 touches, il faut:
* soit utiliser d'avantage d'entrées,
* soit multiplexer les entrées en deux étapes.
En utilisant 4 fils pour les lignes et 4 fils pour les colonnes, on peut différencier par croisement 16 touches. On utilise donc 8 fils reliés à 8 bits d'un PORT pour 16 touches. Pour nos 12 touches on peut câbler comme indiqué ci-dessus. Il s'agit ensuite de procéder en deux phases, une pour la détection de la colonne et une autre pour la détection de ligne.
<u>Question 1</u> : détermination du numéro de colonne
Programmer les directions avec '''TRISB''' (PB6-PB3 en sortie et PB2-PB0 en entrée).
 
Tester si une touche est appuyée. Si oui sauvegarder dans une variable la valeur lue sur '''PORTB''' puis transformer cette valeur en numéro de colonne (0 à gauche et 2 à droite)
 
Quel est le code correspondant : sous-programme char lecture_colonne()
 
<u>Question 2</u> : détermination du numéro de ligne
 
Programmer les directions avec '''TRISB''' (PB6-PB3 en entrée et PB2-PB0 en sortie).
 
Tester si une touche est appuyée. Si oui sauvegarder dans une variable la valeur lue sur PORTB puis transformer cette valeur en numéro de ligne (0 en haut et 3 en bas)
 
Quel est le code correspondant : sous-programme char lecture_ligne()
 
<u>Question 3</u> : détermination du caractère
 
A partir des deux informations précédentes transformer le numéro de colonne et le numéro de ligne en caractère correspondant sur le clavier : '1' ou '2' ou ... ou '0' ou '#'
{{Remarque|contenu=Les bits RB4-RB7 peuvent servir à déclencher une interruption (RB port change Interrupt). Si l'on veut utiliser cette interruption il faudrait câbler notre clavier autrement. Les interruptions seront abordées plus loin.}}
 
{{solution|contenu=
Question 1 :
<source lang="c">
// question 1 TD8
#define NOTAKEY 127
// colonne 0 à gauche
char lecture_colonne(){
char ch;
TRISB=0x07;
ch=PORTB & 0xO7;
switch (ch) {
case 3 : return 0;//a gauche
case 5 : return 1;// au milieu
case 6 : return 2;//a droite
// si autre cas pas de touche ou deux touches
default : return NOTAKEY;
}
}
</source>
}}
 
 
 
 
 
 
==Exercice 2 (d'après les TPs)==
Le PORTB est relié à un ensemble de LEDs permettant la réalisation de [[w:Chenillard|chenillards]]. Un chenillard est donné par le programme suivant :
<source lang="c">