Heure sur afficheur 7 segments [gcc]

Contenu du snippet

Ce programme permet de faire afficher l'heure courante caractère par caractère sur un afficheur 7 segments connecté au port // de votre ordinateur.

Ce programme est fait pour Linux, mais il est facilement portable sur windows en remplacant quelques fonctions comme outb par outp (ne pas oublier d'inverser les paramètres ... )

Source / Exemple :


/*
	Code par Funcky
	Dernière modification : 26/02/04

  • /
/* Principe de fonctionnement du port // : Lorsque l'on envoie une donnée sur le port, une tensie de 5V (théorique) est appliqué entre les bornes activés et la masse ( broche 25 ) Le bus est un bus de 8 bit, les broches correspondant à ce bus sont les broches 2 (poid faible) à 9 (poid fort) Pour envoyer une donnée, il faut envoyer un séquence sur le bus de controle spécifant que l'on veut le paramétrer en sortie. Et ensuite envoyer l'octet sur le bus de données.
  • /
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <asm/io.h> #include <time.h> #define DATA 0x378 // Adresse du bus de données #define CONTROL 0x37A // Adresse du bus de controle void affiche (char heure[5]); void date (); int convertir (char source); void date () { struct tm * gm_date; time_t secondes; char heure[5]; time (&secondes); //recuperation du l'heure en sec gm_date = localtime (&secondes); // Conversion dans la structure sprintf (heure, "%02dH%02d", gm_date->tm_hour, gm_date->tm_min ); // conversion en chaine de car affiche (heure); } int convertir (char source) { switch (source) // Cette fonction permet de convertir un char en son code binaire correspondant { // a envoyer sur le port // pour allumer les leds de l'afficheur case '0' : return 63; case '1' : return 6; case '2' : return 91; case '3' : return 79; case '4' : return 102; case '5' : return 109; case '6' : return 125; case '7' : return 7; case '8' : return 127; case '9' : return 111; case 'H' : return 118; default : return 248; } } void affiche (char heure[5]) { int i; unsigned char bin; if (ioperm(DATA, 3, 1)) {perror("ioperm"); exit(1);} // Ouverture des autorisation sur les if (ioperm(CONTROL, 3, 1)) {perror("ioperm"); exit(1);} // ports qui nous interesse // Doit se faire en ROOT bin = 0; outb(0x00, CONTROL); //On place le bus de données en sortie outb (bin,DATA); //On envoie le code binaire. for (i = 0; i < 5; i++) // Boucle sur la chaie pour afficher tout les char { bin = convertir (heure[i]); outb(0x00, CONTROL); outb (bin,DATA); sleep (1); if (heure[i] != 'H') { bin += 128; outb(0x00, CONTROL); outb (bin,DATA); sleep (1); } } for (i = 0; i < 5; i++) // Une petite boucle pour faire clignoter { // la barre centrale. bin = 0; outb(0x00, CONTROL); outb (bin,DATA); sleep (1); bin = 64; outb(0x00, CONTROL); outb (bin,DATA); sleep (1); } bin = 0; // Extinction de toutes les LEDS outb(0x00, CONTROL); outb (bin,DATA); } main (void) { int pid; //le numéro de processus if (pid=fork()) // Création du process, dans le else, le processus lancé. { printf("Démon créé, taper \"kill %d\" pour le détruire\n",pid); } else { while (1) { date(); } } }

Conclusion :


Pour la connection matérielle, rien de plus simple, il vous suffit d'un connecteur male de 25 broches, de 8 résistance de 220 Ohms, 1/4 W et d'un afficheur 7 segments cathode commune.

Connectez la borne 25 sur la cathode, les bornes des segments :

2 => a
3 => b
...
9 => h

A
F B
G
E C
D

Et H pour le point.

Dans le cas d'un afficheur standard les broches pattes sont :

en haut : G F cath A B

en bas : E D rien C H

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.