www.mikrocontroller.net

Forum: Compiler & IDEs Char in 2 Hälften teilen


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Ich mache gerade meine ersten gehversuche mit µCs und C.
Im Tutorial habe ich was gefunden wie man einzelne Bits von Ports und 
registern setzen, löschen oder abfragen kann.
Gibt es etwas vergleichbares auch mit 4 Bit?
Ich möchte das High- und das Low Nibble betrennt voneinander betrachten, 
aber nur ein Zeichen verwenden
Beispiel:
Das Zeichen ist 0x0d und ich möchte das High-Nibble um eins erhöhen.
Wie kann ich in einer If oder case abfrage rausfinden, ob das Low-Nibble 
z.B. 7 ist?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:

> Das Zeichen ist 0x0d und ich möchte das High-Nibble um eins erhöhen.
  uint8_t c = 0x0d;

  c = ((c & 0xf0) + 1) | (c & 0x0f);

> Wie kann ich in einer If oder case abfrage rausfinden, ob das Low-Nibble
> z.B. 7 ist?
  if ((c & 0x0f) == 7) {
     /* ... */
  }

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bit-Operatoren sind dein Freund
http://www.pronix.de/pronix-676.html

// Das Zeichen ist 0x0d...

unsigned char daten = 0x0d;
unsigned char oberes_nibble  = (daten & 0xF0) >> 4 ;
unsigned char unteres_nibble = (daten & 0x0F);

// ... und ich möchte das High-Nibble um eins erhöhen.

oberes_nibble += 1;
daten = (oberes_nibble << 4) | unteres_nibble;

// Wie kann ich in einer If oder case abfrage rausfinden,
// ob das Low-Nibble z.B. 7 ist?

if (unteres_nibble == 7)

// Ich möchte das High- und das Low Nibble betrennt voneinander 
betrachten,
// aber nur ein Zeichen verwenden

#define OBERES_NIBBLE(x)  (((x) & 0xF0) >> 4)
#define UNTERES_NIBBLE(x)  ((x) & 0x0F)

if (UNTERES_NIBBLE(daten) == 7)

daten = ((OBERES_NIBBLE(daten) + 1) << 4) | UNTERES_NIBBLE(daten);

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns wirklich nur um Erhöhungen um feste Werte (z.B. 1) geht, würde ich 
das Hin- und Hergeshifte seinlassen. Kostet nur Zeit und Codezeilen, 
auch wenns etwas leichter zu verstehen ist.

also daten = ((daten & 0xf0) + 0x10) | (daten & 0x0f)

Für wüste Berechnungen damit sind Makros wie von Stefan vorgeschlagen 
natürlich übersichtlicher.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.
Ich probiers mal aus.

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.