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 

 Re: OMICRO, OMACRO Code zu LCD Display 2004 mit OMICRO unüblicher Verdrahtung Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Joe_Fenk - 19.06.2020 19:06)
 Als Antwort auf OMICRO, OMACRO Code zu LCD Display 2004 mit OMICRO unüblicher Verdrahtung von Joe_Fenk - 19.06.2020 16:11
Joe_Fenk nutzt:  CC1-M-Unit V1.1, Open-Micro, Open-Macro
nun der Source Code für die OMICRO



' 03NE2004.bas by Josef Fenk josef.fenk@t-online.de Fr. 19.06.2020
' belegt sind 820 Basic Bytes; 0 Sys Bytes; 1 RAM Bytes

' fuer LCD_2004 Board mit 4 Zeilen und 20 Spalten nach Arduino
' mit PCF8574T dessen Addresse h4e=b0100_1110
' alle Ports geaendert auf diese Verdrahtung zwischen
' PCF8574 und LCD_2004 und alle Befehle folgerichtig angepasst

' bei lcd_init gegenber bisherigen OMICRO Programmcodes
' 8bit Modus  statt h38 nun h30 eingebaut

' Vorlage basiert  Org_DHarlos I2CLCD.BAS von 2006
' im meinem Ordner O_MICRO//DH_DOWNL//I2CBUSR//PCF_8574/
' --------------------------------------------------------------------------
' LCD ueber I2C-Bus mittels Portexpander PCF8574T ansteuern
' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi
' ---------------------------------------------------------------------------
' hier die neue Belegung
' PCF8574 | LCD Belegung
' ----------------------------------------------------------------------
' P0  4   | RS    4 -- Daten (1) oder Instruktion (0) uebermitteln
' P1  5   | R/W   5 -- Lesen (1) oder Schreiben (0)
' P2  6   | EN    6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen
' P3  7   | LED_A 15-- Ansteuerung der Display Beleuchtung Anode
' P4  9   | DB4 11 \
' P5 10   | DB5 12  \ die oberen 4 Bits
' P6 11   | DB6 13  / vom 8-Bit-Datenbus
' P7 12   | DB7 14 /
' ---------------------------------------------------------------------------
' PCF8574 Pin    12  11  10  09    07    06  05  04
' PCF-   Port    P7  P6  P5  P4    P3    P2  P1  P0
' LCD_2004 Port  DB7 DB6 DB5 DB4   LED_A EN  RW  RS
' LCD_2004 Pins  14  13  12  11    15    6   5   4

INCLUDE "om.def"     'Definitionen fuer Open-Micro und Open-Mini
'INCLUDE "omid.def"   'Definitionen fuer Open-Midi

DEFINE temp BYTE     'fuer LCD-Routinen
' ---------------------------------------------------------------------------

PRINT "03NE2004.BAS"

PrintSpc=ON
End2Host=ON
WHILE TRUE
PRINT "nochmals"
   lcd_init    'I2C-Bus initalisieren, PCF anmelden,LCD initialisieren und loeschen
   Pause 1     '!!!ohne diese Pause wird LCD nicht beschrieben!!!  
   ' 1. Zeile beschreiben
   lcd_writecmd &h80      'b1000_0000 Kommando "Set DD-RAM address"
                          'zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"    
   lcd_writechar "6"    
   lcd_writechar "7"    
   lcd_writechar "8"    
   lcd_writechar "9"    
   lcd_writechar "0"    
   lcd_writechar "1"    
   lcd_writechar "2"    
   lcd_writechar "3"    
   lcd_writechar "4"    
   lcd_writechar "5"    
   lcd_writechar "6"    
   lcd_writechar "7"    
   lcd_writechar "8"    
   lcd_writechar "9"    

   ' 2. Zeile beschreiben
   lcd_writecmd &hc0       'b1100_0000 Kommando "Set DD-RAM address" zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
 
   ' 3. Zeile beschreiben
   lcd_writecmd &h94       'b1001_0100 Set DD-RAM address" zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      

   '   Pause 2
   ' 4. Zeile beschreiben
   lcd_writecmd &hd4       'b1101_0100Kommando "Set DD-RAM address" zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   i2c_stop        
   Pause 100

WEND  

END

' ---------------------------------------------------------------------------
' Die LCD-Routinen sind angelehnt an die Struktur wie auf der C-Control 1.1
' jedoch angepasst auf die v”llig andere Verdrahtung dieser LCD Module
' ---------------------------------------------------------------------------

