'============================================= ' LCD-Ausgabe 4-Datenbit für Selbstbau (7-Segment-Platine) ' viele Subroutines zur Initialisierung und Ausgabe ' 29.04.2007 ' Call Ini_lcd - für Initialisierung aufrufen ' Call Line1 (Line2) - setzt den Cursor an den Anfang der 1/2.Zeile ' Call Wr_string - gibt den Inhalt der Stringvariablen "S" aus ' Call Clr_lcd - löscht das Display '============================================= $regfile = "m8def.dat" $crystal = 8000000 '$baud = 9600 ' Initialisierung für 4-Bit Daten ' Anschluss an Port B ' Steuerleitungen auch PortB Config Portb = Output 'Datenbits definieren, bei Portwechsel anpassen !! Db4 Alias Portb.4 Db5 Alias Portb.5 Db6 Alias Portb.6 Db7 Alias Portb.7 'Steuerbits festlegen Rs Alias Portb.0 Rw Alias Portb.1 E Alias Portb.2 Dim S As String * 16 At $400 'Beide Variablen, String und Byte() liegen Dim B(16) As Byte At $400 Overlay 'an der gleichen Stelle im Speicher Declare Sub Ini_lcd 'Initialisierung des LCD Declare Sub Wr_nible(byval D As Byte) 'ein Nible (D4-D7) schreiben Declare Sub Wr_inibyte(byval D As Byte) 'ins Steuerregister schreiben Declare Sub Wr_chr(byval D As Byte) 'ins Datenregister schreiben Declare Sub Clr_lcd 'LCD löschen Declare Sub Line1 'Cursor in 1. Zeile Declare Sub Line2 'Cursor in 2. Zeile Declare Sub Wr_string 'String S ausgeben Call Ini_lcd Wait 1 S = "Textausgabe" Call Wr_string 'Bsp für Textausgabe 'Wait 1 'call Line1 'Text in 1.Zeile schreiben 'S = "1. Zeile" 'Call Wr_string 'Wait 1 'Call Line2 'Text in 2. Zeile schreiben 'S = "2.Zeile bis Ende" 'Wr_string 'Wait 1 ' Line1 'Zahlenausgabe als String 'Z = -123.12 'in 1. Zeile 'S = Str(z) 'Wr_string 'Sub-Aufruf ohne "Call",wenn parameterlos 'Wait 1 'S = String(16 , 32) '16 mit Leerzeichen füllen 'Wr_string 'Rest der Zeile löschen 'Wait 1 'Clr_lcd ' Display löschen Do Loop End 'end program '=========================================================== Sub Wr_nible(byval D As Byte) ' 4 Datenbits am Datenbus setzen ' ersetzt Byteübergabe an den Port ' in der 8-Bit-Ausgabe If D.4 = 1 Then Db4 = 1 Else Db4 = 0 If D.5 = 1 Then Db5 = 1 Else Db5 = 0 If D.6 = 1 Then Db6 = 1 Else Db6 = 0 If D.7 = 1 Then Db7 = 1 Else Db7 = 0 End Sub '========================================================== Sub Ini_lcd ' Beginn der Initialisierung Rs = 0 'Rs = 0 ins Steuerregister Rw = 0 'Rw = 0 schreiben E = 0 Waitms 100 'Anfangspausen ausreichen lang machen !!! Call Wr_inibyte(&H28) 'System Set (4 Bit Datenbus, 2 Zeilen) Waitms 100 Call Wr_inibyte(&H28) 'muss nach Datenblatt 2x geschrieben werden Waitms 10 Call Wr_inibyte(&H80) 'und Lownible schreiben Waitms 10 Call Wr_inibyte(&H0e) 'LCD und Cursor einschalten Waitms 1 Call Wr_inibyte(&He0) 'und Lownible schreiben Waitms 1 Call Wr_inibyte(&H06) 'Cursor springt nach dem Schreiben eine Position nach rechts Waitms 1 Call Wr_inibyte(&H60) 'und Lownible schreiben Waitms 1 Call Clr_lcd 'Display löschen End Sub '=========================================================== Sub Wr_inibyte(byval D As Byte) 'schreibt nur 1 nible Rs = 0 ' Steuerregister auswählen Rw = 0 E = 1 Waitus 1 Call Wr_nible(d) ' Datenbits an den Datenbus Waitus 1 E = 0 ' Daten übernehmen Waitus 160 ' mehr als 40us warten End Sub '========================================================== Sub Wr_chr(byval D As Byte) Rs = 1 'Datenregister auswählen Rw = 0 'Write enable E = 1 Waitus 1 Call Wr_nible(d) 'Datenbits an den Datenbus Waitus 1 E = 0 'Daten übernehmen Waitus 160 '40us warten (bei Q=8MHz) D = D * 16 E = 1 Waitus 1 Call Wr_nible(d) 'Datenbits an den Datenbus Waitus 1 E = 0 'Daten übernehmen Waitus 160 'mehr als 40us warten End Sub '========================================================== Sub Clr_lcd 'CLEAR_LCD: Dim D As Byte Rs = 0 E = 1 D = &H01 'Code für CLR_LCD Call Wr_nible(d) 'Datenbits an den Datenbus Waitus 1 E = 0 'Daten übernehmen Waitus 160 '40us warten (bei Q=8MHz) D = D * 16 E = 1 Waitus 1 Call Wr_nible(d) 'Datenbits an den Datenbus Waitus 1 E = 0 Waitms 10 'Pause erforderlich End Sub '========================================================== Sub Line1 Call Wr_inibyte(&H80) 'Anfang 1. Zeile Call Wr_inibyte(&H00) 'und Lownible schreiben End Sub '&H81 = nächste Position '========================================================== Sub Line2 Call Wr_inibyte(&Hc0) 'Anfang 2. Zeile Call Wr_inibyte(&H00) ' und Lowbyte schreiben End Sub '&HC1 = nächste Position '========================================================== Sub Wr_string 'String ganz ausgeben Dim Istring As Byte For Istring = 1 To Len(s) Call Wr_chr(b(istring)) Next Istring End Sub