LCD Ansteuerung 4 bit-mode unter "C"_Anfänger

OP #2612533
AVR-Tutorial: LCD
Hier wird, in Assembler, den ich bisher auch erfolgreich benützte, das 
Halbbyte,als Beispiel, von PD0...3 weg ans Display gesendet.

Wenn man nun C lernt und vorzugsweise wiederverwendbare Routinen 
schreiben möchte, so habe ich schon von peda den Rat gehört, die 
#defines für das pinning des LCD's am µC in der main.c unterzubringen. 
Enable und RS ist klar.

Wenn nun aber das Halbbyte einmal Px0...3 und ein anderes Mal, je nach 
Printlayout, Px4...7 verwendet werden soll, so komme ich, als Anfänger, 
auf keine Lösung wie ich das machen soll, ohne eine umfangreiche 
ifdef......endif in einer lcd_my.h oder lcd-my.c unterzubringen.

Geht so was in C eleganter?
So wie in Assembler es auch in C zu lösen, das kann ich inzwischen.
In Assembler war eine Ansteuerung eben speziell für ein PCB-Layout.

LG Rudi
#2612590
Rudi D. schrieb:

> schreiben möchte, so habe ich schon von peda den Rat gehört, die
> #defines für das pinning des LCD's am µC in der main.c unterzubringen.
> Enable und RS ist klar.

main.c ist aber die falsche Stelle. Wie soll denn der Code in lcd.c dann 
das Pinning mitkriegen?

> Wenn nun aber das Halbbyte einmal Px0...3 und ein anderes Mal, je nach
> Printlayout, Px4...7 verwendet werden soll, so komme ich, als Anfänger,
> auf keine Lösung wie ich das machen soll,

In dem Fall geht es noch. Denn im Prinzip hast du dann deine 4 
Datenleitungen immer noch nebeneinander in gleicher Reihenfolge an einem 
Port liegen.

D.h. die 'Position deiner 4 Datenleitungen' ist einfach nur um einen 
(konstanten) Offset verschoben. Das ist auch in C kein Problem, Die 
Datenleitungen werden dann ausgegeben durch
1
  DATA_PORT &= ~( 0x0F << DATA_OFFSET );           // bewusste Pins auf 0
2
  DATA_PORT |=  ( Daten & 0x0F ) << DATA_OFFSET;   // je nach Bedarf wieder 1 einsetzen

Unangenehm wird es dann, wenn auch diese Annahme nicht mehr greift und 
die 4 Datenleitungen wild verteilt an einem oder mehreren Ports liegen.

> ohne eine umfangreiche
> ifdef......endif in einer lcd_my.h oder lcd-my.c unterzubringen.
>
> Geht so was in C eleganter?

Kommt immer drauf an, wie universell das ganze sein muss. Wer 
hardwaremässig in die Situation rutscht, dass er die 4 Datenleitungen 
nicht beisammen lassen kann/will, muss dieses "Vergehen" mit Mehraufwand 
im Code bezahlen. Die Frage ist, ob man diesen Mehraufwand nur für den 
Fall der Fälle immer in Kauf nimmt oder ob man sagt: Lass den Scheiss 
und sieh zu, dass du die Datenleitungen hardwaremässig beisammen lässt.

> ohne eine umfangreiche ifdef......endif in einer lcd_my.h oder
> lcd-my.c unterzubringen.

Na ja. So umfangreich ist es dann auch wieder nicht. Man muss sich halt 
unter Umständen erst mal ein paar Makros und/oder Funktionen oder einen 
sontigen Mechanismus zurechtlegen, damit die Schreiberei nicht ausartet. 
Es ist nicht ungewöhnlich, dass man in C sein eigener "Werkzeugmacher" 
ist, so dass man erst mal ein wenig Aufwand investiert um dafür dann an 
anderen Stellen den (Tipp-)Aufwand massiv zu drücken.
OP #2613044
Ich danke für die ausführlichen Antworten, die mir das Thema klarer 
erscheinen lassen. Wild verteilte Datenleitungen hatte ich nie im Sinn.

Manche Schreibweisen für Platzhalter "##" sind mir noch neu.
Aber ich werde jetzt gut zurechtkommen.
LG Rudi
OP #2613126
Danke, für den Hinweis. Verstehe jetzt:

3.1.6. Präprozessor-Operatoren
Der Präprozessor kennt den stringize-Operator # und den pasting-Operator 
##. Ersterer verwan-
delt den nachfolgenden Text in einen String, letzterer verknüpft zwei 
Argumente:
1
#include <stdio.h>
2
#define stringize(s) # s
3
#define makestring(s) stringize(s)
4
#define concatenate(a,b) a ## b
5
int main()
6
{
7
int var12=32;
8
printf(makestring(C ist seltsam und sonderbar));
9
printf("\nund %s hat den Wert %d\n",
10
makestring(concatenate(var,12)),
11
concatenate(var,12));
12
}

Je mehr ich kenne umso umfangreicher wird das, das ich nicht kenne!
LG Rudi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.