Zeichen (hex) binär ausgeben

Gast #1996759
Lesenswert?

Hallo liebe Forum Gemeinde.

Als erstes wünsche ich allen ein frohes und vorallem gesundes neues 
Jahr.
Zweitens : ich komme gleich auf den Punkt.

Ich habe ein char (Zeichen zwischen 0...F)
Nun möchte ich das Zeichen in binärcode ausgeben.

Folgendes habe ich bisher geschafft:

char Buffer[4];
int i;
char Wert;

Wert=botschaft[7];  // botschaft[7] enthält die Zeichen von 0 bis F...

for (i = 0; i < 4; i++)
{
   Buffer[i] = (Wert & (1 << (3 - i)) ? '1' : '0');
}
Buffer[4] = '\0';
set_cursor(0,3);lcd_string(Buffer);

Es klappt nur bei Zeichen von 0 bis 9...
Wie kann ich den Code ergänzen um auch A bis F auszugeben.

Liebe Grüße
Gast #1996764
Lesenswert?

1
for (i = 0; i < 4; i++)
2
{
3
   Buffer[i] = (Wert & (1 << (3 - i)) ? '1' : '0');
4
}
Sieht eigentlich gut aus.

1
Buffer[4] = '\0';
Schreibt auf jeden Fall in einen Speicher in den es nicht schreiben 
soll.


>Es klappt nur bei Zeichen von 0 bis 9...
>Wie kann ich den Code ergänzen um auch A bis F auszugeben.
Was passiert denn bei A bis F?
Gast #1996839
Lesenswert?

Also.
Die Zeichen werden wie folgt erzeugt :

0   0000
1   0001
2   0010
3   0011
4   0100
5   0101
6   0110
7   0111
8   1000
9   1001

bis dahin alles ok...

A   0001
B   0010
C   0011
D   0100
E   0101
F   0110

ok. Er fängt wieder von vorne an.
Wenn ich das Ergebnis (von der 9) zum Ergebnis (z.B. von A) addiere 
bekomme ich das richtige Ergebnis??

BSP:
1001  ->9
+
0011  ->C
=
1100  ->12

Wie mache ich das?
Gast #1997144
Lesenswert?

Hallo nochmal. Kann leider das Problem immernoch nicht lösen !
Kann mir jemand helfen ?

Nochmal zum Problem :

ich möchte ein Zeichen als Binärcode (4 Bit) darstellen :

Erstes  Bsp: 5 -> 0101
Zweites Bsp: B -> 1011

Leider bekomme ich mit meinem Code nur ein 7 Bit Binärcode heraus.

Ich möchte aber ein 4 Bit Binärcode. Wie mache ich das? Weiß das Jemand?

Liebe Grüße
Gast #1997473
Lesenswert?

> Erstes  Bsp: 5 -> 0101
> Zweites Bsp: B -> 1011

> Leider bekomme ich mit meinem Code nur ein 7 Bit Binärcode heraus.
> Ich möchte aber ein 4 Bit Binärcode.

Du meinst wahrscheinlich BCD-Zahlen im 8421-Code ?
A bis F sind dann sogenannte Pseudotetraden.
Soviel zu den Grundlagen.

> Ohne deinen Quelltext kann man lange raten.
> Verstecke ihn gut, damit ihn nie jemand sieht!
nicht ganz im Sinne des GNU Projekts ;-) insofern gibts auch nur vage 
Hinweise.
Gast #2002177
Lesenswert?

Hallo . Da bin ich wieder.

P.S. Das was ich vor habe funktioniert immernoch nicht :o(

Zur Erinnerung:
1. Ich bekomme einen String (botschaft) über UART [botschaft[10]]
2. Das 9-te Zeichen botschaft[8] z.B. A möchte ich zu 4-Bit Binärcode
convertieren.
3. Die Funktion hex_to_bin soll mir den Code (z.B. 1010) als String 
liefern...

WAS MACHE ICH FALSCH????

P.S.
Das habe ich bereits gelesen...
http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F


Hier mein Code...
1
char botschaft[10];   // 9 Zeichen Botschaft
2

3
int main(void)
4
{
5
         // UART , LCD etc.. initialisieren
6

7
  while(1)
8
  {
9
         // Botschaft über UART empfangen (z.B. 00000000A)
10
         uart_gets( botschaft, sizeof( botschaft ) );    
11

12
         // 9-tes Zeichen des Strings als 4-Bit Binär convertieren
13
         set_cursor(0,2);lcd_string(hex_to_bin(botschaft[8]));
14
    }
15
  }
16
}
17

18
char* hex_to_bin(char hex)
19
{
20
      char temp[5];
21

22
    int bin;
23
    switch (hex)
24
    {
25
      case '0' : bin=0000; break;
26
      case '1' : bin=0001; break;
27
      case '2' : bin=0010; break;
28
      case '3' : bin=0011; break;
29
      case '4' : bin=0100; break;
30
      case '5' : bin=0101; break;
31
      case '6' : bin=0110; break;
32
      case '7' : bin=0111; break;
33
      case '8' : bin=1000; break;
34
      case '9' : bin=1001; break;
35

36
      case 'A' : bin=1010; break;
37
      case 'B' : bin=1011; break;
38
      case 'C' : bin=1100; break;
39
      case 'D' : bin=1101; break;
40
      case 'E' : bin=1110; break;
41
      case 'F' : bin=1111; break;
42
      default :  break;
43
    }
44

45
      itoa(bin, temp, 10);
46
      temp[4]='\0';
47

48
  return temp;
49
}


ERROR:
../LCD_v1.c:51: error: conflicting types for 'hex_to_bin'

Vielen Dank
#2002202
Lesenswert?

