Forum: Mikrocontroller und Digitale Elektronik 4-Bit LCD-Ansteuerung splitten


von Martin Schulz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich betreibe erfolgreich ein LCD "DISPLAYTECH 162" an verschiedenen 
Controllern im 4-Bit-Mode.

Die verwendeten Steuer- und Datenleitungen waren immer

RS = pin 2
EN = pin 3
D4 = pin 4
D5 = pin 5
D6 = pin 6
D7 = pin 7

Es war also einfach durch "geschickte Positionierung" der Datenleitungen
vom LCD mit einem Port vom Controller die Daten zu senden.
Siehe Code-Ausschnitt.

Jetzt habe ich ein Projekt wo ich die Pins 4, 5, 6, und 7 eines Ports 
nicht zur Verfügung habe. Ich muss also andere, nicht "zusammenhängende" 
Pins eines Ports nehmen (z.B. die Pins 1, 2, 12, 13)

Wie kann ich nun die Daten so an die Pins "verteilen" das alles klappt?
Ich finde keine Lösung.

Ps. Ich schreibe in C, kenne aber von BASCOM die Möglichkeit
mit Config LCD die Pinnummern frei zu vergeben.
Kennt jemand den C-Code dazu?

Ich hoffe ihr versteht mein Problem ;-)

Vielen Dank für eure Tipps!
M.S.

von Max H. (hartl192)


Lesenswert?

Martin Schulz schrieb:
> Wie kann ich nun die Daten so an die Pins "verteilen" das alles klappt?
Ich würde mit eine Funktion lcdSendNibble machen und diese dann 
verwenden um die Daten zu senden:
1
void lcdSendNibble(uint8_t nibble, uint8_t register_select) 
2
{
3
  RS_PIN = !!register_select;
4
  D7_PIN = !!(nibble & 1 << 3);
5
  D6_PIN = !!(nibble & 1 << 2);
6
  D5_PIN = !!(nibble & 1 << 1);
7
  D4_PIN = !!(nibble & 1 << 0);
8
  EN_HIGH();
9
  wait_us(2);
10
  EN_LOW;
11
}
P.S:
Du kannst den Code auch per Copy'n'Paste einfügen

>> Forum: Projekte & Code
>> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel
>> vorstellen und diskutieren. Bitte hier keine Fragen posten!

von Ingo L. (corrtexx)


Lesenswert?

Du kannst jedes Bit händisch maskieren:
1
lcd_writechar ( uint8_t c )
2
{
3
  Deine 4 Portpins "low" setzen
4
  // oberes Nibble
5
  if ( c & 0x10 ) PortPin1 "high";
6
  if ( c & 0x20 ) PortPin2 "high";
7
  if ( c & 0x40 ) PortPin3 "high";
8
  if ( c & 0x80 ) PortPin4 "high";
9
 
10
  Enable wackeln();
11
12
  // unteres Nibble
13
  Deine 4 Portpins "low" setzen
14
  if ( c & 0x01 ) PortPin1 "high";
15
  if ( c & 0x02 ) PortPin2 "high";
16
  if ( c & 0x04 ) PortPin3 "high";
17
  if ( c & 0x08 ) PortPin4 "high";
18
19
  Enable wackeln();
20
}

Ist natürlich Pseudocode

von Martin Schulz (Gast)


Lesenswert?

Max H. schrieb:
> P.S:
> Du kannst den Code auch per Copy'n'Paste einfügen

Jup, danke.

Max H. schrieb:
>>> Forum: Projekte & Code
>>> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel
>>> vorstellen und diskutieren. Bitte hier keine Fragen posten!

Sorry..

Ingo L. schrieb:
> Du kannst jedes Bit händisch maskieren:

Das sieht ganz gut aus.. Ich teste das mal. Mist das ich auf solche
Lösungen nicht selber komme :-(

Danke euch beiden!

von Max H. (hartl192)


Lesenswert?

Wenn du dir eine Funktion lcdSendNibble schreibst, und diese konsequent, 
auch bei der Initialisierung, in deinem Code verwenden, dann brauchst 
du, sollten sich die Pins mal ändern nicht den gesamten Code anpassen.

von Peter D. (peda)


Lesenswert?


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
Noch kein Account? Hier anmelden.