mikrocontroller.net

Forum: Projekte & Code 32 Bit binär in BCD umwandeln


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liebe Gemeinde !

Hat jemand eine C Routine, welche eine 32 Bit binär- Zahl in BCD 
verwandelt ? Es sollten 6-8 BCD Zahlen herauskommen.

Schöne Grüße Josef

Autor: Martin #### (martin-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich habe diesen Code nicht getestet aber sollte funktionieren:
/*********************************************
 * 32bit zu 10Stellen BCD
 **********************************************/

#include <inttypes.h>

/*BCD Tabelle*/
#define BCD0 0x3f
#define BCD1 0x06
#define BCD2 0x5b
#define BCD3 0x4f
#define BCD4 0x66
#define BCD5 0x6d
#define BCD6 0x7d
#define BCD7 0x07
#define BCD8 0x7f
#define BCD9 0x6f

void ByteToBcd(unsigned char *byte);

void _32BitToBcd(uint32_t value, unsigned char *bcd)
{
    bcd[0] = value % 10;
    ByteToBcd(&bcd[0]);
    value=value/10;
  
    bcd[1] = value % 10;
    ByteToBcd(&bcd[1]);
    value=value/10;

    bcd[2] = value % 10;
    ByteToBcd(&bcd[2]);
    value=value/10;

    bcd[3] = value % 10;
    ByteToBcd(&bcd[3]);
    value=value/10;

    bcd[4] = value % 10;
    ByteToBcd(&bcd[4]);
    value=value/10;

    bcd[5] = value % 10;
    ByteToBcd(&bcd[5]);
    value=value/10;

    bcd[6] = value % 10;
    ByteToBcd(&bcd[6]);
    value=value/10;

    bcd[7] = value % 10;
    ByteToBcd(&bcd[7]);
    value=value/10;

    bcd[8] = value % 10;
    ByteToBcd(&bcd[8]);
    value=value/10;

    bcd[9] = value % 10;
    ByteToBcd(&bcd[9]);
    value=value/10;
}

void ByteToBcd(unsigned char *byte)
{
    if(*byte==0){*byte=BCD0;}
    else if(*byte==1){*byte=BCD1;}
    else if(*byte==2){*byte=BCD2;}
    else if(*byte==3){*byte=BCD3;}
    else if(*byte==4){*byte=BCD4;}
    else if(*byte==5){*byte=BCD5;}
    else if(*byte==6){*byte=BCD6;}
    else if(*byte==7){*byte=BCD7;}
    else if(*byte==8){*byte=BCD8;}
    else if(*byte==9){*byte=BCD9;}
}

In dieser Funktion:
void _32BitToBcd(uint32_t value, unsigned char *bcd)
ist
value : 32bit Zahl
bcd   : ein mindestens 10Byte grosses Array, in dem die Zahl als BCD 
abgeliegt wird, die erste Stelle im Arrays ist die 1er-Stelle der 
Dezimalzahl, die zweite Stelle ist die  10er-Stelle usw.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs nicht kontrolliert, aber ich denke mal
damit:

/*BCD Tabelle*/
#define BCD0 0x3f
#define BCD1 0x06
#define BCD2 0x5b
#define BCD3 0x4f
#define BCD4 0x66
#define BCD5 0x6d
#define BCD6 0x7d
#define BCD7 0x07
#define BCD8 0x7f
#define BCD9 0x6f

generierst du die Digits für ein 7-Segment Display.
Möglich das der OP das so brauchen kann, BCD ist aber
was anderes. BCD hat in jedem Nibble (oder Byte) einen
Binärcode von 0000 bis 1001, also ganz einfach die Ziffern
von 0 bis 9.
Die grundsätzliche Technik der fortgesetzten Division durch
10 ist jedoch in Ordnung, auch wenn ich auf einem µC eher
zur Subtraktionsmethode greifen würde. Zumindest solange,
solange der µC keine Hardware-Division besitzt.


Autor: Martin #### (martin-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl
Du hast natürlich recht, ich habe daran nicht gedacht.
Irgendwie denkt man bei BCD an eine 7-Segment Anzeige.
Naja aber vielleicht ist das doch was Josef wollte.

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jungs !

Muss einen 8-stelligen Zähler auf einem LCD darstellen.
Werde den Code gleich mal testen.

Schöne Grüße Josef


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke funktioniert gut (getestet)

SG Josef

//***********************Zahl in BCD umrechnen und in Ram 
Zwischenspeicher schreiben*******************************
void Convert_Int_Bcd ( unsigned long int Zahl)           //7-stellig
        {

        BCD_Numb[1] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[2] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[3] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[4] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[5] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[6] = Zahl % 10;
        Zahl = Zahl/10;
        BCD_Numb[7] = Zahl % 10;
        }
//***********************Bin_Bcd_LCD************************************ 
*************************************
void Bin_Bcd_LCD ( unsigned long int Zahl,char Dig)   //gibt bis zu x 
Stellen an LCD aus
{
char loop;
                    Convert_Int_Bcd (Zahl);

               for (; Dig > 0; Dig --)
                      {
                      CHAR_LCD(BCD_Numb[Dig]+'0');        //
                      }


}
//********************************************************************** 
**************************************

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit CodeVision geht das sehr elegant mit zB:

.sm ist das array wo es hingeht, .sm_num ein long das umgewandelt werden 
soll.

printf(credits.sm, "%0ald", credits.sm_num);

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter,

so gehts nicht.
Will man in einen String ausgeben, muß man sprintf() nehmen.
Bei printf() erfolgt die Ausgabe nach stdout.

ASCII-Ausgabe kann jeder C-Compiler, ist keine Spezialität des 
Codevision.

printf() ist natürlich aufwendiger als ltoa().


Der Formatstring "%a" ist mir unbekant, was soll der bewirken ?


Peter

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, du hast recht, das 's' ist abhanden gekommen. Nicht nur das, 
eigentlich alles falsch. Richtig muss es heissen:

sprintf(credits.sm, "%010ld", credits.sm_num);

das % ist der Identifier für die Flags, die erste '0' ist der 
Füllcharacter falls die Zahl weniger als 10 Stellen hat, die 10 ist die 
Anzahl der Digits, l = long, d = Ausgabe dezimal

zB credits.sm_num = 0x000c --> credits.sm[] = 0000000012

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.