Initialisierung KS0073 mit C-Controll
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