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
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.