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.
> "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.
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;
> 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.
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.
Suche im Web nach 'Stringize' Operation und 'Token Pasting' Das sind im Praeprozessor die # und ## Operation. Da Du aber den Inhalt von 2 anderen define-Makros stringizen moechtest kann das ganze etwas komplex werden.
>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 ?
es geht übrigens auch einfach die escapefolge mit backslash zu verwenden: "Au\xE2 \bentemperatur"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.