
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo OMacro_OMicro Anwender, im Januar 2013 hatte Dietmar mein Anwenderprojekt "Text-LC-Displays" hier in http://om.dharlos.de/frameset.htm unter Karteikarte Projekte//Anwenderprojekte//Text-LC-Displays eintragen. Derzeit arbeite ich an einer Anwendung, bei der ich ein 2704 LCD Zeichendisplay (27 Zeichen, 4 Zeilen) mittles Portexpander PCF8574 und einer OMacro ansteuern wollte. Leider hat das mit dem damals vorgestellten Programm I2C_4X27.BAS und einer Ansteuerung mit OMacro jetzt nicht mehr funktioniert. Es kommt immer die Meldung NACK. Die OMacro enpfaengt also kein Acknowledge vom PCF8574. Ob es damals funktioniert hatte, weiss ich nicht mehr. Wenn ich die Anordnung LCD&PCF8574 mit einer OMicro und dem gleichen Programm ansteuere, funktioniert es jedoch einwandfrei. Mein urspruengliches Programm von 2013 war abgeleitet von der Vorlage I2CLCD.BAS erstellt von Dietmar Harlos. Einen Hardwarefehler meiner Anordnung LCD&PCF8574 u. Ansteuerung kann ich ausschliessen. Hier im Anhang das leicht modifizierte Programm I2C27NE3.BAS von damals. Nachdem ich keine Loesung fand die auf dem Weg funktionierte, habe ich ein neues Programm erstellt EXTLCD03.BAS. Als Vorlage benutzte ich EXTLCD.BAS erstellt von Dietmar Harlos. Mit dem P-Code funktioniert jetzt die Ansteuerung des 2704-LCD Displays. Vielleicht findet jemand noch die Ursache und eine Erklärung, warum es mit dem P-Code I2C_4X27.BAS und Ansteuerung durch OMicro funktioniert u. mit OMacro aber die Meldung NACK kommt! Eine weitere Frage ist bei diesem P-Code, warum die IF Flag_1 Abfrage im Teil der LCD Routine nicht benutzt werden kann. Dies war sowohl mit OMicro als auch OMacro der Fall. Liegt es am SYS Aufruf oder an etwas anderem? wuensche viel Spass mit den OMicros bis OMaxis Joe Fenk #### Anhang 1= EXTLCD03.BAS ### ' EXTLCD03.BAS von J_Fenk Mi. 12.09.2018 ' nun mit vereinfachter u. kompakter LCD Routine ' Zeile 1 und 2 und auch 3 u 4 mit Text beschrieben funktioniert ' belegt sind 1218 Basic Bytes; 0 Sys Bytes; 5 RAM Bytes ' --------------------------------------------------------- ' LCD-Display WD-C2704M-HNN mit 4 Zeilen x 27 Zeichen LCD erworben ' im Jahr 2004 v Fa. Pollin, ist aber 2018 nicht mehr verfuegbar ' LCD hatte 2 getrennte Controller fÂr obere/untere Displayhaelfte ' und muss mittels E oder E2 beschrieben werden ' ------------------------------- ' EXTLCD03.BAS beruht auf Prog.-Vorlage EXTLCD.BAS von Dietmar Harlos ' ca. 2006 von ihm erstellt zu finden im Download Bereich ccintern.dharlos.de ' Demo fuer Extended Ports: LCD per Extended Port mit PCF8574 ansteuern ' In OCBASIC fuer Open-Macro ' Die Portbelegung und die Struktur der ' Softwareroutinen entspricht der des Standard-LCDs an BYTEPORT[2] ' der C-Control-I Version 1.1. ' ----------------------------------------------------------------- ' Das LCD ist mit dem PCF8574 auf die gleiche Weise verbunden wie auf dem ' I2C-LCD von Conrad Electronic (Bestellnr. 198330). Aufgebaut habe ich ' eine kleine add-on Lochraster Platine mit PCF8574 zum oben beschriebenen ' LCD-Modul mit einer 4 poligen Verbindung an Pin5/PTA4/PORT[5]/SCL=gruen ' und Pin4/PTA5/PORT[6]/SDA=gelb und (+), GND zum der Open-Macro Board ' Belegung Steckverbinder: ' Pin Verbindung zu O-Macro Board ' 1 GND= schw Ltg ' 2 Vcc=5V=rote Ltg ' 3 Pin5/PTA4/PORT[5]/SCL=gruene Ltg ' 4 Pin4/PTA5/PORT[6]/SDA=gelbe Ltg ' ---------------------------------------------------------------------- ' PCF8574 | LCD Belegung ' ---------------------------------------------------------------------- ' Por Pin | Por Pin '---------------------- ' P0 4 | DB4 07 \ ' P1 5 | DB5 08 \ die oberen 4 Bits ' P2 6 | DB6 09 / vom 8-Bit-Datenbus ' P3 7 | DB7 10 / ' P4 9 | R/W 05 -- Lesen (1) oder Schreiben (0) ' P5 10 | RS 04 -- Daten (1) oder Instruktion (0) uebermitteln ' P6 11 | EN 06 -- Daten bei fallender Flanke (1 nach 0) uebernehmen ' P7 12 | EN2 -- reserviert fuer 2. Enable-Leitung einiger LCDs ' --------------------------------------------------------------------------- INCLUDE "OMAC.DEF" 'Definitionen fuer OMACRO; Include Datei vom 20.4.2010 '-----Definition von Variablen DEFINE Flag BYTE DEFINE flag_1 BIT[1] OF Flag 'eine Bitvariable DEFINE a BYTE DEFINE b BYTE DEFINE c BYTE 'ein paar Variablen DEFINE temp BYTE 'fuer LCD-Routinen Daten Uebergabe variable '***** Definition der Ausgabeports des PCF8574 DEFINE lcd_port BYTEPORT[5] 'das LCD ist am Extended Byteport angeschlossen DEFINE lcd_db4 PORT[33] '\ DEFINE lcd_db5 PORT[34] ' \ die oberen 4 Bits DEFINE lcd_db6 PORT[35] ' / vom 8-Bit-Datenbus DEFINE lcd_db7 PORT[36] '/ DEFINE lcd_rw PORT[37] 'Read/Write-Leitung DEFINE lcd_rs PORT[38] 'Daten/Instruktion-Leitung DEFINE lcd_e PORT[39] 'Enableleitung Zeile 1 u 2 DEFINE lcd_e2 PORT[40] 'e2 == fuer Zeile 3 u. 4 ' --------------------------------------------------------------------------- ' Die Erweiterung fuer Extended Ports einbinden ' --------------------------------------------------------------------------- INCLUDE "extports.iia" ' --------------------------------------------------------------------------- ' Das Hauptprogramm ' --------------------------------------------------------------------------- #main URTOK=ON 'Erweiterung fuer Extended Ports aktivieren PrintSpc=ON End2Host=ON WHILE TRUE Flag_1=0 'Zeile 1 u 2 beschreiben GOSUB lcd_init 'I2C-Bus und LCD Zeile 1 u. 2 initalisieren PRINT " Zeile 1 u 2" ' 1. Zeile beschreiben lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "I" '1 lcd_writechar "2" '2 lcd_writechar "C" '3 lcd_writechar "&" '4 lcd_writechar "4" '5 lcd_writechar "x" '6 lcd_writechar "2" '7 lcd_writechar "7" '8 lcd_writechar " " '9 lcd_writechar "L" '10 lcd_writechar "C" '1 lcd_writechar "D" '2 lcd_writechar " " '3 lcd_writechar "D" '4 lcd_writechar "i" '5 lcd_writechar "s" '6 lcd_writechar "p" '7 lcd_writechar "l" '8 lcd_writechar "a" '9 lcd_writechar "y" '20 lcd_writechar " " '1 lcd_writechar "T" '2 lcd_writechar "e" '3 lcd_writechar "s" '4 lcd_writechar "t" '5 lcd_writechar "s" '6 lcd_writechar "!" '7 ' 2. Zeile beschreiben lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "W" '1 lcd_writechar "D" '2 lcd_writechar "-" '3 lcd_writechar "C" '4 lcd_writechar "2" '5 lcd_writechar "7" '6 lcd_writechar "0" '7 lcd_writechar "4" '8 lcd_writechar "M" '9 lcd_writechar "-" '10 lcd_writechar "1" '1 lcd_writechar "H" '2 lcd_writechar "N" '3 lcd_writechar "N" '4 lcd_writechar " " '5 lcd_writechar "v" '6 lcd_writechar "o" '7 lcd_writechar "m" '8 lcd_writechar " " '9 lcd_writechar "J" '20 lcd_writechar "a" '1 lcd_writechar "h" '2 lcd_writechar "r" '3 lcd_writechar "2" '4 lcd_writechar "0" '5 lcd_writechar "0" '6 lcd_writechar "4" '7 Pause 100 ' 3. Zeile beschreiben Flag_1=ON GOSUB lcd_init 'I2C-Bus und LCD Zeile 3 u. 4 initalisieren PRINT " Zeile 3 u 4" lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "I" '1 lcd_writechar "2" '2 lcd_writechar "C" '3 lcd_writechar "&" '4 lcd_writechar "4" '5 lcd_writechar "x" '6 lcd_writechar "2" '7 lcd_writechar "7" '8 lcd_writechar " " '9 lcd_writechar "L" '10 lcd_writechar "C" '1 lcd_writechar " " '2 lcd_writechar "D" '3 lcd_writechar "i" '4 lcd_writechar "s" '5 lcd_writechar "p" '6 lcd_writechar "l" '7 lcd_writechar "a" '8 lcd_writechar "y" '9 lcd_writechar " " '20 lcd_writechar "T" '1 lcd_writechar "e" '2 lcd_writechar "s" '3 lcd_writechar "t" '4 lcd_writechar " " '5 lcd_writechar "2" '6 lcd_writechar "7" '7 ' 4-te Zeile beschreiben lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "W" '1 lcd_writechar "D" '2 lcd_writechar "-" '3 lcd_writechar "C" '4 lcd_writechar "2" '5 lcd_writechar "7" '6 lcd_writechar "0" '7 lcd_writechar "4" '8 lcd_writechar "M" '9 lcd_writechar "-" '10 lcd_writechar "1" '1 lcd_writechar "H" '2 lcd_writechar "N" '3 lcd_writechar "N" '4 lcd_writechar " " '5 lcd_writechar "7" '6 lcd_writechar "0" '7 lcd_writechar "4" '8 lcd_writechar "M" '9 lcd_writechar "-" '20 lcd_writechar "1" '1 lcd_writechar "H" '2 lcd_writechar "N" '3 lcd_writechar "N" '4 lcd_writechar " " '5 lcd_writechar "7" '6 lcd_writechar "0" '7 PAUSE 250 WEND END ' --------------------------------------------------------------------------- ' Diese LCD-Routinen beschreiben Zeile 1 u 2 mit Flag_1=OFF=0 u. Enable=e ' und Zeile 3 u 4 mit Flag_1=ON=-1 u Enable2=e2 ' --------------------------------------------------------------------------- PROCEDURE lcd_init 'Vorgeschriebene Verzoegerung fuer das LCD PAUSE 2 '8-Bit-Modus aktivieren lcd_writecmd &h38 '==&b0011 1000==function set 'mit 8-Bit-Command in 4-Bit-Modus umschalten IF Flag_1=0 THEN lcd_port=&b01000010 'EN auf high==&h42 lcd_e=OFF ELSE lcd_port=&b10000010 'EN2 auf high==&h42 lcd_e2=OFF ENDIF 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 '==&b0010 1000 lcd_writecmd &h0c '==&b0000 1100 'LCD loeschen lcd_cls RETURN END PROCEDURE PROCEDURE lcd_cls lcd_writecmd &h02 'return home lcd_writecmd &h01 'clear screen RETURN END PROCEDURE PROCEDURE lcd_writecmd(temp) IF Flag=0 THEN lcd_port=temp shr 4 or &b01000000 'High-Nibble, EN auf high lcd_e=OFF 'EN auf low lcd_port=temp and &h0f or &b01000000 ' Low-Nibble, EN auf high lcd_e=OFF ELSE lcd_port=temp shr 4 or &b10000000 'High-Nibble, EN2 auf high lcd_e2=OFF 'EN2 auf low lcd_port=temp and &h0f or &b10000000 ' Low-Nibble, EN2 auf high lcd_e2=OFF ENDIF RETURN END PROCEDURE PROCEDURE lcd_writechar(temp) IF Flag=0 THEN lcd_port=temp shr 4 or &b01100000 'High-Nibble, EN auf high lcd_e=OFF lcd_port=temp and &h0f or &b01100000 ' Low-Nibble, EN auf high lcd_e=OFF ELSE lcd_port=temp shr 4 or &b10100000 'High-Nibble, EN2 auf high lcd_e2=OFF lcd_port=temp and &h0f or &b10100000 ' Low-Nibble, EN2 auf high lcd_e2=OFF ENDIF RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Die von "extports.iia" benoetigten INCLUDE-Dateien einbinden ' --------------------------------------------------------------------------- ' Die I2C-Routinen einbinden, welche Byteport[1] u Pin4=Port6=SDA u Pin5=Port5=SCL ' --------------------------------------------------------------------------- INCLUDE "om_i2c.pro" 'dies benutzen, wenn Pin4/Port6/SDA u Pin5/Port5/SCL benutzt ' --------------------------------------------------------------------------- ' Die I2C-Routinen fuer BYTEPORT[2] einbinden & Pin6=Port14=SDA u. Pin7=Port13=SCL ' --------------------------------------------------------------------------- 'INCLUDE "om_i2c_b.pro" 'dies benutzen, wenn Pin6/Port14/SDA u Pin7/Port13/SCL ' --------------------------------------------------------------------------- ' Die I2C-Routinen fuer BYTEPORT[3] einbinden & Pin2=Port14=SDA u. Pin3=Port13=SCL ' --------------------------------------------------------------------------- 'INCLUDE "om_i2c_c.pro" 'dies benutzen, wenn Pin2/Port14/SDA u Pin3/Port13/SCL ' ---------------------------------------------------------------- ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro" #### Anhang 2 von Jan 2013 = I2CI2C27NE3.BAS ### ' I2C27NE3.BAS von J_Fenk Mi. 12.09.2018 ' basiert auf I2C27NE3.BAS im Ordner OMICRO ' !!!! mit OMACRO kommt immer Meldung NACK obwohl die Kennung ' in INCLUDE "extports.iia" stimmt, die Ursache konnte ich nicht finden ' bei Ansteuerung des PCF8574 u. LCD Aufbaus mit OMICRO kommt keine ' Meldung NACK ' belegt sind 1228 Basic Bytes; 0 Sys Bytes; 5 RAM Bytes '--------------------------------------------- ' Hinweise hier beziehen sich auf OMICRO Anwendung ' 4 Zeilen x 27 Zeichen LCD Display WD-C2704M-HNN; ' nun mit Flag_1 fuer Verzweigung gemacht in LCD Routinen Zeile 199 ' das funktionert jedoch nicht, es muss fuer Zeile 1/2 und 3/4 separate ' Anweisungen geben, so wie es jetzt ist, funktioniert es mit OMICRO ' _____________________________________________________________ ' Test mit eingefuegtem Teil INCLUDE "extports.iia"==> ' damit wird Zeile 1 falsch beschrieben und Zeile 2, 3,4 gar nicht ' ______________________________________________________ ' 2 getrennte Controller fÂr obere/untere Displayhaelfte ' mittels E1 oder E2 angesprochen ' ------------------------------------------------ ' abgeaendert von J Fenk Mi.09.01.13 I2C_4X27.BAS; als Vorlage ' nicht auf Org_DHarlos EXTLCD.BAS sondern auf I2CLCD.BAS benutzt im Ordner ' O_MICRO//DH_DOWNL//I2CBUSR// '-------------------------------------------------------------------------- ' LCD ueber I2C-Bus mittels Portexpander PCF8574 ansteuern ' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi von Dietmar Harlos. ' --------------------------------------------------------------------------- ' Das LCD ist mit dem PCF auf die gleiche Weise verbunden wie auf dem ' I2C-LCD von Conrad Electronic (Bestellnr. 198330). Eine kleine Platine ' fuer das LCD u. dem PCF8574 mit Verbindung an Pin3/ PTA4 (PORT[5], SCL) und ' Pin2/PTA5 (PORT[6], SDA) der Open-Micro wurde auf einem Stueck Lochrasterplatine ' aufgebaut. ' PCF8574 | LCD Belegung ' ---------------------------------------------------------------------- ' P0 4 | DB4 11 \ ' P1 5 | DB5 12 \ die oberen 4 Bits ' P2 6 | DB6 13 / vom 8-Bit-Datenbus ' P3 7 | DB7 14 / ' P4 9 | R/W 5 -- Lesen (1) oder Schreiben (0) ' P5 10 | RS 4 -- Daten (1) oder Instruktion (0) uebermitteln ' P6 11 | EN1 6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen ' P7 12 | EN2 7 -- reserviert fuer 2. Enable-Leitung einiger LCDs ' --------------------------------------------------------------------------- INCLUDE "OMAC.DEF" 'OMACRO Include Datei vom 20.4.2010 'INCLUDE "om.def" 'Definitionen fuer Open-Micro und Open-Mini DEFINE Flag BYTE 'Byte fuer Flag Bits DEFINE flag_1 BIT[1] OF Flag 'eine Bitvariable DEFINE a BYTE DEFINE b BYTE DEFINE c BYTE 'ein paar Variablen DEFINE temp BYTE 'fuer LCD-Routinen ' --------------------------------------------------------------------------- '!!!!!! sobald dieser Teil unten eingefuegt ist wird LCD Display nicht ' mehr richtig beschrieben bei OMICRO Anwendung ' ---Anfang des eingefuegten Codes------------------------------------------------------------------------ ' Die Erweiterung fuer Extended Ports einbinden ' --------------------------------------------------------------------------- 'INCLUDE "extports.iia" ' --------------------------------------------------------------------------- '#main 'URTOK=ON 'Erweiterung fuer Extended Ports aktivieren 'PrintSpc=ON 'End2Host=ON ' --- Ende des eingefuegten Codes ------------------------- PRINT "I2C27NE3.BAS" PrintSpc=ON End2Host=ON WHILE TRUE Flag_1=OFF ' nur Zeile 1 u. 2 lcd_init 'I2C-Bus initalisieren, PCF anmelden, Pause 2 lcd_cls ' LCD loeschen ' 1. Zeile beschreiben PRINT "Zeile 1, Flag=";Flag_1 lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "I" '1 lcd_writechar "2" '2 lcd_writechar "C" '3 lcd_writechar "&" '4 lcd_writechar "4" '5 lcd_writechar "x" '6 lcd_writechar "2" '7 lcd_writechar "7" '8 lcd_writechar " " '9 lcd_writechar "L" '10 lcd_writechar "C" '1 lcd_writechar " " '2 lcd_writechar "D" '3 lcd_writechar "i" '4 lcd_writechar "s" '5 lcd_writechar "p" '6 lcd_writechar "l" '7 lcd_writechar "a" '8 lcd_writechar "y" '9 lcd_writechar " " '20 lcd_writechar "T" '1 lcd_writechar "e" '2 lcd_writechar "s" '3 lcd_writechar "t" '4 lcd_writechar " " '5 lcd_writechar " " '6 lcd_writechar " " '7 Pause 250 ' 2. Zeile beschreiben PRINT "Zeile 2;Flag=";Flag_1 lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar "W" '1 lcd_writechar "D" '2 lcd_writechar "-" '3 lcd_writechar "C" '4 lcd_writechar "2" '5 lcd_writechar "7" '6 lcd_writechar "0" '7 lcd_writechar "4" '8 lcd_writechar "M" '9 lcd_writechar "-" '10 lcd_writechar "1" '1 lcd_writechar "H" '2 lcd_writechar "N" '3 lcd_writechar "N" '4 PAUSE 250 ' 3. Zeile beschreiben Flag_1=ON ' nun Zeile 3,4 PRINT "Zeile 3; Flag=";Flag_1 lcd_cls_34 lcd_init_34 'I2C-Bus initalisieren, PCF anmelden, lcd_cls_34 ' LCD loeschen PAUSE 2 ' LCD initialisieren und loeschen lcd_writecmd_34 &h80 'Kommando "Set DD-RAM address" zum LCD senden lcd_writechar_34 "4" '1 lcd_writechar_34 " " '2 lcd_writechar_34 "Z" '7 lcd_writechar_34 "e" '8 lcd_writechar_34 "i" '9 lcd_writechar_34 "l" '10 lcd_writechar_34 "e" '2 lcd_writechar_34 "n" '3 lcd_writechar_34 " " '4 lcd_writechar_34 "&" '5 lcd_writechar_34 " " '6 lcd_writechar_34 "2" '7 lcd_writechar_34 "7" '8 lcd_writechar_34 " " '9 lcd_writechar_34 "Z" '20 lcd_writechar_34 "e" '1 lcd_writechar_34 "i" '2 lcd_writechar_34 "c" '3 lcd_writechar_34 "h" '4 lcd_writechar_34 "e" '5 lcd_writechar_34 "n" '6 Pause 250 WEND WHILE TRUE PRINT "Neustart" Flag_1=OFF lcd_cls lcd_init 'I2C-Bus initalisieren, PCF anmelden, lcd_cls ' LCD loeschen PAUSE 1 ' LCD initialisieren und loeschen FOR c=0 TO 255 STEP 108 ' lcd_writecmd &h80 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c TO c+26 'da bei mir 27 Zeichen statt 20; muss 26 statt 19 eingetragen werden lcd_writechar a 'ein Zeichen zum LCD senden; es wird die Ordnungszahl NUmmer des ASCIIZeichens geschickt Print "Z1_a=";a 'fuer die Zahl 0 muss also ASCII = 48 gesendet werden Pause 25 NEXT a ' 2. Zeile beschreiben lcd_writecmd &hc0 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c+27 TO c+53 ' da bei mir 27 Zeichen statt 20, muss statt 20 die 54 und c+53 statt 39 eingetragen werden lcd_writechar a 'ein Zeichen zum LCD senden Print "Z2_a=";a IF a=255 THEN GOTO Ende ELSE ENDIF Pause 25 NEXT a Pause 250:Pause 250 ' ab hier Zeile 3 u. 4 Flag_1=ON ' Setzt Flag auf 255 =-1 PRINT "3_4_Flag=";Flag_1 lcd_cls_34 lcd_init_34 'I2C-Bus initalisieren, PCF anmelden, lcd_cls_34 ' LCD loeschen PAUSE 1 ' LCD initialisieren und loeschen ' 3. Zeile beschreiben lcd_writecmd_34 &h80 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c+54 TO c+80 lcd_writechar_34 a 'ein Zeichen zum LCD senden Print "Z3_a=";a Pause 25 NEXT a ' 4. Zeile beschreiben lcd_writecmd_34 &hc0 'Kommando "Set DD-RAM address" zum LCD senden FOR a=c+81 TO c+107 lcd_writechar_34 a 'ein Zeichen zum LCD senden Print "Z4_a=";a Pause 25 NEXT a Pause 200 NEXT c #Ende i2c_stop 'schliesslich PCF vom I2C-Bus abmelden PAUSE 200 WEND END ' --------------------------------------------------------------------------- ' Die LCD-Routinen haben die gleiche Struktur wie auf der C-Control 1.1 ' um den P-Code kompakter zu machen, hatte ich versucht die IF Flag_1 ' Abfrage einzubauen. Damit funktioniert es jedoch nicht; nur mit der ' Routine fuer Zeile 1,2 =lcd_init bzw. Zeile 3,4 lcd_init_34 funktioniert ' es ' --------------------------------------------------------------------------- ' ab hier Zeile 12 PROCEDURE lcd_init 'Vorgeschriebene Verzoegerung fuer das LCD PAUSE 2 'I2C-Bus initialisieren i2c_init 'PCF ueber I2C-Bus aktivieren i2c_start IF NOT i2c_write(&h40) THEN 'I2C-Adresse vom PCF8574 PRINT "NACK" : END END IF '8-Bit-Modus aktivieren lcd_writecmd &h38 ' IF Flag_1=OFF THEN 'mit 8-Bit-Command in 4-Bit-Modus umschalten i2c_write &b01000010 'EN1 auf high i2c_write &b00000010 'EN1 auf low ' ELSE ' i2c_write &b10000010 'EN2 auf high ' i2c_write &b00000010 'EN2 auf low ' ENDIF 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 lcd_writecmd &h0c 'LCD loeschen lcd_cls RETURN END PROCEDURE PROCEDURE lcd_cls 'loescht Zeile 1 u. 2 lcd_writecmd &h02 lcd_writecmd &h01 RETURN END PROCEDURE ' Im folgenden wird die Assemblerroutine i2c_write per SYS- statt mit dem ' GOSUB-Befehl aufgerufen. Das spart einen Stackeintrag auf dem Aufruf-, ' bzw. GOSUB-Stack und ist etwas schneller. '????? mit IF Flag_1 funktioniert es nicht das LCD Display zu beschreiben???? PROCEDURE lcd_writecmd (temp) 'EN1=&b0100 0000 wird geschaltet ' IF Flag_1=OFF THEN SYS i2c_write (temp shr 4 or &b01000000) 'High-Nibble, EN1 auf high SYS i2c_write (temp shr 4 ) 'High-Nibble, EN1 auf low SYS i2c_write (temp and &h0f or &b01000000) ' Low-Nibble, EN1 auf high SYS i2c_write (temp and &h0f ) ' Low-Nibble, EN1 auf low ' ELSE ' SYS i2c_write (temp shr 4 or &b10000000) 'High-Nibble, EN2auf high ' SYS i2c_write (temp shr 4 ) 'High-Nibble, EN2 auf low ' SYS i2c_write (temp and &h0f or &b10000000) ' Low-Nibble, EN2 auf high ' SYS i2c_write (temp and &h0f ) ' Low-Nibble, EN2 auf low ' ENDIF RETURN END PROCEDURE PROCEDURE lcd_writechar (temp) ' ' IF Flag_1=OFF THEN SYS i2c_write (temp shr 4 or &b01100000) 'High-Nibble, EN1 auf high SYS i2c_write (temp shr 4 or &b00100000) 'High-Nibble, EN1 auf low SYS i2c_write (temp and &h0f or &b01100000) ' Low-Nibble, EN1 auf high SYS i2c_write (temp and &h0f or &b00100000) ' Low-Nibble, EN1 auf low ' ELSE ' SYS i2c_write (temp shr 4 or &b10100000) 'High-Nibble, EN2 auf high ' SYS i2c_write (temp shr 4 or &b00100000) 'High-Nibble, EN2 auf low ' SYS i2c_write (temp and &h0f or &b10100000) ' Low-Nibble, EN2 auf high ' SYS i2c_write (temp and &h0f or &b00100000) ' Low-Nibble, EN2 auf low ' ENDIF RETURN END PROCEDURE '************** ab hier Zeile 3 u. 4 ******************* PROCEDURE lcd_init_34 'Vorgeschriebene Verzoegerung fuer das LCD PAUSE 2 'I2C-Bus initialisieren i2c_init 'PCF ueber I2C-Bus aktivieren i2c_start IF NOT i2c_write(&h40) THEN 'I2C-Adresse vom PCF8574 PRINT "NACK" : END END IF '8-Bit-Modus aktivieren lcd_writecmd_34 &h38 ' IF Flag_1=0 THEN 'mit 8-Bit-Command in 4-Bit-Modus umschalten ' i2c_write &b01000010 'EN1 auf high ' i2c_write &b00000010 'EN1 auf low ' ELSE 'mit 8-Bit-Command in 4-Bit-Modus umschalten i2c_write &b10000010 'EN2 auf high i2c_write &b00000010 'EN2 auf low ' ENDIF 'ab jetzt 4-Bit-Modus lcd_writecmd_34 &h28 lcd_writecmd_34 &h0c 'LCD loeschen lcd_cls_34 RETURN END PROCEDURE PROCEDURE lcd_cls_34 lcd_writecmd_34 &h02 lcd_writecmd_34 &h01 RETURN END PROCEDURE ' Im folgenden wird die Assemblerroutine i2c_write per SYS- statt mit dem ' GOSUB-Befehl aufgerufen. Das spart einen Stackeintrag auf dem Aufruf-, ' bzw. GOSUB-Stack und ist etwas schneller. PROCEDURE lcd_writecmd_34 (temp) ' IF Flag_1=0 THEN ' SYS i2c_write (temp shr 4 or &b01000000) 'High-Nibble, EN1 auf high ' SYS i2c_write (temp shr 4 ) 'High-Nibble, EN1 auf low ' SYS i2c_write (temp and &h0f or &b01000000) ' Low-Nibble, EN1 auf high ' SYS i2c_write (temp and &h0f ) ' Low-Nibble, EN1 auf low ' ELSE SYS i2c_write (temp shr 4 or &b10000000) 'High-Nibble, EN2auf high SYS i2c_write (temp shr 4 ) 'High-Nibble, EN2 auf low SYS i2c_write (temp and &h0f or &b10000000) ' Low-Nibble, EN2 auf high SYS i2c_write (temp and &h0f ) ' Low-Nibble, EN2 auf low ' ENDIF RETURN END PROCEDURE PROCEDURE lcd_writechar_34 (temp) ' IF Flag_1=0 THEN ' SYS i2c_write (temp shr 4 or &b01100000) 'High-Nibble, EN1 auf high ' SYS i2c_write (temp shr 4 or &b00100000) 'High-Nibble, EN1 auf low ' SYS i2c_write (temp and &h0f or &b01100000) ' Low-Nibble, EN1 auf high ' SYS i2c_write (temp and &h0f or &b00100000) ' Low-Nibble, EN1 auf low ' ELSE SYS i2c_write (temp shr 4 or &b10100000) 'High-Nibble, EN2 auf high SYS i2c_write (temp shr 4 or &b00100000) 'High-Nibble, EN2 auf low SYS i2c_write (temp and &h0f or &b10100000) ' Low-Nibble, EN2 auf high SYS i2c_write (temp and &h0f or &b00100000) ' Low-Nibble, EN2 auf low ' ENDIF RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Die I2C-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_i2c.pro" ' --------------------------------------------------------------------------- ' Die Firmware-Routinen einbinden ' --------------------------------------------------------------------------- INCLUDE "om_fw.pro" |
| Antwort schreiben |