P. Dammerow schrieb:


und das

>     switch (hex)
>     {
>       case '0' : bin=0000; break;
>       case '1' : bin=0001; break;
>       case '2' : bin=0010; break;
>       case '3' : bin=0011; break;
>       case '4' : bin=0100; break;
>       case '5' : bin=0101; break;
>       case '6' : bin=0110; break;
>       case '7' : bin=0111; break;
>       case '8' : bin=1000; break;
>       case '9' : bin=1001; break;
>
>       case 'A' : bin=1010; break;
>       case 'B' : bin=1011; break;
>       case 'C' : bin=1100; break;
>       case 'D' : bin=1101; break;
>       case 'E' : bin=1110; break;
>       case 'F' : bin=1111; break;
>       default :  break;

ist zwar nett gedacht, aber ziemlicher Unsinn.

Kleiner Tipp:
0010
ist nicht das Bitmuster, bei dem das 2.te Bit eine 1 ist.

Das ist eine Oktalzahl. Genau genommen ist das dezimal 8
Aus demselben Grund ist auch 0011 nicht das Bitmuster, bei dem die 
untersten 2 Bit gesetzt sind, sondern wieder eine Oktalzahl, die dezimal 
gesehen den Wert 9 (oder binär 0b1001) aufweist.

Nur 1000 (bzw. alle nachfolgenden) die sind tatsächlich das was dort 
steht. Nämlich Ein-Tausend, Ein-Tausend-Eins, Ein-Tausend-Zehn, 
Ein-Tausend-Elf etc. etc.


Was ist falsch an der Kombination, wie schon weiter oben vorgeschlagen:

Den ASCII Code des Buchstabens hernehmen und daraus die richtige Zahl 
machen ....
1
uint8_t toBin( char c )
2
{
3
  if( c >= '0' && c <= '9' )
4
    return c - '9';
5

6
  return c - 'A' + 10;
7
}

... und danch itoa zu benutzen um sich dann aus einer Zahl eine 
textuelle Binärrepräsentierung besorgen zu lassen?
1
  while(1)
2
  {
3
         // Botschaft über UART empfangen (z.B. 00000000A)
4
         uart_gets( botschaft, sizeof( botschaft ) );    
5

6
         uint8_t value = toBin( botschaft[8]);
7

8
         set_cursor(0,2);
9
         lcd_string( itoa( value, buffer, 2 ) );
10
    }

(jetzt mal von fehlenden führenden 0-en abgesehen, was man noch lösen 
müsste)
Gast #2002815
Lesenswert?

Danke für die ausführliche Antwort Karl Heinz.

Habe Deine (durchaus elegantere) Lösung eingearbeitet.
Um es zu verstehen, werde ich sicherlich etwas länger brauchen.
Es sieht schon super aus. Was ich leider noch nicht
hinbekomme ist folgendes :
1
uint8_t toBin( char c )
2
{
3
  if( c >= '0' && c <= '9' )
4
    return c - '9';
5
  return c - 'A' + 10;
6
}

Bei den Zeichen von 0 bis 9 bekomme ich immer nur 1111 heraus.
Bei A-F klappts super.

Danke
#2002885
Lesenswert?

P. Dammerow schrieb:

> Bei den Zeichen von 0 bis 9 bekomme ich immer nur 1111 heraus.
> Bei A-F klappts super.


Muss ich mich entschuldigen.
Es bewahrheitet sich eben immer wieder: Egal wie banal ein Codestück 
erscheint. Egal wie oft man diese Funktion in der Vergangenheit schon 
geschrieben hat. Teste ihn vor dem Posten, den es gibt keinen Fehler der 
nicht banal genug wäre ihn noch einmal zu machen :-)
Gast #2003265
Lesenswert?

Hallo Karl Heinz, hallo DirkB.
BITTE NICHT LACHEN !

Ich bekomme es leider nicht hin die führende Nullen in die Integer Zahl 
hinzuzufügen. Obwohl Deine (Karl Heinz) Lösung mir persönlich sehr gut 
gefallen hat.

Habe mir daher eine unsinnige Funktion geschrieben, die jedoch zu 
funktionieren scheint.
Ob diese resourcen-schonend ist, das wage sogar ich - als Anfänger - zu 
bezweifeln...
1
char bin[4];    // Variable für 4 Bit Binär als String
2

3
// Konvertiert HEX (Zeichen 0-F) in 4-Bit Binärcode
4
char* hex_to_bin(char hex)
5
{
6
      switch (hex)
7
    {
8
      case '0' : strcpy( bin, "0000"); break;
9
      case '1' : strcpy( bin, "0001"); break;
10
      case '2' : strcpy( bin, "0010"); break;
11
      case '3' : strcpy( bin, "0011"); break;
12
      case '4' : strcpy( bin, "0100"); break;
13
      case '5' : strcpy( bin, "0101"); break;
14
      case '6' : strcpy( bin, "0110"); break;
15
      case '7' : strcpy( bin, "0111"); break;
16
      case '8' : strcpy( bin, "1000"); break;
17
      case '9' : strcpy( bin, "1001"); break;
18
      case 'A' : strcpy( bin, "1010"); break;
19
      case 'B' : strcpy( bin, "1011"); break;
20
      case 'C' : strcpy( bin, "1100"); break;
21
      case 'D' : strcpy( bin, "1101"); break;
22
      case 'E' : strcpy( bin, "1110"); break;
23
      case 'F' : strcpy( bin, "1111"); break;
24
      default :  break;
25
    }
26
  return bin;
27
}
28

29
Aufruf...
30

31
// botschaft[8] beinhaltet Zeichen 0...F
32
lcd_string(hex_to_bin(botschaft[8]));

Liebe Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren