'Testboard mit I2C Display LCD03 von roboter-teile.de 'geschrieben in Bascom-AVR von Michael Kinz, http://www.team-iwan.de/technik/software/lcd03.php $crystal = 16000000 'Quarzfrequenz $regfile = "m8def.dat" 'Chip festlegen $hwstack = 32 ' Hardware Stack $swstack = 16 ' SW Stack $framesize = 24 'Frame Space Config Timer1 = Timer , Prescale = 1 'Vorteiler auf 1 stellen Config Scl = Portc.5 'Taktleitung für I2C Config Sda = Portc.4 'Daten-Port für I2C 'Die Daten- und Taktleitung sind bei Bascom frei wählbar, 'da das I2C-Protokoll sowieso in Software implementiert ist Dim Text As String * 20 'hier kommt der Anzeige-Text rein Dim Stemp As String * 20 'temporäre Variable Dim Z1 As Word 'Variablen zum Bestimmen der Laufzeit Dim Z2 As Word Dim Zges As Word Ddrb = &B00100000 Led Alias Portb.5 'zum Debuggen Taster Alias Pind.3 'schaltet nach GND Portd.3 = 1 'Taster-Pullup einschalten Dim Z As Byte 'Zählvariable für die Leuchtdauer des Displays Dim X As Byte 'X-Position auf dem Display Dim Y As Byte 'Y-Position auf dem Display Dim I As Byte 'Hilfsvariable für FOR Schleife Dim B As Byte 'Variable zur Bestimmung der Textlänge Dim Temp As Single 'Variablen des Hauptprogramms Dim Tempw As Single 'zum Rechnen und Dim Zeit As Single 'zur Anzeige auf dem Display Dim Bla As Long Tempw = 1 'Initialisierung der ersten Variable Const Displ_w = 198 'Display Adresse zum Schreiben Const Displ_r = 199 'Display Adresse zum Lesen '------- Es geht los ------------ Waitms 500 'Wartezeit, weil das Display erst starten muß Gosub I2c_init 'Display initialisieren Do 'Bitwait Taster , Reset 'nur bei Bedarf 'Bitwait Taster , Set Gosub Lcd_clr 'Display löschen X = 3 '3.Spalte Y = 1 '1.Zeile Gosub Position 'Displayposition schreiben Text = Str(tempw) 'Ausgangsvariable in String wandeln Gosub Sendstring 'und senden Gosub Rechnen 'etwas rechnen Toggle Led 'LED umschalten Waitms 500 'etwas warten Z = Z + 1 'Leuchtdauer des Hintergrundbeleuchtung If Z > 10 Then 'wenn mehr als 5 Sekunden Gosub Displ_aus 'Licht aus End If Tempw = Tempw * 2 'Hilfsvariable weiterschalten If Tempw > 200000000 Then 'Überlauf vermeiden Tempw = 1 End If Loop 'Schleife zum Anfang End 'Ende Hauptprogramm '----- Erste Initialisierung des Displays ------- I2c_init: I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command I2cwbyte 19 'Kommando Baclight on I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command I2cwbyte 12 'Kommando CLS und Cursor Home X = 3 '3. Spalte Y = 1 '1. Zeile Gosub Position 'Displayposition schreiben Waitms 300 'Verschnaufpause Text = "Team IWAN" 'Text zuweisen Gosub Sendstring 'Text ans Display senden Return 'Rücksprung '-------- Rechnen damit was auf dem Display passiert -------- Rechnen: X = 3 '3. Spalte Y = 2 '2.Zeile Gosub Position 'Displayposition schreiben Z1 = Timer1 '1.Timerwert für Berechnung der Rechenzeit speichern Temp = Sqr(tempw) 'Wurzel ziehen Z2 = Timer1 '2.Timerwert für Berechnung der Rechenzeit speichern Text = Str(temp) 'Rechenergebnis in String umwandeln Gosub Sendstring 'ans Display senden X = 3 '3.Spalte Y = 3 '3.Zeile Gosub Position 'Displayposition schreiben Zges = Z2 - Z1 'Anzahl der Takte berechnen Zeit = Zges / 16000000 'Die Takte in Zeit umrechnen Text = Str(zges) 'Anzahl Takte in String wandeln Gosub Sendstring 'ans Display senden Text = " Takte" 'passenden Text hinterherschreiben Gosub Sendstring 'ans Display senden X = 3 '3.Spalte Y = 4 '4.Zeile Gosub Position 'Displayposition schreiben Text = Str(zeit) 'Zeitwert in String wandeln Gosub Sendstring 'ans Display senden Text = " sec" 'passenden Text hinterherschreiben Gosub Sendstring 'ans Display senden Return 'Rücksprung '---------- Hintergrundbeleuchtung ausschalten ---------------- Displ_aus: I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command I2cwbyte 20 'Kommando Beleuchtung aus I2cstop Return 'Rücksprung '---------- String auf das Display schreiben ---------------- Sendstring: B = Len(text) 'Textlänge ermitteln I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command For I = B To 1 Step -1 ' Schleife mit der Länge des Textes Stemp = Right(text , I) 'Bytevariable mit der entsprechenden Textstelle belegen 'dabei wird der Zeiger auf die jeweils nächste Stelle gelegt und 'das Zeichen in die Variable geschrieben. 'Alle Zeichen, die darüber hinausgehen, werden ignoriert I2cwbyte Stemp 'und einzeln senden Next 'Schleifen Rücksprung I2cstop Return 'Rücksprung '------------------- Display Position festlegen --------------- Position: I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command I2cwbyte 3 'Kommando Setze Cursor Y,X I2cwbyte Y 'Y Position übergeben I2cwbyte X 'X Position übergeben I2cstop Return 'Rücksprung '-------------- Display Inhalt löschen --------------------------- Lcd_clr: I2cstart I2cwbyte Displ_w 'Display Schreib-Adresse I2cwbyte 0 'Display Register Command I2cwbyte 12 'Kommando CLS und Cursor Home I2cstop Return 'Gosub-Rücksprung