Nachfolgend meine Initialisierung in Basic für C-Controll.
Vor dem Versuch, das ganze in Bascom umzumodeln sollte man noch einmal testen, ob nicht in den Bibliotheken bereits die Lösungen stecken.
Ich habe gelesen, dass es bei der Initalisierung den Parameter 20 * 4a gibt, das wäre wohl schon der Ansatz, die Zeilen richtig anzusprechen.
Da ich gerade die C-Control einstampfe und mit Bascom starte, kenne ich mich hier noch nicht aus.

' KS0073_init.bas --------------------------------
Code:
DEFINE DB0 as Port[9]
DEFINE DB1 as PORT[10]
DEFINE DB2 as PORT[11]
DEFINE DB3 as PORT[12]
DEFINE RW  as PORT[13]
DEFINE RS  as PORT[14]
DEFINE EN  as PORT[15]

define bit_RW     as bit[1] ' Zwischenspeicher für RW-Status
define bit_RS     as bit[2] ' Zwischenspeicher für RS-Status
define bit_Cursor as bit[3] ' gibt an, ob Cursor sichtbar     = on
define bit_Blink  as bit[4] ' gibt an, ob Cursor blinken soll = on
define bit_5      as bit[5]
define bit_6      as bit[6]
define bit_7      as bit[7]

define Zeile   as byte  ' globale Variable, die von LCD_POS() ausgewertet wird
define Spalte  as byte  ' globale Variable, die von LCD_POS() ausgewertet wird
define DATA    as byte
define i       as byte
define j       as byte

' ---------------------------------------------
FUNCTION LCD_POS(Zeile as byte, Spalte as byte)
' Positioniert den Cursor, dannach kann ins LCD geschrieben werden.
' benutzt die Globalen Variablen bit_RW und bit_RS
bit_RW = RW  ' den Status der Ports sichern
bit_RS = RS

RW = off ' Auf Befehlsmodus umschalten
RS = off ' Auf Schreibmodus umschalten

' nicht plausible Zeilenangaben abfangen
' IF (Zeile = 0 or Zeile > 4) THEN Zeile = 1
' nicht plausible Spaltenangaben abfangen
' IF (Spalte < 1 or Spalte > 20) THEN Spalte = 1

' Die Position ist nach Datenblatt KS0073:
' Zeile1 = 00h, Zeile 2 = 20h, Zeile 3 = 40h, Zeile 4 = 60h
' Die Variablen Zeile und Spalte werden missbraucht
Zeile  = (Zeile -1) * 32 + (Spalte - 1) ' hier steht die LCD-Position

' siehe SET DDRAM Adress im Datenblatt (Seite 36)
' Daten schreiben, zuerst upper nibble, command bit 7 setzen

Spalte = ((Zeile shr 4) or 1000b) ' Bit 4 setzen, Bit 3 - 0 sind Teil der Position
' nibble auf Ports übertragen
BITSET(Spalte)
PULSE EN ' und senden

' lower nibble
' überflüssig, wird in BITSET behandelt: Spalte = (Zeile and 15) ' 1111
BITSET(Zeile)
PULSE EN

RS = bit_RS ' zurück in den ursprünglichen Zustand
RW = bit_RW '

END FUNCTION

' ---------------------------------------------
' setzt die Ports für die LCD-Ausgabe
FUNCTION BITSET(Muster as byte)
DB0 = MUSTER and 1
DB1 = MUSTER and 2
DB2 = Muster and 4
DB3 = Muster and 8
PAUSE 1
end function

' ----------------------------------------------
' schaltet einen blinkenden Cursor ein
FUNCTION DISPLAY_CURSOR()
'
bit_RS = RS ' Status sichern
bit_RW = RW
RS     = off
RW     = off
BITSET(0)  ' upper nibble
PULSE EN

' CMD = 1/
' Display aus = 0, ein = 1
' Cursor aus  = 0, ein = 1
' Blink aus   = 0, ein = 1

BITSET(ABS (bit_Cursor * 2 + bit_Blink - 12 ))
PULSE EN
RS = bit_RS  ' RS restaurieren
RW = bit_RW  ' RW restaurieren

end FUNCTION
' -------------------------------------------------

' ---------------------------------------------------
FUNCTION KS0073_INIT()
' Initialisierung des LCDs 4x20 mit Controller KS0073

LCD.INIT    ' Standardinitialisierung
LCD.OFF     ' sollte eigentlich gar nicht erforderlich sein

' RW  = off ' immer off im Befehlsmodus
' RS  = off ' immer off im Befehlsmodus

' 3x den 8-Bit-Modus mit Pause dazwischen aufrufen ------------------
BITSET(3) ' 0011
PULSE EN

pause 1
Pulse EN

pause 1
PULSE EN

' CMD: 4-Bit-Modus aufrufen ----------------------
BITSET(2) ' 00000010
PULSE EN

' von nun an sind upper und lower nibble getrennt zu senden
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN

' lower nibble
' 2 Zeilen-Modus, RE-bit
BITSET(12) ' 1100
PULSE EN

' CMD: extended Function Set + RE ---------------------
' upper nibble
BITSET(0)
PULSE EN

' lower nibble
' Cmd, 5-dot-Font, normaler Cursor, 4-line-display
BITSET(9) '1001
PULSE EN

' ----------------------------------------------
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN

' lower nibble
' 2 Zeilen-Modus, RE-bit-aus
BITSET(8) ' 1000
PULSE EN

' CMD: clear display -----------------------------------------
BITSET(0)
PULSE EN

BITSET(1)  ' 0001
PULSE EN


' CMD: cursor display shift ------------------------------------------
' upper nibble
BITSET(1)  ' 0001
PULSE EN

' lower nibble
' Cursor shift, R/L shift
BITSET(0)
PULSE EN

' CDM: display on/off control ------------------------------------------
' upper nibble
BITSET(0)
PULSE EN

' Cmd, Display ein, Cursor off, Blink off
BITSET(12) ' 1100
PULSE EN

END FUNCTION
' ---------------------------------------------------------------------


KS0073_init()

#start

Pause 100

LCD.INIT switchonly

for i = 1 to 4
for j = 1 to 20
'pause 1
    LCD_POS(i, j)
    LCD.PRINT "*"
next j
next i
LCD.CLEAR

goto start
' PS. Der Smilie, den ich im Code gesehen habe, der gehört da nicht hin - vielleicht ist er aber auch schon wieder weg - wer weiss ..


Edit: Bitte Code-Tags verwenden, dein Moddy