# Utiliser les PIC 16F et 18F/Exercices/Les ports et le langage C
## Exercice 1

Pour vérifier la bonne compréhension de ce qui a été dit sur les bits (et le MikroC), nous donnons le fichier d'entête des bits correspondant au registre INTCON.
1°) Dessiner le registre correspondant
2°) En utilisant les masques du TD précédent, écrire les instructions C permettant :
* mise à 1 de GIE
* mise à 0 de INTE.
* tester si T0IE est à 1
* tester si T0IF est à 0
3°) Refaire le même travail en utilisant les noms des bits directement.

## Exercice 2

Nous allons essayer de dimentionner R1 dans les montages ci-dessus. 1°) Une led rouge (Kingbright λ = 627 nm 15mcd à 10 mA VD = 1,95 V) est montée comme à gauche sur le bit b0 du PORTB d'un 16F84. À l'aide du modèle de Thévenin du PORT, on vous demande d'évaluer la résistance R1 à mettre pour avoir un courant ne dépassant pas 5 mA.
2°) Une led verte (Kingbright λ=565 nm 12mcd à 10 mA VD = 2,09 V) est montée comme sur le schéma de gauche (sur le bit b2 du PORTB). Calculer R1 sans prendre l'approximation de Rth pour avoir un courant qui ne dépasse pas les 4 mA.
3°) On désire commander deux leds rouge en série. Faire le schéma et dimensionner correctement la résistance.

## Exercice 3

On connecte deux interrupteurs comme indiqué dans la partie gauche sans utiliser de résistance pull-up interne. Les deux LEDs de l'exercice 1 sont elles aussi connectées.
1°) On désire écrire un programme C qui ne fait rien si on n'appuie sur aucun bouton poussoir, fait clignoter la LED rouge si l’on appuie sur un bouton, fait clignoter la led verte si on appuie sur l'autre bouton, et les deux LEDs si l’on appuie sur les deux boutons.
1-a) Donner les 4 valeurs possibles de la variable interrupteurs avec l'instruction
1-b) Compléter alors le programme :
2°) Peut-on modifier facilement le programme pour que les deux LEDs fonctionnent à deux fréquences différentes ?

## Exercice 4

On désire réaliser un dé comme indiqué sur le schéma plus loin.
1°) Calculer les six valeurs prédéfinies pour allumer correctement le dé et les ranger dans un tableau si la première case du tableau éteint tout. Quel est l’affichage du dé correspondant à :
2°) Écrire un programme complet qui affiche les 6 valeurs du dé avec un délai d'attente de 3s utilisant la fonction "Delay_ms" de la librairie MikroC.
3°) On désire maintenant générer de manière aléatoire le score affiché sur le dé. Pour cela on vous propose d’utiliser la fonction ci-dessous.
3-a) Calculer la première valeur de cette fonction si Lim=6.
3-b) Écrire le programme général qui génère les valeurs du dé de manière aléatoire dès l'appui du bouton poussoir (attente de 0,3s pour éviter les rebonds).
4°) Proposer un schéma pour réaliser deux dés en utilisant un seul PORT de sortie sur 8 bits. Écrire le programme correspondant. L'astuce consiste à regrouper les leds qui s'allument ensembles (pour un dé) sur un même bit du PORT : il faut ainsi 4 bits par dé.

## Exercice 5
### Interfaçage d'un clavier 12 touches

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.
Question 1 : 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
Question 2 : 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
Question 3 : détermination du caractère
À 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 '#'
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.
Le schéma indique que l'appui d'une touche fait un contact entre un fil horizontal et un fil vertical.
Question 1 : on met alors tous les fils verticaux à 0 (3 bits de poids faible du PORTB) et on cherche sur quelle touche on a appuyé en cherchant où est le 0 ? Cela nous donnera une colonne.
Question 2 : on met alors tous les fils horizontaux à 0 (4 bits p6...p3 du PORTB) et on cherche sur quelle touche on a appuyé en cherchant où est le 0 ? Cela nous donnera la ligne.
Question 3 : la conversion ligne colonne vers caractère paut se faire avec un simple tableau 2 dimensions comme suit :
On fait une attente de touche qui ne permet pas de faire autre chose !!! Il est naturellement possible de ne pas enfermer les "lecture_colonne" et "lecture_ligne" dans un boucle. Cette façon de faire est laissée au lecteur.

## Exercice 6 (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 programme suivant :
Compléter la suite des états de ce chenillard (ceux où une ou plusieurs leds sont allumées).
* 11000011 (avec i = 0)
* 01100110 (avec i = 1)
* 00111100 (avec i = 2)
* 00011000 (avec i = 3)
* 00111100 (avec i = 4)
* 01100110 (avec i = 5)
* 11000011 retour au début (avec i = 0)
* 01100110 (avec i = 1)
* 00111100 (avec i = 2)
| Introduction au langage C | Le Timer0 des 16FXXX et le langage C |