PROCEDURE lcd_init
  'I2C-Bus initialisieren
  i2c_init
  'PCF ueber I2C-Bus aktivieren
  i2c_start
  'hier unten !!! muss!!! die I2C-Addresse des benutzten Bausteins eingeben
  'OMICRO Haupt I2C-Adresse PCF8574 h40==b0100_000 ==A2:A1:A0==0:0:0==0V
  'diese LCD Module nach Arduino haben im Anlieferzustand folgende
  'Addresse PCF8574T h4e==b0100_1110==b1000_1110==A2:A1:A0= jeweils 1==5V
  IF NOT i2c_write(&h4e) THEN   'diese Abfrage funktioniert nur bei OMICRO
    PRINT "NACK" : END          'nicht jedoch bei OMACRO
  END IF

' Belegung der LCD_2004 Pin/Ports zu PCF Pin/Ports
' PCF8574 Pin    12  11  10  09    07    06  05  04
' PCF-   Port    P7  P6  P5  P4    P3    P2  P1  P0
' LCD_2004 Port  DB7 DB6 DB5 DB4   LED_A EN  RW  RS
' LCD_2004 Pins  14  13  12  11    15    6   5   4
' Byte Wort        High byte         Low Byte
' RS=0==Command;RS=1==write character;RW immer auf 0== nur schreiben
' LED_A =1==schaltet LED ein, LED Stromaufnahme des Displays ca. 38 mA

  '8-Bit-Modus aktivieren
  lcd_writecmd &h30   '17.06.2020 neu,bisher alter stand &h38 '0b0011_1000
                      'statt h38 nun h30=0b0011_0000 eingebaut und
                      'funktioniert einwandfrei
  'mit 8-Bit-Modus  umschalten auf 4 Bit Modus
  i2c_write &b00101100   'data 0010= high byte;1100==LED_A EN RW RS
  i2c_write &b00101000   'EN auf low
  'ab jetzt 4-Bit-Modus
  lcd_writecmd &h28   '2 Zeilen, 5x8 Font
  lcd_writecmd &h0c   'Display ein, Cursor aus, kein blinken
  lcd_cls             'LCD loeschen

  RETURN
END PROCEDURE

PROCEDURE lcd_cls
  lcd_writecmd &h02  '0000_0010 Cursor home / returm
  lcd_writecmd &h01  '0000_0001 Clear display  
 
  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 (temp)
  SYS i2c_write (temp and &b11110000 or &b00001100) 'High-Nibble, EN auf high
  SYS i2c_write (temp and &b11110000 or &b00001000) 'High-Nibble, EN auf low
  SYS i2c_write (temp shl 4 or &b00001100) ' Low-Nibble, EN auf high
  SYS i2c_write (temp shl 4 or &b00001000) ' Low-Nibble, EN auf low
 
 RETURN
END PROCEDURE

PROCEDURE lcd_writechar (temp)
  SYS i2c_write (temp and &b11110000 or &b00001101) 'High-Nibble, EN auf high
  SYS i2c_write (temp and &b11110000 or &b00001001) 'High-Nibble, EN auf low
  SYS i2c_write (temp shl 4 or &b00001101) ' Low-Nibble, EN auf high
  SYS i2c_write (temp shl 4 or &b00001001) ' Low-Nibble, EN auf low
  RETURN
END PROCEDURE

' --------------------------------------------------------------------------
' Die I2C-Routinen einbinden
' ---------------------------------------------------------------------------
INCLUDE "om_i2c.pro"  'Addresse muss siehe oben eingetragen werden
                      'IF NOT i2c_write(&h4e) THEN  
                      '   PRINT "NACK" : END        
                      '  END IFbei A2:A1:A0==0:0:0
' ---------------------------------------------------------------------------
' Die Firmware-Routinen einbinden
' ---------------------------------------------------------------------------
INCLUDE "om_fw.pro"



und hier nun der Source Code für die OMACRO



' 1MAC2004.bas by Josef Fenk josef.fenk@t-online.de Fr. 19.06.2020
' Source Code fuer OMACRO
' belegt sind 830 Basic Bytes; 0 Sys Bytes; 1 RAM Bytes
' funktioniert nun einwandfrei
'
' fuer LCD_2004 Board mit 4 Zeilen und 20 Spalten nach Arduino
' mit PCF8574T dessen Addresse h4e=b0100_1110
' alle Ports geaendert auf diese Verdrahtung zwischen
' PCF8574 und LCD_2004 und alle Befehle folgerichtig angepasst

