MikroForth LCD mit I2C

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Didi
Beiträge: 9
Registriert: Mi 28. Nov 2012, 15:08

MikroForth LCD mit I2C

Beitrag von Didi » Mo 14. Jan 2013, 18:39

Heute möchte ich eine LCD-Ansteuerung über I2C vorstellen.

Die LCD-Anzeige ist dabei über ein bei Pollin erhältliches LCD-I2C Adaptermodul mit PCF8574P angeschlossen.

Es sind zwei neue Forth (A) Worte hinzugekommen.

swapnibble (b1b2 --- b2b1) tauscht unteres gegen oberes Halbbyte b1 b2
_zero (a1a2a3 --- a1a2a3) entfernt führende Nullen (a3,a2) durch Ersatz mit Leerzeichen (ASCII 32) a1,a2,a3 --> ASCII Zeichen

Forth Programm:
Forth-Wörter:

: lcdsend i2cstart 78 i2cwrite drop i2cwrite drop i2cstop ;
: lcdenable dup 64 or lcdsend 191 and lcdsend ;
: lcdcommand dup swapnibble 15 and dup lcdsend lcdenable 15 and dup lcdsend lcdenable ;
: lcddata dup swapnibble 15 and 16 or dup lcdsend lcdenable 15 and 16 or dup lcdsend lcdenable ;
: lcdinit 1 wait 3 1 do 3 dup lcdsend lcdenable loop 2 dup lcdsend lcdenable 40 lcdcommand 12 lcdcommand 6 lcdcommand ;
: lcdclear 1 lcdcommand ;
: lcdhome 2 lcdcommand ;
: blein 127 lcdsend ;
: blaus 128 lcdsend ;
: Ausgabe 3 1 do lcddata loop ;
: lcdnum 3 1 do 10 / 48 + swap loop drop _zero ;
: .S stackcount 40 lcddata 48 + lcddata 41 lcddata ;
: Locate 128 + swap 64 * 65 - + lcdcommand ;

Hauptprogramm:

: main blein lcdinit lcdclear lcdhome 255 0 do 1 5 locate i lcdnum ausgabe 2 14 locate .S loop 10 wait blaus end ;

Erlauterung der Befehle:

lcdsend (B -- ) sendet ein Byte zur LCD-Anzeige über I2C (78 ist in diesem Fall die Adresse des Adaptermoduls) kann geändert werden,

lcdenable (B -- ) sendet den Enableimpuls für die LCD-Anzeige über I2C (B - Byte vom vorherigem lcdsend),

lcdcommand (C -- ) splittet das Kommandobyte C in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (Kommandobyte siehe Datenblatt
der LCD-Anzeige R/S=0),

lcddata (D -- ) splittet das Datenbyte D in oberes und unteres Nipple auf und sendet es über I2C zur Anzeige (R/S=1),

lcdinit ( -- ) initialisiert die LCD Anzeige (in diesem Fall 4-Bitmodus, 2-zeilig, Curser-aus, Blinken-aus) aus Datenblatt der LCD ersichtlich,

lcdclear ( -- ) löscht die LCD-Anzeige,

lcdhome ( -- ) setz den Curser auf Zeile 1 Spalte 1,

blein ( -- ) schaltet die Hintergrundbeleuchtung ein,

blaus ( -- ) schaltet die Hintergrundbeleuchtung aus,

Ausgabe (abc -- ) gibt die obersten drei Byte vom Stack aus,

lcdnum (z -- A1A10A100) wandelt eine Zahl z (Byte) in 3 ASCII-Zeichen (3 Byte) um,

.S ( -- ) gibt die Stacktiefe in Form von (Z) aus,

locate (zs -- ) setzt den Curser auf Zeile,Spalte,

Hauptprogramm (main):

1. Hintergrundbeleuchtung einschalten

2: LCD initialisieren

3: LCD löschen

4. Curser auf Zeile 1, Spalte1 setzen

5. eine Schleife von 0 bis 255 beginnen

6. Curser auf Zeile 1 Spalte 5 setzen

7. Schleifenindex i holen

8. Schleifenindex in ASCII umwandeln, führende Nullen ausblenden

9. auf LCD ausgeben

10. Curser auf Zeile 2 Spalte 14 setzen

11. Stacktiefe ausgeben

12. Schleife wiederholen bis 255

13. 10 Sekunden warten

14. Hintergrundbeleuchtung ausschalten

15. Ende

Die Initialisierung der LCD-Anzeige funktioniert mit einem 2-zeiligen LCD sowie einem 1-zeiligen LCD (16 Zeichen).

Bei manchem 1-zeiligen LCD's müssen die Stellen 9 bis 16 mit 2 1 locate bis 2 8 locate addressiert werden.

Leider weiss ich nicht wie und ob ich hier eine Datei anhängen kann, dann könnte ich die entsprechende forthvok.vok anhängen.

Momentan kann ich sie per E-Mail versenden. Bitte bei mir melden. (dieterhaeussler@freenet.de)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast