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

OP #2612533
Lesenswert?

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
Lesenswert?

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 #2613126
Lesenswert?

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

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