#include <stdlib.h>
#include <stdint.h> // pour uint8_t et uint32_t
#include <string.h> // pour memset
#include <math.h> // pour pow
#include <stdio.h>
// teste si le flag 'flag' est à 1 dans la combinaison de flags 'combi'
#define FLAG(combi, flag) ( ((combi) & (flag)) == (flag) )
#define SEG_a 1
#define SEG_b 2
#define SEG_c 4
#define SEG_d 8
#define SEG_e 16
#define SEG_f 32
#define SEG_g 64
// affiche un segment vertical (|) ou horizontal (_)
// si son flag est à 1 dans combi,
// sinon affiche un espace ( )
#define PRINTHSEG(combi, segFlag) do{ \
if(FLAG(combi, segFlag)) \
printf("_"); \
else \
printf(" "); \
} while(0)
#define PRINTVSEG(combi, segFlag) do{ \
if(FLAG(combi, segFlag)) \
printf("|"); \
else \
printf(" "); \
} while(0)
void zLCD(uint32_t x) {
int8_t* o; // tableau de combis de flags (int8_t) indiquant pour chaque chiffre
// (un int8_t correspondant à un chiffre) si tel
// segment est allumé ou pas (cf les defines)
uint32_t i;
uint32_t size; // nombre de chiffres (en écriture décimale) composant le nombre x
uint32_t chiffre;
for(size=1 ; (int)(x/pow(10,size))>0 ; size++); // calcul de size
o= calloc(size, sizeof(uint8_t));
for(i=0 ; i<size ; i++) {
chiffre= x / pow(10,size-i-1); // tronque les chiffres à droite de celui qui nous intéresse
chiffre= chiffre - (chiffre/10)*10; // tronque les chiffres à gauche de celui qui nous intéresse
switch(chiffre) {
case 0:
o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_e | SEG_f;
break;
case 1:
o[i]= SEG_b | SEG_c;
break;
case 2:
o[i]= SEG_a | SEG_b | SEG_d | SEG_e | SEG_g;
break;
case 3:
o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_g;
break;
case 4:
o[i]= SEG_b | SEG_c | SEG_f | SEG_g;
break;
case 5:
o[i]= SEG_a | SEG_c | SEG_d | SEG_f | SEG_g;
break;
case 6:
o[i]= SEG_a | SEG_c | SEG_d | SEG_e | SEG_f | SEG_g;
break;
case 7:
o[i]= SEG_a | SEG_b | SEG_c;
break;
case 8:
o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_e | SEG_f | SEG_g;
break;
case 9:
o[i]= SEG_a | SEG_b | SEG_c | SEG_d | SEG_f | SEG_g;
break;
default: break;
}
}
printf("\n");
for(i=0 ; i<size ; i++) {
printf(" ");
PRINTHSEG(o[i], SEG_a);
printf(" ");
}
printf("\n");
for(i=0 ; i<size ; i++) {
PRINTVSEG(o[i], SEG_f);
PRINTHSEG(o[i], SEG_g);
PRINTVSEG(o[i], SEG_b);
printf(" ");
}
printf("\n");
for(i=0 ; i<size ; i++) {
PRINTVSEG(o[i], SEG_e);
PRINTHSEG(o[i], SEG_d);
PRINTVSEG(o[i], SEG_c);
printf(" ");
}
printf("\n");
free(o);
}
Je ne suis pas très fier de mes 4 boucles for identiques, mais je ne vois pas trop comment faire autrement...
J'ai fais un long switch pour que ce soit clair, mais je peux facilement simplifier en remplaçant tous les SEG_a | SEG_b | ... par leur résultat, puis en mettant ces résultats dans un tableau de 10 cases (1 par chiffre) et en remplaçant le switch par : o[i]=tableauValeurs[chiffre];
J'ai fais le main à l'arrache. Il est fais de telle sorte qu'on puissse appeler le programme en console ainsi : zLCD 834 397
Il affichera alors tous les chiffres passés en paramètre.
On peut aussi faire ceci : zLCD 20 - 30
Il affichera alors tous les chiffres entre 20 et 30.
On peut combiner ces 2 possibilités : zLCD 36 564 0 - 15
Sans paramètres, il affiche 1234567890.
bon un sujet qui commence à dater mais je l'ai trouvé cool. Je poste ma solution
main.c
#include <stdio.h>
#include <stdlib.h>
#include "constante.h"
#include "affichage.h"
//on definit le nombres à afficher ainsi que sa taille
int LE_NOMBRE =78521;
int tAILLE =5;
int main(int argc, char const *argv[])
{
Nombresegment * nb_segmente=malloc(tAILLE*sizeof(Nombresegment));
int * contenu=malloc(tAILLE*sizeof(int));
int J,k,passage=1;
char ligne=1;
decomposer(LE_NOMBRE,tAILLE,contenu);
for ( J = 0; J < tAILLE; ++J)
{
nb_segmente[J]=affecter_valeur_segment(contenu[J]);
//printf("J=%d\n",contenu[J]);
}
while(ligne<6) //affiche chaque niveau du segment , niveau 1 = a ,niveau 2=b et f ,niv3=g ,niv 4=c et e,niveau 5 = d
{
while(passage<=2) //permet d'afficher les segments dans le bon ordre et de respecter les sauts de lignes
{
if(ligne==1 || ligne==3 || ligne==5) //on n'affiche une seule barre pour l'affichage horizontale
{
for(k=0;k<tAILLE;k++)
{
afficher_nb(nb_segmente[k],ligne,passage);
}
passage=3;
}else //on affiche verticalement donc besoin de sauter des lignes et de double afficher la barre horizontale
{
for(k=0;k<tAILLE;k++)
{
afficher_nb(nb_segmente[k],ligne,passage);
}
printf("\n");
passage++;
}
}
if (ligne==1 ||ligne == 3 || ligne == 5) // saut de ligne pour passer au niveau suivant d'affichage(ie :ligne 2 ou 3 ...)
{
printf("\n");
}
ligne++;
passage=1;
//printf("\n");
}
return 0;
}
#ifndef CONSTANTE
#define CONSTANTE
#include <stdio.h>
#include <stdlib.h>
typedef struct Nombresegment Nombresegment;
struct Nombresegment //representation du segment
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
};
#endif
#ifndef AFFICHAGE
#define AFFICHAGE
#include <stdio.h>
#include <stdlib.h>
#include "constante.h"
#include <math.h>
void decomposer(int nb_a_decomposer,int taille, int *tab_sortie ); //decompose le nombre et range ses valeurs dans un tableau
Nombresegment affecter_valeur_segment(int nb) ; //Se charge d'affecter à chaque chiffre le nombre de segment qui doivent etre allumer
void afficher_nb(Nombresegment B,char lettre,int passage); //affiche le nombre
#endif
Une petite capture du resultat. Le main est vraiment mal foutu car je l'ai fait à l'arrache . On defint au debut du pr le nombre et et la taille du nombre à afficher,je l'ai un peu bidouillé pour que l'affichage se passe bien , donc niveau lisibilité du code,c'est pas enorme
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.