Sida 1 av 2

Konvertera en CHAR till Hex?

Postat: 22 maj 2009, 15:35:18
av danielr112
Detta blir nog lite luddigt men ska försöka förklara

ROMet på en DS18S20 är ju 8 bytes. När man tittar på dem på datorn brukar man se dem i HEX form?

När man läser ur läser jag ur dem som en char åt gången men vill visa varje char fast från hex?

hmm detta blir nog svårt att förklara men försöker göra det bildligt.

När jag kollar i vanliga datorn med digitemp så läses dess rom ut som 16 bokstäver. dvs 8*HEX?

Hmm detta blir inte alls bra. men hoppas att någon förstår. Jag vill helt enkelt kunna ta de 8 bytesen och visa på en display så man ser de i samma format som jag ser dem på datorn.
Någon som har typs på vad jag ska börja?

Jag kör med MikroC och PIC16F690.

Re: Konvertera en CHAR till Hex?

Postat: 22 maj 2009, 15:46:12
av cyr
Du vill konvertera varje byte du läser ut till motsvarande två hexadecimala siffror i ASCII?

Om du inte vill blanda in några C-libs som tar mycket plats så gör typ:

Kod: Markera allt

char text[2];
unsigned char byte;

text[1] = byte>>4; // Plocka ut fyra högsta bitarna
text[0] = byte&0xf; // Plocka ut fyra lägsta bitarna

if(text[0] > 9) text[0] += 'A'; // A .. F
else text[0] += '0'; // 0 .. 9

if(text[1] > 9) text[1] += 'A'; // A .. F
else text[1] += '0'; // 0 .. 9

Otestad kod är väl bäst att säga, kanske missat nåt.

Re: Konvertera en CHAR till Hex?

Postat: 22 maj 2009, 15:54:12
av Icecap
Att skriva ut en byte till en sträng i C är enkelt, likaså om den sträng ska vara hexadecimal.

sprint("%02Xh", Value);
skriver ut värdet i Value med 2 platser (fylls på med nollor om det behövs) och ett 'h' efter. Är innehållet i Value alltså 123 decimalt (= 7Bh) kommer det att bli "7Bh" ut. Vill du skippa 'h' är det bara att låta bli att skriva det osv.

Re: Konvertera en CHAR till Hex?

Postat: 22 maj 2009, 16:07:56
av danielr112
Tack båda!

Vet att jag gjort det innan men nu i värsta förkylningen så vet jag inte vart jag förlagt det...

sprintf skippar jag helst då jag har för mig att den tar ganska mycke plats.

Tack grabbar!

Re: Konvertera en CHAR till Hex?

Postat: 22 maj 2009, 16:35:46
av Icecap
Ganska enkelt också:
char X;
X = Value >> 4;
X += '0';
if(X>'9') X += ('A'-'9');
// Nu är X högsta siffran att skrivas ut
X = Value & 0x0F;
X += '0';
if(X>'9') X += ('A'-'9');
// Nu är X den lägsta siffran att skriva ut

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 21:37:29
av danielr112
Hmm

lite kod:

Kod: Markera allt

char char2hex(unsigned char n) {
     char text2[2];
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
     return *text2;
}
Och sedan kör jag:

Kod: Markera allt

    for(i=0; i<8; i++) {
char text2[2]; //Ligger längst upp givetvis.

          *text2 = char2hex(rom[i]);
          Lcd_Chr_Cp(text2[1]);
          Lcd_Chr_Cp(text2[0]);
    }
Men text2[1] har bara skräptecken när den returneras. Kör jag och printar tecknen i proceduren funkar det.

Vad har jag missat?

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 21:58:45
av thepirateboy
Testa char2hex(unsigned char n, unsigned char *text2)
och skippa i att returnera något.

Anropa funktionen med char2hex(rom, text2);

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 22:17:12
av danielr112
Känns lite som en fulhacklösning.
Funkar gör det dock. Koden ser ut som här då:

Kod: Markera allt

.
.
.
char text2[2];

