Forum: Projekte & Code [ASM & C] HD44780 an PIC24 (3.3V oder 5V)


von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

Ich habe einen Code für den PIC24 in ASM geschrieben um ein HD44780 
kompatibles LCD im 4 bit Modus anzusteuern. Ich habe erst einen Code für 
den PIC24FV32KA302 geschrieben, da dieser mit 5V läuft.
Dann habe ich mich entschieden, dem LCD eine negative Kontrastspannung 
zu geben und es mit 3.3V zu betreiben. Ich habe dazu die Warteschleifen 
geändert, da der Oszillator auf dem LCD mit 3.3V langsamer läuft.
In diesem Post will ich meinen Code kurz erklären und danach auf dem 
Betreib des LCDs mit 3.3V eingehen.

1.
Zum Code. Ich habe eine eigene ASM Datei für die LCD Routinen erstellt, 
diese wird in die main kopiert oder mit .include "HD44780_3.3V.s" bzw. 
.include "HD44780_5V.s" eingebunden.
Am Anfang wird mit einem .equ. die CPU Frequenz definiert. Aus dieser 
berechnet der linker dann die Werte für die delay-Schleifen. Theoretisch 
sollte das bis 140MHz funktionieren. Danach wird für jedes der Daten- 
und Steuerbits der Pin definier. Zum Beispiel so:
1
.equ F_CPU, 32000000
2
3
.equ LCD_D7_LAT, LATB
4
.equ LCD_D7_BIT, 7
5
.equ LCD_D6_LAT, LATB
6
.equ LCD_D6_BIT, 6
7
.equ LCD_D5_LAT, LATB
8
.equ LCD_D5_BIT, 5
9
.equ LCD_D4_LAT, LATB
10
.equ LCD_D4_BIT, 4
11
.equ LCD_En_LAT, LATB
12
.equ LCD_En_BIT, 3
13
.equ LCD_RS_LAT, LATB
14
.equ LCD_RS_BIT, 2

Dann wir die Init aufgerufen. Man muss die Pins nicht vorher als Ausgang 
definieren. Das wird in der Init automatisch gemacht.

Danach können die Funktionen LCD_Cmd, LCD_Char und LCD_Str mit call 
aufgerufen werden:
-LCD_Cmd sendet den Inhalt des Arbeitsregister W0 als Befehl (RS=0) ans 
LCD
-LCD_Char sendet den Inhalt des Arbeitsregister W0 als Daten (RS=1) ans 
LCD
-LCD_Str sendet eine String ans LCD. Die Staradresse der String muss im 
Arbeitsregister W0 stehen. Die String muss nullterminiert sein.

Im Anhang: Ein kleiner Code der zeigt wie man eine String mit dem 
PIC24F16KA102 in der zweiten Zeile des LCDs ausgibt und die LCD-Routinen 
mit Delay für 3.3V und 5V

2.
Zum Betreib der HD44780 LCDs mit 3.3V gibt es hier etwas zu lesen: 
http://www.sprut.de/electronic/lcd/#strom
Ich kenne zwei relativ einfache Schaltungen um die negative 
Kontrastspannung zu erzeugen:
Die Erste ist, wie auf der oben verlinkten Seite beschrieben, ein 
Ladungspumpen IC wie z.B. der ILC7660.
Die zweite Möglichkeit ist eine diskret aufgebaute Ladungspumpe, die 
ihren Takt von einem PWM Pin des µC bekommt (Schaltung im Anhang). Die 
Ausgansspannung dieser Ladungspumpe wir über die Frequenz gesteuert. Ich 
habe die Schaltung mit dem eingetragenen Werten so mit einem 
PIC18LF25k22 getestet. Die nötige Frequenz wurde im Simulator 
experimentell bestimmt, man könnte sie sicher auch berechnen. Die zweite 
Lösung hat dem Vorteil, dass sie kleiner ist und man kann, wenn man 
einen Temperatursensor an dem PIC hängt die Kontrastspannung für die 
momentane Temperatur anpassen.

: Bearbeitet durch User
von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

Heute gibt's noch einen Code in C (XC16) für ein HD44780 LCD mit dem 
PIC24. Die Delays sind für den 3.3V Betreib ausgelegt, sie funktionieren 
natürlich auch bei 5V, brauchen dann aber länger als nötig.
Zur Anwendung:
In der Header Datei werden die Oszillatorfrequenz und die Pins an denen 
das LCD hängt definiert.

Als erstes muss die Funktion LCD-Init(); aufgerufen werden.
Dann können die Funktionen verwendet werden. Hier eine kurze 
Beschreibung der wichtigsten:
1
coid LCD_Clr(void)
Löscht das gesamte LCD
1
void LCD_Text(unsigned char row, unsigned char column, char * text)
Gibt eine nullterminierten String aus. Der Text beginnt in der Spalte 
"column" der Zeile "row".
1
void LCD_Gen_Char(unsigned char number, unsigned char *code)
Schreibt ein benutzerdefiniertes Zeichen ins LCD. "number" ist die 
Nummer des Zeichens im CGRAM, "code" ist das Bitmuster als unsigned char 
Array mit der Länge 8.
1
void LCD_Char(unsigned char row, unsigned char column, unsigned char text)
Diese Funktion gibt ein einzelnes Zeichen in der Spalte "column" der 
Zeile "row" aus.

Ein Beispiel zur Verwendung der Funktionen findet ihr in der angehängten 
main.c

: Bearbeitet durch User
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.