ASCII Code in String eingeben

Gast #285371
Lesenswert?
• ▲
▼
Wie kann man in C in einem String ein Zeichen als ASCII Code eingeben ?
Bsp:
Ich möchte auf einem LCD einen Text mit Umlauten o.ä. ausgeben wie
z.B.
Außentemperatur
Leider liegt das 'ß' auf dem LCD an einer anderen Stelle (nämlich auf
0xE2).
Wie kann ich in den String "Außentemperatur" nun also das ß durch
0xE2 ersetzen ?
"Au\xE2entemperatur" geht nicht.
Moderator Persönliche Seite #285374
Lesenswert?
• ▲
▼
> "Au\xE2entemperatur" geht nicht.

Dafür hat ISO-C89

"Au\xE2" "entemperatur"

eingeführt.  Diese Teilung braucht man, weil eine Escapefolge erst
beim " oder beim ersten ungültigen Zeichen (zur aktuellen Zahlebasis,
also oktal oder hexadezimal) endet.  "Au\xE2entemperatur" parst
folglich als "Au" "\xE2e" "ntemperatur".

Peter's Vorschlag funktioniert nicht ganz, man muss das SZ als
Stringliteral definieren (nur aufeinanderfolgende Strinliterale werden
auf diese Weise verkettet):

#define SZ "\xE2"

Man darf in Peters "Au" SZ "entemperatur" übrigens auch noch die
Leerzeichen einsparen, dann lässt es sich ein wenig flüssiger lesen.
Gast #285375
Lesenswert?
• ▲
▼
Danke !
Funktioniert wunderbar...

Gibt es eigentlich irgendwo eine Beschreibung im Internet wo sowas
steht ?
Ich habe einige C Bücher (u.a. Kernighan/Ritchie) aber da steht sowas
nicht drin. Außerdem suche ich noch einige Infos zu #define wie man
z.B. aus
#define port portd
#define bit  5
sbi (port, bit);
folgendes machen kann:
portd_5=1;
Moderator Persönliche Seite #285376
Lesenswert?
• ▲
▼
> Gibt es eigentlich irgendwo eine Beschreibung im Internet wo sowas
> steht?

Keine Ahnung.

> Ich habe einige C Bücher (u.a. Kernighan/Ritchie) aber da steht
> sowas nicht drin.

Im K&R (in der zweiten Auflage natürlich) sollte das schon beschrieben
stehen.  Ich müsste zu Hause in meinem nachgucken, wo's genau steht.

>  Außerdem suche ich noch einige Infos zu #define wie man
> z.B. aus
1
#define port portd
2
#define bit  5
3
sbi (port, bit);

> folgendes machen kann:
1
portd_5=1;

Wüsste ich nichts, außer vielleicht einem Codegenerator (in einer
Scriptsprache wie Perl oder Python), der einem den vollen Satz davon
zusammenschreibt.

Mein Tip: schreib dir lieber einen HAL (hardware abstraction layer).
Eigentlich willst du doch sowieso nicht wirklich in der Kategorie
"Port und Pin" denken, sondern am Portpin hängt irgendetwas dran,
z. B. eine LED.  Ein HAL wäre dann sowas wie:
1
#define LED_PORT  PORTD
2
#define LED_DDR   DDRD
3
#define LED_PINNO 5
4

5
#define LED_INIT() do { LED_DDR |= (1 << LED_PINNO); } while (0)
6
#define LED_SET()  do { LED_PORT |= (1 << LED_PINNO); } while (0)
7
#define LED_CLR()  do { LED_PORT &= ~(1 << LED_PINNO); } while (0)

Wenn jetzt deine LED mal ,,umziehen'' muss an einen anderen Pin oder
vielleicht statt vom Ausgang nach Masse von Vcc zum Ausgang geklemmt
wird, hast du nur noch eine Stelle, an der du was ändern musst.
Gast #285377
Lesenswert?
• ▲
▼
Genau das möchte ich ja auch machen, aber leider verstehen nicht alle
Compiler unter PORT1|=1<<PINNO dasselbe. Bei AVRs wird ein sbi daraus,
bei einem M16C macht der Compiler genau das was man eingibt: Er
berechnet 1<<PINNO und ODER verknüpft das mit dem Byte.
Daher muss man da schreiben PORT_PINNO=1; damit der Compiler den Bit
Setzen Befehl anwendet.
Irgendwie geht sowas, nur mit dem bisschen was in K&R (zweite Auflage)
dazu steht bekomme ich das nicht hin.
Gast #285379
Lesenswert?
• ▲
▼
>Da Du aber den Inhalt von 2 anderen define-Makros stringizen moechtest
kann das ganze etwas komplex werden.

Genau das ist mein Problem:

#define LCD_port    p0
#define WR     0

Daraus soll werden:
p0_0

#define sbi(sfr, bit)     (sfr##bit = 1;)

Das Makro zieht die beiden aber zusammen und so wird aus sbi(LCD_port,
WR);
LCD_port_WR
Und das kennt der Compiler nicht. Kann man irgendwie die Reihenfolge
ändern in der Präprozessor das abarbeitet ?

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