hex till ascii converter avr gcc

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
lizerdboy
Inlägg: 1610
Blev medlem: 6 oktober 2003, 22:24:12
Ort: Stockholm

hex till ascii converter avr gcc

Inlägg av lizerdboy »

någon som sitter på en hex till ascii converter till avr gcc

skulle behöva en för att kunna printa ut ett värde på en lcd,

som de blir nu så skriver den bara ut ascii tecknet som värdet pekar på.

vill ha variablarna

variabel1 = 0x20 = vilket är hexvärdet jag vill komvertera.
variabel2 = 0 = ska vara hundra delen av hex värdet fast i decimalt
variabel3 = 3 = tiondelen
variabel4 = 2 = en delen , eller vad de nu heter =).

0x20 hex blir 32 decimalt.

någon som vet ??

Thanks // Micke
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Enklast är upprepade subtraktioner, dock inte snabbast.
Det skriver du snabbt ihop, om du inte vill vänta på något
färdigt...
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag uppfattar det som att du har en hex-sträng du vill konvertera och det är ganska enkelt, man gör som med decimala tal:
1: Nolla 'Resultat' ('Resultat' väljs efter största värdet som kan användas)
2: Sätt en pekare till första siffer.
3: 'Resultat' = 'Resultat' * talbas, här 16. (decimalt alltså 10)
4: 'Mellanresultat' = karaktär - '0'
(4A: om('Mellanresultat' > 9) 'Mellanresultat' = 'Mellanresultat' - 'A' - '0' + 1, fäller vid HEX)
5: 'Resultat' = 'Resultat + 'Mellanresultat'
6: Flytta karaktärpekare
7: om(fler karaktärer finns) gå till punkt 3
klart.

Kod: Markera allt

unsigned long Hex2Dec(char * String)
  {
  unsigned long Result;
  unsigned char Misc;
  Result = 0;
  while(*String) // Repeat untill EOS
    {
    Result <= 4; // Multiply by 16
    Misc = *String - '0'; // Read character and subtract ASCII-part
    if(Misc > 9) Misc -= 'A' - '0' + 1; // It's 'A' - 'F', adjust value
    Result += Misc; // Add value of character
    String++; // Point on next char
    }
  return(Result);
  }
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Jag vet inte riktigt om jag fattade dig rätt, men funktionen itoa(...) omvandlar variabler till strängar i godtycklig talbas mellan 2 och 16. Funktionen är standard i avr-libc.
Användarvisningsbild
lizerdboy
Inlägg: 1610
Blev medlem: 6 oktober 2003, 22:24:12
Ort: Stockholm

Inlägg av lizerdboy »

tackar tackar,

båda itoa och sprintf Funka fint, men sprintf tar #"%&!"# mycket utrymme,

vad är de som är fördelen med sprintf ??

med itoa kam man få fram octal, dec, hex i ascii format ekelt och utrymmessnålt med =), Me like

vad kan man göra mer med string.h ??

är ganska grön innom C , fast de går riktigt bra för de :D
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Knalla in på AVR libc hemsida och ladda ner "user manual". Bläddra fram till string.h och njut av alla finesser :)

Vad sprintf har som du kommer sakna förr eller senare i itoa är exempelvis padding med nollor så att man kan sätta konstant längd på sina utskrifter. Sprintf är över lag smidigare eftersom man kan hantera en lång utskrift på en snygg C-rad på ett överskådligt sätt. Kostnaden är allt programminne den käkar upp, det är fritt att välja.
Skriv svar