Forum: Mikrocontroller und Digitale Elektronik LCD Display programmieren in C


von Patrick S. (patrick_s)


Lesenswert?

Habe folgende Frage:

Ich habe mir ein kleines LCD-Display zugelegt (Powertip PC1604A-P3), 
Habe mir mit einem PIC18F46K22 eine Echtzeituhr mit einem Uhrenquarz an 
Timer0 in C gebastelt.

Jetzt möchte ich die Uhrzeit auf dem LCD-Display ausgeben.
Gibt es Bibliotheken in C die die Ausgabe erleichtern oder muss ich sie 
mir selbst programmieren und wie funktioniert das in C?
Wie funktioniert auch die Ausgabe?

Dank im Vorraus

von Karl H. (kbuchegg)


Lesenswert?

Patrick Schwarz schrieb:

> Jetzt möchte ich die Uhrzeit auf dem LCD-Display ausgeben.
> Gibt es Bibliotheken in C die die Ausgabe erleichtern oder muss ich sie
> mir selbst programmieren und wie funktioniert das in C?

Du kannst einen String ausgeben?
1
   char OutString[20] = "Hallo World";
2
   lcd_string( OutString );
Dann kannst du im einfachsten 'Faulsein-Fall' zb das hier machen
1
   char OutString[20];
2
3
   sprintf( OutString, "%02d:%02d - %02d", (int)Hour, (int)Minute, (int)Second );
4
   lcd_string( OutString );

sprintf ist ein Universal-Arbeitspferd und demenstprechend langsam und 
umfangreich. Wenn Programmgröße kein Problem darstellt und auch die 
Laufzeit kein Thema ist, kann man es benutzen.
Wenn nicht, dann macht man sich eben selbst eine Funktion dafür.

von Elko4 (Gast)


Lesenswert?

Hi,
du könntest den Quellcode von

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

nehmen.

Musst allerdings die verwendetet Datentypen anpassen
(also z.B. "unsigned char" anstatt "uint8_t")
und du musst dir die beidne delay Funktionen (_delay_ms(), delay_us() ) 
noch schreiben.

Hab ich bei meinem aktuellen pic Projekt mit nem PIC18F26K20 auch so 
gemacht und es funktioniert einwandfrei.

MfG Elko

von Patrick S. (patrick_s)


Lesenswert?

>Du kannst einen String ausgeben?
>   char OutString[20] = "Hallo World";
>   lcd_string( OutString );
>Dann kannst du im einfachsten 'Faulsein-Fall' zb das hier machen
>   char OutString[20];

>   sprintf( OutString, "%02d:%02d - %02d", (int)Hour, (int)Minute, 
>>>>>>>>(int)Second );
>   lcd_string( OutString );

Wie zentriere ich dann die Schrift d.h. wie füge ich zusätzlich 
Leerzeichen ein? (Tut mir leid ich habe von der Ausgabe auf ein LCD 
Bildschirm wirklich keine Ahnung)

von Smörre R. (smoerre)


Lesenswert?

Mit time.h, conio.h und stdio.h kannst Du Dir was basteln ... dann fehlt 
aber noch der Treiber und der dürfte knifflig werden.

Hier findest Du die Standard-Headerdateien:
http://www2.informatik.uni-halle.de/lehre/c/c_header.html

Für den 18F46K22 wirst Du selbst eine Headerdatei schreiben müssen, 
siehe auch:
http://www.ccsinfo.com/forum/viewtopic.php?t=30964
Der hat einen 18F452 verwendet.

von Patrick S. (patrick_s)


Lesenswert?

Header Dateien sind nicht das Problem ich besitze in C die Header Datei 
von PIC18F452, PIC18F4550, PIC18F46K20 und PIC18F46K22

Die Modifizieung fällt mir daher nicht schwer!

Viel mehr ist das Problem, dass ich die Logik hinter der LCD-Ansteuerung 
verstehe!

