Konvertera en CHAR till Hex?
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Konvertera en CHAR till Hex?
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.
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?
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:
Otestad kod är väl bäst att säga, kanske missat nåt.
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
Re: Konvertera en CHAR till Hex?
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.
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.
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Konvertera en CHAR till Hex?
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!
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?
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
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
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Konvertera en CHAR till Hex?
Hmm
lite kod:
Och sedan kör jag:
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?
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;
}
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]);
}
Vad har jag missat?
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Re: Konvertera en CHAR till Hex?
Testa char2hex(unsigned char n, unsigned char *text2)
och skippa i att returnera något.
Anropa funktionen med char2hex(rom, text2);
och skippa i att returnera något.
Anropa funktionen med char2hex(rom, text2);
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Konvertera en CHAR till Hex?
Känns lite som en fulhacklösning.
Funkar gör det dock. Koden ser ut som här då:
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?
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:
(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?
Går också att göra såhär:
Anropas såhär:
Ä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...
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;
}
Kod: Markera allt
char *text;
text = char2hex(0x37);
Lcd_Chr_Cp(text2[1]);
Lcd_Chr_Cp(text2[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?
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:
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]);
-
- Inlägg: 8092
- Blev medlem: 18 januari 2009, 00:48:24
- Ort: Alvesta, Småland
Re: Konvertera en CHAR till Hex?
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.
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?
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.
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?

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?
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.
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.