Utilisation d'un afficheur 7 segments avec décodeur BCD
Intro
Lorsque l'on ne possède pas de gros PIC avec beaucoup d'E/S comme les 16F877 par exemple, et que l'on à besoin d'utiliser un afficheur 7 segments, on fait appel à un décodeur BCD. En gros le décodeur BCD permet de ce passer de la moitié des E/S normalement utilisé par un afficheur, soit 4 E/S de libérer. Voici un lien vers la Datasheet du décodeur que j'utilise dans cet exemple: 74LS47. Ainsi vous comprendrez mieux son fonctionnement.
Schéma de câblage

La table de vérité
| A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | Chiffre | hexa |
| 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0x00 |
| 0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0x01 |
| 0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
2 |
0x02 |
| 0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
3 |
0x03 |
| 0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
4 |
0x04 |
| 0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
5 |
0x05 |
| 0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
6 |
0x06 |
| 0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
7 |
0x07 |
| 0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
8 |
0x08 |
| 0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
9 |
0x09 |
| 0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
erreur |
0x0A |
Une table bien plus simple que sans BCD non?
Un premier programme
#include <16f628A.h> //comme d'ab
#use delay(clock=20000000) //comme d'ab
#fuses HS, NOWDT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD //comme d'ab
#define A pin_A0 // pin A BCD
#define B pin_A1 // pin B BCD
#define C pin_A2 // pin C BCD
#define D pin_A3 // pin D BCD
#define T1 pin_B0 // base transistor 1
int i, H=0;
void SEG7(int H);
void main()
{
while(1)
{
output_low(T1);
for(i=0; i<=10; i++)
{
SEG7(i);
delay_ms(500);
}
}
}
void SEG7(int H)
{
switch(H)
{
case 0: output_low(D);
output_low(C);
output_low(B);
output_low(A);
break;
case 1: output_low(D);
output_low(C);
output_low(B);
output_high(A);
break;
case 2: output_low(D);
output_low(C);
output_high(B);
output_low(A);
break;
case 3: output_low(D);
output_low(C);
output_high(B);
output_high(A);
break;
case 4: output_low(D);
output_high(C);
output_low(B);
output_low(A);
break;
case 5: output_low(D);
output_high(C);
output_low(B);
output_high(A);
break;
case 6: output_low(D);
output_high(C);
output_high(B);
output_low(A);
break;
case 7: output_low(D);
output_high(C);
output_high(B);
output_high(A);
break;
case 8: output_high(D);
output_low(C);
output_low(B);
output_low(A);
break;
case 9: output_high(D);
output_low(C);
output_low(B);
output_high(A);
break;
default:output_high(D);
output_low(C);
output_high(B);
output_low(A);
}
}
Un deuxième programme
#include <16f628A.h> //comme d'ab
#use delay(clock=20000000) //comme d'ab
#fuses HS, NOWDT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD //comme d'ab
#define A pin_A0 // pin A BCD
#define B pin_A1 // pin B BCD
#define C pin_A2 // pin C BCD
#define D pin_A3 // pin D BCD
#define T1 pin_B0 // base transistor 1
int i, H=0;
void SEG7(int H);
void main()
{
while(1)
{
output_low(T1);
for(i=0; i<=10; i++)
{
SEG7(i);
delay_ms(500);
}
}
}
void SEG7(int H)
{
switch(H)
{
case 0: output_a(0x00);
break;
case 1: output_a(0x01);
break;
case 2: output_a(0x02);
break;
case 3: output_a(0x03);
break;
case 4: output_a(0x04);
break;
case 5: output_a(0x05);
break;
case 6: output_a(0x06);
break;
case 7: output_a(0x07);
break;
case 8: output_a(0x08);
break;
case 9: output_a(0x09);
break;
default:output_a(0x0A);
}
}
Explications
Bien, grâce au décodeur BCD la table de vérité et le programme sont beaucoup plus simple. Je n'ai pas commenter ce code tout simplement car il fait exactement la même chose que le code sans décodeur BCD, simplement il y a 4 E/S de moins à géré. Le premier programme est un exemple de ce que donnerais le code si on utilisais juste les fonction output_low() et output_high(), soit 40 ligne rien que pour la fonction SEG7. Le second, vous l'aurez compris nous montre l'intérêt de la fonction output_x() dans ce programme. Pour le reste il s'agit de la même chose que le programme sans décodeur BCD.
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
avec_bcd.rar
Bonne visite
Sugi
|