von Smörre R. (smoerre)


Lesenswert?

> Hab ich bei meinem aktuellen pic Projekt mit nem PIC18F26K20 auch so
> gemacht und es funktioniert einwandfrei.
das ist dann aber eher Zufall bzw. ungewollte Kompatibilität des obigen 
Pics mit der avr.h Headerdatei.

von Smörre R. (smoerre)


Lesenswert?

> Viel mehr ist das Problem, dass ich die Logik hinter der LCD-Ansteuerung
> verstehe!
Die sind ja in lcd-routines.h aus 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
relativ verständlich dokumentiert.
Allerdings mußt Du sie auf Dein Display anpassen, wenn Du ein Datenblatt 
zum Powertip PC1604A-P3 hast ?

von Patrick S. (patrick_s)


Lesenswert?

Es ist nicht ein gewöhnliches Display, denn es ist 16x4, die meisten 
sind 20x4 oder 16x2

http://www.farnell.com/datasheets/50577.pdf

aber ich habe bei einem Beispiel gesehen, dass dies nicht viel ändert 
nur 3-4 Änderungen im gesamten Code

von Smörre R. (smoerre)


Lesenswert?

> aber ich habe bei einem Beispiel gesehen, dass dies nicht viel ändert
> nur 3-4 Änderungen im gesamten Code
Im Prinzip kannst Du die Headerdateien aus dem obigen Projekt für den 
HD44780
ansatzweise (wobei die Betonung auf Ansatz liegt) übernehmen, da dieses 
Display ja nur eine 5x8 Punktmatrix bringt und dann heißt es tüfteln und 
Anpassungen schreiben ... oder es hat schon mal jemand anderes mit 
Deinem Display was versucht.

von Smörre R. (smoerre)


Lesenswert?

ich weiß nicht ob es hilft, aber es scheint mit Deinem Display schon 
Ansteuerungsversuche gegeben zu haben:
http://esd.et.ntust.edu.tw/downloads/2012_Embedded_system/doc3adc0c9faa1f4.pdf

von Karl H. (kbuchegg)


Lesenswert?

Patrick Schwarz schrieb:

> Wie zentriere ich dann die Schrift d.h. wie füge ich zusätzlich
> Leerzeichen ein?

Das ist jetzt aber weniger eine Frage der LCD Ausgabe, sondern eine 
Frage dessen wie "gut" deine C-Kentnisse bzw. deine Fähigkeiten in 
grundlegender Mathematik sind, die jeder Grundschüler in der 3. Klasse 
beherrscht.

> (Tut mir leid ich habe von der Ausgabe auf ein LCD
> Bildschirm wirklich keine Ahnung)

Es ist ganz einfach:
Da sind 16 Ausgabepositionen pro Zeile.
An jede Ausgabeposition kannst du ein Zeichen malen lassen.

Wenn du also einen Text, der zum Beispiel 12 Zeichen lang ist, auf 16 
Ausgabepositionen so ausgeben willst, dass er zentriert in der Mitte 
steht, in welcher Spalte musst du dann mit der Ausgabe anfangen, damit 
sich das genau so ausgeht, wie du das haben willst und der 12-Zeichen 
lange Text in der Mitte auftaucht?

> Viel mehr ist das Problem, dass ich die Logik hinter
> der LCD-Ansteuerung verstehe!

Es ist genau dieselbe Logik, mit der man auf karriertem Papier "Muster" 
macht, indem man in einige Kästchen ein 'x' malt und den Inhalt von 
anderen Kästchen dadurch 'löscht', in dem man mit TippEx ein 
'Leerzeichen' drübermalt. Alles darüber hinausgehende, das du gerne 
hättest, ist dein Bier und wird von dir programmiert. Und im Regelfall 
reicht das auch. Denn auf so einem Text-LCD kann man sowieso keine 
wahnsinnig aufregende Grafiken machen. Das geht schon rein aus 
technischen Gründen nicht.

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.