Utilisation d'un afficheur 7 segments sans décodeur BCD
Schéma de câblage

La table de vérité
| C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 | Chiffre | Hexa |
| 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0x80 |
| 1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0xEC |
| 0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
2 |
0x42 |
| 0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
3 |
0x48 |
| 0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
4 |
0x2C |
| 0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
5 |
0x18 |
| 0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
6 |
0x30 |
| 1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
7 |
0xCC |
| 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
8 |
0x00 |
| 0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
9 |
0x0C |
| 0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
erreur |
0x7F |
Le programme
//Directives de préprocesseur
#include <16f876A.h>
#use delay(clock=4000000)
#fuses XT, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
//On associe une sortie à chaque entrée de l'afficheur 7 segments
#define a pin_C5
#define b pin_C4
#define c pin_C1
#define d pin_C2
#define e pin_C3
#define f pin_C6
#define g pin_C7
#define t1 pin_B0 //sortie pour le transistor
int i, H=0; //variables global
void SEG7(int H); //déclaration de la fonction SEG7
void main() //programme principal
{
while(1) //boucle infinie
{
output_low(t1); //on met à 0 la base du transistor
for(i=0; i<=10; i++) // tant que i est inférieur ou égal à 10 on l'incrémente
{
SEG7(i); //on copie la nouvelle valeur de i dans la fonction SEG7
delay_ms(500); //tout les 1/2 seconde
}
}
}
void SEG7(int H) //fonction SEG7
{
switch(H) //fonction de base du langage C, permet de faire un choix parmi toute les possibilité suivante
{
case 0: output_c(0x80); //si i=0 le port C prendra alors la valeur 0x80 (voir tableau)
break;
case 1: output_c(0xEC); //etc...
break;
case 2: output_c(0x42);
break;
case 3: output_c(0x48);
break;
case 4: output_c(0x2C);
break;
case 5: output_c(0x18);
break;
case 6: output_c(0x30);
break;
case 7: output_c(0xCC);
break;
case 8: output_c(0x00);
break;
case 9: output_c(0x0C);
break;
default:output_c(0x7F); //si autre chose que 0 à 9 on affiche ceci
}
}
Explications
Il s'agit ici d'un afficheur 7 segments à anode commune que l'on utilise sans décodeur BCD, une sortie du PIC est associé à une entrée de l'afficheur, et chaque entrée de l'afficheur correspond à un segments. Une fois que l'on sait à quel lettre correspond quel segment il est très facile de piloté un afficheur 7 segments. Le transistor est la pour fournir suffisamment de courant à l'afficheur pour qu'il s'allume dans de bonnes conditions (une sortie de PIC ne fournis pas beaucoup de courant, en tout cas pas suffisamment pour allumer 7 LED d'un coup).
Pour ce qui est du programme, ici on gère 7 sortie pour l'afficheur et 1 pour le transistor. 7 sorties à utilisés quasi simultanément, ça serrais plutôt lourd à programmer et surtout lourd pour la mémoire du PIC. Par exemple pour le chiffre 0 on aurais:
output_high(pin_c7);
output_low(pin_c6);
output_low(pin_c5);
output_low(pin_c4);
output_low(pin_c3);
output_low(pin_c2);
output_low(pin_c1);
Et il faudrait répété cette opération 9 fois pour les autres états de l'afficheur... La fonction output_c() nous permet donc de limité largement les dégâts en réduisant le code précédent à une seul et unique ligne: output_c(0x80) ou 80 est le nombre hexadécimal correspondant à l'état des sorties permettant d'afficher un 0.
Le programme principal quand à lui affiche les nombres 0 à 9 ainsi qu'un code erreur à l'infini.
Le dossier
Je met à vôtre disposition un dossier compresser avec:
- Le fichier source en .C
- Tout les fichiers généré lors de la compilation (notamment le .hex utile à la simulation ou pour envoyer dans le PIC)
- Le fichier de schéma fait sur proteus
- La même capture d'écran qu'au dessus (pour le schéma de câblage)
- Et la table de vérité sous excel
sans_bcd.rar
N'hésitez pas à poser vos questions via le forum!
Sugi
|