bjs | Bonjour,
je fais une conversion entier vers binaire (l'entier doit avoir valeur entre 0 et 255) et je veux récuperer ça dans une autre fonction pour l'envoyer au lcd. je voudrais récuperer le resultat de la conversion dans un tableau de char.
voici le code ça marche sauf pour conversion et envoi au lcd (ç'est incomplet)
Code :
- #include <conio.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<Windows.h>
- #define PA 0// on met en entree à 1 (PA pour Data)
- #define PB 1//en sortie à 0 inutilisé
- #define PC 2//pcl en sortie et pch en sortie ? (PC1 pour R/W) et (PC2 pour RS)
- void _stdcall set8255cw(unsigned char cw_byte);
- unsigned char _stdcall read8255(unsigned char PortNumber);
- void _stdcall write8255(unsigned char PortNumber,unsigned char Value);
- void _stdcall init_lcd();
- unsigned char _stdcall check_busy_byte();
- void menus();
- void commandeLCD(int booleen,unsigned char adresse);
- void envoichaine();
- void decalage();
- char* affBin(int decimal);//fonction pour conversion decimal vers binaire
- //PC0 pour E *** PC1 pour R/W *** PC2 pour RS *** PA pour Data
- //cycle d'écriture: RS à 0 instruction/1data, R/W à 0 ecriture(R/W à 1 lecture), mettre E à 1, écrire la data, mettre E à 0
- void main()
- {
- set8255cw(0x8A); //1000 1010
- printf("\nInitialisation du LCD : Appuyez sur une touche enter" );
- init_lcd();//appuyer sur enter pour sortir de la fonction
- commandeLCD(0,0x01);//efface l'ecran 1er paramètre =0 car instruction et deuxième paramètre ==1 car envoi du byte 1 dans cours sur PA
- //est ce necessaire après initlcd de faire effacer ecran ??? si on met sur la ligne 1 colonne 1 alor ça efface l'ecran ????commandeLCD(0,0x80);
- menus();
- }
- void menus()
- {
- char Menu;
- short choix=1;
- do
- {
- printf("____________________________________\n" );
- printf("1) Afficher Chaine (1er ligne)\n" );
- printf("2) Afficher Chaine (2eme ligne)\n" );
- printf("3) Decalage \n" );
- printf("4) Conversion decimal vers binaire\n" );
- printf("5) Quitter" );
- printf("____________________________________\n" );
- fflush(stdin);
- scanf_s("%d",&Menu);
- switch(Menu)
- {
- case 1 :
- commandeLCD(0,0x80);
- envoichaine();
- break;
- case 2 :
- commandeLCD(0,0xC0);
- envoichaine();
- break;
- case 3 :
- decalage();
- break;
- case 4:
- break;
- case 5 :
- choix=0;
- break;
- }
- }while(choix!=0);
- }
- // void commandeLCD >>>> choix de instruction ou data via booleen en paramètre et ensuite cycle d'ecriture
- void commandeLCD(int booleen,unsigned char adresse)//booleen == 0 alors instruc sinon data alors 1 dans booleen ***** adresse pour 1 effacer lcd ou 0x80 pour première ligne ou deuxième ligne
- {
- //cycle d'écriture: RS à 0/1, R/W à 0, mettre E à 1, écrire la data, mettre E à 0
- unsigned char busy_byte;
- unsigned char PC2Byte;
- do{
- busy_byte=check_busy_byte();
- busy_byte&=0x80;
- }while(busy_byte!=0);
- if( booleen ==0)// selon qu'on fait une instruction ou data donc si ==0 alors instruction
- {
- PC2Byte=read8255(PC);
- PC2Byte=PC2Byte & 0xFB;//mise à 0 de RS (PC2) donc instruction 0xFB 11111011
- write8255(PC, PC2Byte);
- }
- else
- {
- if(booleen == 1)// selon qu'on fait une instruction ou data
- {
- PC2Byte=read8255(PC);
- PC2Byte=PC2Byte | 0x04;//mise à 1 de RS (PC2) ça veut dire envoi d'une donnée et non pas une instruction
- write8255(PC, PC2Byte);
- }
- }
- PC2Byte=read8255(PC);
- PC2Byte = PC2Byte & 0xFD; //Mise à 0 de R/W (PC1) donc ecriture
- write8255(PC, PC2Byte);
- PC2Byte=read8255(PC);
- PC2Byte = PC2Byte | 0x01; //Mise à 1 de E (PC0) sans changer les autres bits>> demarre l'ecriture
- write8255(PC, PC2Byte);
- //écriture de la donnée
- write8255(PA, adresse);//adresse==1 OU 0x80 OU deuxième ligne OU *chaine pour envoi de caractères
- Sleep(1);
- PC2Byte=read8255(PC);
- PC2Byte = PC2Byte & 0xFE; //Mise à 0 de E (PC0) et les autres bits ne sont pas changés>>> envoi de l'ecriture
- write8255(PC, PC2Byte);
- }
- //write8255(PA,1);//après avoir mis rs à 0 voici l'instru pour effacer le lcd mettre à 1 le bit 1 de PA voir cours
- //write8255(PC, 0)//enable à 0 la donnee part (l'ecran est efface)
- // void envoichaine()>>>>>>> saisie d'une chaine de caractères et envoi sur l'ecran lcd
- //via l'appel de fonction commandeLCD qui a comme paramètres 1 (pour dire que ç'est une instruction) et chaine[i] envoi caract par caract
- void envoichaine()
- {
- char chaine[15];
- short i=0;
- short taille;
- printf("Saisir chaine : " );
- fflush(stdin);
- fgets(chaine,15,stdin);
- taille=strlen(chaine);
- chaine[taille+1]='\0';
-
- while (chaine[i]!=chaine[taille])
- {
- commandeLCD(1,chaine[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
- i++;
- }
- puts(chaine);
- }
- // void decalage() >>>>> choix de decalage via un menu par l'user de décalage à gauche(a) ou droite(b) puis saisie du nombre de decalage
- //à effectuer et puis appel à la fonction commandeLCD qui a comme paramètres 1(car ç'est data et pas instruction)
- void decalage()
- {
- char Menu;
- short choix=1;
- short nbldecalage;
- do
- {
- printf("____________________________________\n" );
- printf("a) Ecrire a pour Decalage droite\n" );
- printf("b) Ecrire b pour Decalage gauche\n" );
- printf("c) Quitter" );
- printf("____________________________________\n" );
- fflush(stdin);
- scanf("%s",&Menu);
- switch(Menu)
- {
- case 'a' ://droite decalage
- printf("\nEntrez le nombre de decalages : " );
- scanf("%d", &nbldecalage);
- for( int i=0; i<nbldecalage; i++ )
- {
- commandeLCD(1,0x1C); //00011R/L00 bit R/L à 1 si decalage 1 à droite(decalage du texte DDRAM) donc 00011100
- }
- break;
- case 'b'://gauche decalage
- printf("\nEntrez le nombre de decalages : " );
- scanf("%d", &nbldecalage);
- for( int i=0; i<nbldecalage; i++ )
- {
- commandeLCD(1, 0x18); //00011R/L00 bit R/L à 0 si decalage 1 à gauche(decalage du texte DDRAM) donc 00011000
- }
- break;
- case 'c' :
- choix=0;
- break;
- }
- }while(choix!=0);
- }
- /*convertir()
- // diviser le nombre decimal par 2 successivement et le reste de la division represente le nombre binaire
- division entière donc si y a un reste le bit à 1 sinon le bit à 0 puis inverser pour le lire le nombre binaire
- 44/2 >> division sans reste donc bit à 0
- 22/2 >> division sans reste donc bit à 0
- 11/2>> division avec reste donc bit à 1
- 5/2..... bit à 1
- 2/2 bit à 0
- 1/2 avec reste donc bit à 1
- lecture du nombre binaire à l'envers 00101100 ce qui vaut 44 en decimal*/
- char* affBin(int decimal)
- {
- char*chainebinaire=NULL;
- chainebinaire=(char*)malloc(8*sizeof*chainebinaire);
- int nbrdecimal;
- int i=0;
- puts("Entrez un nombre positif" );
- scanf("%d", &nbrdecimal);
- if (decimal != 0)//condition de sortie de la boucle fonction recursive
- {
- if (decimal > 1)//2ème condition de sortie de fonction recursive
- {
- affBin(decimal / 2);//verifie si divisible par 2 et si toujours supèrieur à 1 et
- // les valeurs successives de decimal sont mises sur la pile
- //printf("%d",decimal);
- }
- //printf("%d\n",decimal);
- printf("%d", decimal % 2);
- int i=0;
- while(i<8)
- {
- chainebinaire[i]=(decimal%2);
- sprintf(chainebinaire,((char*)(decimal%2)));
- //chainebinaire[i]=itoa(chainebinaire,decimal%2,2);
- i++;
- }
- //la division modulo d'un nombre vaut 0(chiffre pair) si pas de reste et 1(chiffre impaire) si y a un reste
- } // on va afficher directement le premier bit comme ça ç'est bien à l'envers et
- //ainsi de suite(on affiche les modulo des valeurs de decimal qui ont été mises sur la pile)
- else
- {
- printf("0" );
- for(int i=0;i<8;i++)
- {
- chainebinaire[i]='0';
- }
- }
- return &chainebinaire;
- }
- void envoichaine2()
- {
- short i=0;
- short taille;
- int size;
- char decim[25];
- int decim2;
- char chaine1[100]={"Entrez un nombre: "};
- char chaine2[100]={"decimal: "};
- char conversionbinaire[200];
- taille=strlen(chaine1);
- chaine1[taille+1]='\0';
- commandeLCD(0,0x80);//on se positionne sur la première ligne du lcd pour envoyer entrez un nombre
-
- while (chaine1[i]!=chaine1[taille])
- {
- commandeLCD(1,chaine1[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
- i++;
- }
- commandeLCD(0,0xC0);//on se place sur la deuxième ligne pour envoyer la phrase decimal:
- taille=strlen(chaine2);
- chaine2[taille+1]='\0';
- while (chaine2[i]!=chaine2[taille])
- {
- commandeLCD(1,chaine2[i]);//on envoie caractère tant qu'on n'est pas arrivé au caractère 0 de fin de chaine
- i++;
- }
- //saisie du nombre decim à convertir et envoi sur l'ecran lcd
- fflush(stdin);
- gets(decim);
- size=strlen(decim);
- //commandeLCD(0,0xC0);//je suis déjà sur la deuxième ligne ?? ça va ecrire à la suite de decimal:????
- i=0;
- do
- {
- commandeLCD(1,decim[i]);
- i++;
- }while (decim[i] !=decim[size]);
- strcpy( conversionbinaire,affBin(decim));
- /*size=strlen(conversionbinaire);
- i=0;
- do
- {
- commandeLCD(1,conversionbinaire[i]);
- i++;
- }while (conversionbinaire[i] !=conversionbinaire[size]);*/
- }
|
Message édité par bjs le 13-03-2017 à 22:12:18
|