' bei lcd_init gegenber bisherigen OMICRO Programmcodes
' 8bit Modus  statt h38 nun h30 eingebaut
' Code im LCD Teil entsprechend angepasst

' in OPTION//TOOLS//Basic Compiler//OCBASR.exe eingetragen

' Vorlage basiert  Org_DHarlos I2CLCD.BAS von 2006
' im meinem Ordner O_MICRO//DH_DOWNL//I2CBUSR//PCF_8574/
' --------------------------------------------------------------------------
' LCD ueber I2C-Bus mittels Portexpander PCF8574T ansteuern
' In OCBASIC fuer Open-MACRO
' ---------------------------------------------------------------------------
' hier die neue Belegung
' PCF8574 | LCD Belegung
' ----------------------------------------------------------------------
' P0  4   | RS    4 -- Daten (1) oder Instruktion (0) uebermitteln
' P1  5   | R/W   5 -- Lesen (1) oder Schreiben (0)
' P2  6   | EN    6 -- Daten bei fallender Flanke (1 nach 0) uebernehmen
' P3  7   | LED_A 15-- Ansteuerung der Display Beleuchtung Anode
' P4  9   | DB4 11 \
' P5 10   | DB5 12  \ die oberen 4 Bits
' P6 11   | DB6 13  / vom 8-Bit-Datenbus
' P7 12   | DB7 14 /
' ---------------------------------------------------------------------------
' PCF8574 Pin    12  11  10  09    07    06  05  04
' PCF-   Port    P7  P6  P5  P4    P3    P2  P1  P0
' LCD_2004 Port  DB7 DB6 DB5 DB4   LED_A EN  RW  RS
' LCD_2004 Pins  14  13  12  11    15    6   5   4

INCLUDE "OMAC.DEF"    'Definitionen fuer OMACRO; Include Datei vom 20.4.2010

DEFINE temp BYTE     'fuer LCD-Routinen
' ---------------------------------------------------------------------------

PRINT "03NE2004.BAS"

PrintSpc=ON
End2Host=ON
WHILE TRUE
PRINT "nochmals"
   lcd_init    'I2C-Bus initalisieren, PCF anmelden,LCD initialisieren und loeschen
   Pause 1     '!!!ohne diese Pause==> keine Anzeige, bitte beachten!!!  
   ' 1. Zeile beschreiben
   lcd_writecmd &h80      'b1000_0000 Kommando "Set DD-RAM address"
                          'zum LCD senden
   lcd_writechar "L"      
   lcd_writechar "C"      
   lcd_writechar "D"      
   lcd_writechar " "      
   lcd_writechar "2"      
   lcd_writechar "0"    
   lcd_writechar "0"    
   lcd_writechar "4"    
   lcd_writechar " "    
   lcd_writechar "2"    
   lcd_writechar "0"    
   lcd_writechar " "    
   lcd_writechar "Z"    
   lcd_writechar "e"    
   lcd_writechar "i"    
   lcd_writechar "c"    
   lcd_writechar "h"    
   lcd_writechar "e"    
   lcd_writechar "n"    
   lcd_writechar " "    

   ' 2. Zeile beschreiben
   lcd_writecmd &hc0       'b1100_0000 Kommando "Set DD-RAM address" zum LCD senden
   lcd_writechar "4"      
   lcd_writechar " "      
   lcd_writechar "S"      
   lcd_writechar "p"      
   lcd_writechar "a"      
   lcd_writechar "l"      
   lcd_writechar "t"      
   lcd_writechar "e"      
   lcd_writechar "n"      
   lcd_writechar " "      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
 
   ' 3. Zeile beschreiben
   lcd_writecmd &h94       'b1001_0100 Set DD-RAM address" zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      

   '   Pause 2
   ' 4. Zeile beschreiben
   lcd_writecmd &hd4       'b1101_0100Kommando "Set DD-RAM address" zum LCD senden
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   lcd_writechar "0"      
   lcd_writechar "1"      
   lcd_writechar "2"      
   lcd_writechar "3"      
   lcd_writechar "4"      
   lcd_writechar "5"      
   lcd_writechar "6"      
   lcd_writechar "7"      
   lcd_writechar "8"      
   lcd_writechar "9"      
   Pause 100
   lcd_cls
   i2c_stop        
   Pause 100

WEND  

END

' ---------------------------------------------------------------------------
' Die LCD-Routinen sind angelehnt an die Struktur wie auf der C-Control 1.1
' jedoch angepasst auf die v”llig andere Verdrahtung dieser LCD Module
' ---------------------------------------------------------------------------