char char2hex(unsigned char n,char text2[2]) {
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
}
void main() {
.
.
.
char2hex(rom[i],text2);
Lcd_Chr_Cp(text2[1]);
Lcd_Chr_Cp(text2[0]);
.
.


Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 22:44:05
av mri
Det är ingen fulhacklösning. Du måste göra så där i C. Orsaken är att det inte går att returnera innehållet i ett fält ("array" på engelska) från en funktion.
(Kan också tilläggas att det inte är innehållet i text2[] fältet som skickas till funktionen, utan endast fältets adress.)

Jag hade snyggat till koden lite:

Kod: Markera allt

void char2hex(unsigned char n, char text2[2]) 
{
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9
}

void main() 
{
    char text2[2];
.
.
    char2hex(rom[i], text2);
    Lcd_Chr_Cp(text2[1]);
    Lcd_Chr_Cp(text2[0]);
.
.

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 22:53:42
av cyr
Går också att göra såhär:

Kod: Markera allt

char* char2hex(unsigned char n) {
// OBS: static, annars ligger datan på stacken och kan inte användas efter return!
     static char text[2];
     text2[1] = n>>4; // Plocka ut fyra högsta bitarna
     text2[0] = n&0xf; // Plocka ut fyra lägsta bitarna
     if(text2[0] > 9) text2[0] += 'A'; // A .. F
     else text2[0] += '0'; // 0 .. 9
     if(text2[1] > 9) text2[1] += 'A'; // A .. F
     else text2[1] += '0'; // 0 .. 9

     return text;
}
Anropas såhär:

Kod: Markera allt

char *text;

text = char2hex(0x37);

Lcd_Chr_Cp(text2[1]);
Lcd_Chr_Cp(text2[0]);
Ännu snyggare om man gör text[] till tre byte, byter plats på [1] och [0] och sätter [2] till '\0'.

Så kan man använda Lcd_Putstr(text); eller Lcd_Putstr(char2hex(0x55)); om man råkar ha en snarlik funktion...

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 23:05:09
av mri
Jo, går att använda en statisk buffer men det rekomenderas verkligen inte!

Kom just på att följade metod brukar presenteras som ett "coolt" sätt i diverse C böcker. Genererar antagligen minst kod också, om nu kompilatorn optimerar ihop strängarna:

Kod: Markera allt

Lcd_Chr_Cp("0123456789ABCDEF"[byte >> 4]);
Lcd_Chr_Cp("0123456789ABCDEF"[byte & 0xF]);

Re: Konvertera en CHAR till Hex?

Postat: 29 maj 2009, 23:06:59
av danielr112
cyr: Funkar tyvär inte och ger konstiga saker ut.

Jag kör MikroC Pro om det var så att du kanske testkörde det med annat program.

edit:

Mri: Ditt sista där funkar inte i MikroC rakt av. Tror också jag nöjer mig me de andre. det räcker för att uppnå mitt mål.

edit igen: Missade ditt första inlägg också. Ok länge sedan jag satt med C så har inte koll på return får jag erkänna.

Re: Konvertera en CHAR till Hex?

Postat: 30 maj 2009, 10:16:02
av jesse
Blir det där verkligen rätt?

if(text2[1] > 9) text2[1] += 'A'; // A .. F

antag att text2[1] = 11 , dvs 0xB

11+'A' får jag till 'L', inte till 'B'

så du får väl subtrahera 10 för att få rätt bokstav.

Re: Konvertera en CHAR till Hex?

Postat: 30 maj 2009, 11:40:19
av cyr
:doh:

Helt rätt jesse, tankefel av mig.

if(text2[1] > 9) text2[1] += ('A' - 10); // A .. F

Måste det vara.

Re: Konvertera en CHAR till Hex?

Postat: 30 maj 2009, 12:41:21
av mri
En liten detalj till om det här ämnet. Man får passa sig när man högerskiftar för att plocka ut den övre nibblen. T.ex. byte >> 4 är problematiskt om 'byte' är deklarerad som 'char'. Detta eftersom "C" inte specificer om char är signed eller unsigned. Kompilatorn kan ha vilkendera som default. Dvs. om char är signed och variabeln 'char byte' har värdet 0xff, då är byte>>4 lika med 0xff (-1), när man kaske förväntade sig 0x0f (15).

Anta aldrig något om char, utan ange utryckligen om den skall vara 'unsigned char' eller 'signed char' om du tänkt använda den till beräkningar och dyligt.