Hi!
Bin ziemlich neu auf dem Gebiet C-Control und hab ne Frage zur letzten Routine. Wenn man im 4Bit-Modus arbeitet, dann werden doch die Daten in 2 Takten gesendet und beidesmal in den Datenbereich ganz vorne im byteport, also die ersten 4 Bits. Und wenns ein kommando is, dann in den ganzen byteport rein. Aber irgendwie versteh ich die routine nicht, eigentlich gar nicht! Außerdem ist bei B00100000 der 1er nicht an der Stelle vom RegisterSelect, des müsste doch heißen B00000100 oder? Und warum wird keine unterscheidung zwischen kommando und zeichen senden gemacht, bitte erklär mir das verständlich, ich versuchs schon seit längerem zu kapiern, wird aber net *Gg*


Code:
 
' *** Daten-Definition ***
define lcd_buf   byte                          'Zeichen oder Kommando
define lcd_param byte
 
' *** Definition LCD-Ports ***
define lcd_port  byteport[2]
define lcd_rs    port[14]                      'Register Select
define lcd_rw    port[13]                      'Read/Write
define lcd_e     port[15]                      'Enable
 
'*** Programmoperationen  ***
gosub LCD_INIT
pause 10
end
 
' Display initialisieren
#LCD_INIT
lcd_port = OFF                                  'alle Ports auf 0 setzen
lcd_param=&H38 : gosub LCD_WRITECMD             '8-Bit-Modus aktivieren
lcd_port=&B00000010                             'mit 8-Bit-Command in 4-Bit-Modus umschalten
pulse lcd_e
lcd_param = &H28 : gosub LCD_WRITECMD           'ab jetzt 4-Bit-Modus
lcd_param = &H0C : gosub LCD_WRITECMD           'Display einschalten, kein Cursor, kein Blinken
return
 
' Display löschen
#LCD_CLS
lcd_param = &H02 : gosub LCD_WRITECMD           'Cursor home
lcd_param = &H01 : gosub LCD_WRITECMD           'Display clear
return
 
' Zeilenwechsel
#LCD_GOTOLINE
if lcd_param = 1 then lcd_param = &H80          'in 1. Zeile wechseln
if lcd_param = 2 then lcd_param = &HC0          'in 2. Zeile wechseln
goto LCD_WRITECMD
return
 
' LCD-Kommando
#LCD_WRITECMD
lcd_buf = OFF                                   'Controlregister aktivieren
goto LCD_WRITE
return
 
' Zeichenausgabe
#LCD_WRITECHAR
lcd_buf = &B00100000                            'Datenregister aktivieren
goto LCD_WRITE
return
 
' Kommando oder Zeichen an Display senden
#LCD_WRITE
lcd_port = lcd_buf or (lcd_param shr 4)         'Hi-Nibble senden
pulse lcd_e
lcd_port = lcd_buf or (lcd_param and &H0F)      'Lo-Nibble senden
pulse lcd_e
return