mikrocontroller.net

Forum: Compiler & IDEs C-Beginner HEX 2 ACII


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi
hat jemand ne idee wie ich in c am besten eine hex Zahl in ein ACII 
zeichen wandeln kann? es geht sich eigentlich nur um Zahlen
0-255.

Autor: Notker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t bin2asc(uint8_t byte,uint8_t hi)
{
        if(hi)
                byte >>= 4;
        else
                byte &= 0x0f;
        if(byte>9)
                byte += 0x37;
        else
                byte += 0x30;
        return(byte);
}

Wandelt jeweils das nieder- bzw. höherwertige Nibble eines Bytes in ein 
druckbares Hex-Zeichen (ASCII) um. Muss also zur Umwandlung eines Bytes 
zweimal aufgerufen werden.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhh..dann muss ich also erst mein byte in high und low zerlegen und dann 
übergeben?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus: Du willst ein Byte hexadezimal darstellen, habe ich das richtig 
verstanden?

Notker's Funktion rufst du einmal mit
  zeichen1 = bin2asc(zahl, 0);
auf (dann bekommst du das erste Zeichen) und das zweite Mal mit
  zeichen2 = bin2asc(zahl, 1);
(zweites Zeichen).

Finde ich etwas umständlich, ich würde es so machen (evtl. mit #define 
in ein Makro packen):

zeichen = zahl + ((zahl > 9) ? 0x37 : 0x30);

Wandelt eine Zahl <= 0xF in das entsprechende Zeichen um. Bei ganzen 
Bytes brauchst du natürlich wieder 2 Zeichen, also:

zeichen1 = zahl + (((byte & 0xF) > 9) ? 0x37 : 0x30);
zeichen2 = zahl + (((byte >> 4) > 9) ? 0x37 : 0x30);

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal besten dank für eure schnelle hilfe.
also deine lösung andreas finde ich super...:)...
da ich aber noch wenig erfahrung mit C habe weiss ich nicht welche wohl 
die bessere lösung ist. also mit der lösung von unten könnte man jetzt 
sogar einen long int umwandeln.

noch ne frage..was ist true und was ist false hinter dem fragezeichen. 
meiner logik nach müsste der linke der true fall sein.


extern void lcdputnum(unsigned char number)
{
    unsigned char i;

    if (number <= 9)
    {
        i = 0x30 + number;
        lcdputchar(i);
    }

    if (number >= 10 && number <= 99)
    {
        i=number/10;lcdputchar(i+0x30);number-=(i*10);
        lcdputchar(number+0x30);
    }

}

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit der lösung von andreas ist nach einem byte ende.
mit deiner kann man jetzt mehr auflösen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus: Links vom Doppelpunkt steht das Ergebnis für true, rechts davon 
das für false.

@BAB: Nein. Der Unterschied ist, dass Markus' Version keine Hexadezimal- 
sondern eine Dezimalzahl anzeigt. Die Funktion nimmt auch nur unsigned 
char als Parameter.

Autor: BAB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops sorry hatte mich wohl verschaut...
mit mehr meinte ich übrigens das man die version oben leicht erweitern 
kann und zb zu einer int oder long ing oder sonstigen funktion umbauen 
kann.

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.