Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 2704-LCD m PCF8574 u OMacro Ansteuerung Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe Fenk - 12.09.2018 16:30)
Joe Fenk nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Macro
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

Bisherige Antworten:

Re: 2704-LCD m PCF8574 u OMacro Ansteuerung (von Dietmar - 12.09.2018 17:05)
    Re: 2704-LCD m PCF8574 u OMacro Ansteuerung (von Joe Fenk - 13.09.2018 15:49)