PROCEDURE lcd_init
  'I2C-Bus initialisieren
  i2c_init
  'PCF ueber I2C-Bus aktivieren
  i2c_start
  'hier unten !!! muss!!! die I2C-Addresse des benutzten Bausteins eingeben
  'OMICRO Haupt I2C-Adresse PCF8574 h40==b0100_000 ==A2:A1:A0==0:0:0==0V
  'diese LCD Module nach Arduino haben im Anlieferzustand folgende
  'Addresse PCF8574T h4e==b0100_1110==b1000_1110==A2:A1:A0= jeweils 1==5V
  '**** 20180913: neuer Code Teil, bei dem kein Fehler auftritt ************
  IF i2c_write(&h4e)=0 THEN    'diese Abfrage funktioniert nur bei OMACRO
    PRINT "NACK" : END         'nicht jedoch bei OMICRO
  END IF

' Belegung der LCD_2004 Pin/Ports zu PCF Pin/Ports
' PCF8574 Pin    12  11  10  09    07    06  05  04
' PCF-   Port    P7  P6  P5  P4    P3    P2  P1  P0
' LCD_2004 Port  DB7 DB6 DB5 DB4   LED_A EN  RW  RS
' LCD_2004 Pins  14  13  12  11    15    6   5   4
' Byte Wort        High byte         Low Byte
' RS=0==Command;RS=1==write character;RW immer auf 0== nur schreiben
' LED_A =1==schaltet LED ein, LED Stromaufnahme des Displays ca. 38 mA

  '8-Bit-Modus aktivieren
  lcd_writecmd &h30   '17.06.2020 neu,bisher alter stand &h38 '0b0011_1000
                      'statt h38 nun h30=0b0011_0000 eingebaut und
                      'funktioniert einwandfrei
  'mit 8-Bit-Modus  umschalten auf 4 Bit Modus
  i2c_write &b00101100   'data 0010= high byte;1100==LED_A EN RW RS
  i2c_write &b00101000   'EN auf low
  'ab jetzt 4-Bit-Modus
  lcd_writecmd &h28   '2 Zeilen, 5x8 Font
  lcd_writecmd &h0c   'Display ein, Cursor aus, kein blinken
  lcd_cls             'LCD loeschen

  RETURN
END PROCEDURE

PROCEDURE lcd_cls
  lcd_writecmd &h02  '0000_0010 Cursor home / returm
  lcd_writecmd &h01  '0000_0001 Clear display  
 
  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 (temp)
  SYS i2c_write (temp and &b11110000 or &b00001100) 'High-Nibble, EN auf high
  SYS i2c_write (temp and &b11110000 or &b00001000) 'High-Nibble, EN auf low
  SYS i2c_write (temp shl 4 or &b00001100) ' Low-Nibble, EN auf high
  SYS i2c_write (temp shl 4 or &b00001000) ' Low-Nibble, EN auf low
 
 RETURN
END PROCEDURE

PROCEDURE lcd_writechar (temp)
  SYS i2c_write (temp and &b11110000 or &b00001101) 'High-Nibble, EN auf high
  SYS i2c_write (temp and &b11110000 or &b00001001) 'High-Nibble, EN auf low
  SYS i2c_write (temp shl 4 or &b00001101) ' Low-Nibble, EN auf high
  SYS i2c_write (temp shl 4 or &b00001001) ' Low-Nibble, EN auf low
  RETURN
END PROCEDURE

' --------------------------------------------------------------------------
' Die I2C-Routinen einbinden
' ---------------------------------------------------------------------------
INCLUDE "om_i2c.pro"  'Addresse muss siehe oben eingetragen werden
                      'IF NOT i2c_write(&h4e) THEN  
                      '   PRINT "NACK" : END        
                      'END IFbei A2:A1:A0==0:0:0
' ---------------------------------------------------------------------------
' Die Firmware-Routinen einbinden
' ---------------------------------------------------------------------------
INCLUDE "om_fw.pro"


 Antwort schreiben

Bisherige Antworten:

Vielen Dank! (von Dietmar - 19.06.2020 19:49)
    Re: Vielen Dank! (von Joe_Fenk - 19.06.2020 21:13)
        Re: LCD-Initialisierung (von Dietmar - 19.06.2020 22:03)
            Re: LCD-Initialisierung (von Joe_Fenk - 21.06.2020 12:29)