'Ansteuerung eines Nokia 3510i Farb-Display 'Copyright Martin Kuehn Januar 2004 'martin-k@x-mail.net 'Dieses Programm dient nur für Demonstrationszwecke und ist absichtlich 'sehr einfach gehalten. Es ging mir nicht darum, elegant zu programmieren, 'sondern exemplarisch die Display-Ansteuerung aufzuzeigen. 'Prozessor: AVR Mega128, 3 Volt, Taktfrequenz 4 MHz 'Viele Werte zur Ansteuerung sind willkürlich gewählt und können noch 'optimiert werden. 'Bei einer Taktfrequenz von über 8 MHz könnte die Ansteuerung des Displays 'nicht mehr funktionieren, eventuell Wait-Befehle einfügen 'Es scheint so, dass die LCD-Spannung durch Software nicht verändert werden 'kann, dementsprechend kann auch der Kontrast nicht verändert werden. 'Ich habe bei meinem Display einen Kondensator zwischen Vlcd (Pin 8) und 'GND geschaltet um das Flimmern zu verhindern. 'Controller D15G14E_14_030526 'Display Pin 1 Reset => AVR Pin A0 ' 2 CS A1 ' 3 GND GND ' 4 Sdata A2 ' 5 Sclk A3 ' 6 Vdigital Vdd (3 Volt) ' 7 Vbooster Vdd ' 8 Vlcd Ddra = &B11111111 'Port A als Output Dim A As Byte , B As Byte , R As Integer , S As Byte 'Initialisierung Reset Porta.0 = 0 Waitms 5 Porta.0 = 1 Porta.1 = 1 Porta.2 = 1 Porta.3 = 1 'Software Reset A = &H01 Gosub Command Gosub Cs Waitms 5 'INIESC A = &HC6 Gosub Command Gosub Cs '*************************************************************************** ' 'REFSET A = &B9 Gosub Command A = 0 Gosub Parameter Gosub Cs 'Display Control DISCTL A = &B6 Gosub Command A = 128 Gosub Parameter '128 number of clocks, willkürliche Zahl A = 128 'no N line inversion (ungerade Zeilenanzahl) Gosub Parameter A = 129 '2 divisions in idle mode, bias 1/9 Gosub Parameter A = 84 Gosub Parameter A = 69 Gosub Parameter A = 82 Gosub Parameter A = 67 Gosub Parameter Gosub Cs 'Gray Scale Position 'Bei DISCTL wurden 128 clock numbers pro Zeile eingestellt 'Auf diese 128 Cyclen werden die 16 (4 bit) Graustufen verteilt (willkürlich, Werte müssen aber kleiner als 128 sein) 'Die Graustufen gelten für alle Farben A = &HB3 'GCPSET0 Gosub Command A = 1 Gosub Parameter A = 2 Gosub Parameter A = 4 Gosub Parameter A = 8 Gosub Parameter A = 16 Gosub Parameter A = 30 Gosub Parameter A = 40 Gosub Parameter A = 50 Gosub Parameter A = 60 Gosub Parameter A = 70 Gosub Parameter A = 80 Gosub Parameter A = 90 Gosub Parameter A = 100 Gosub Parameter A = 110 Gosub Parameter A = 127 Gosub Parameter Gosub Cs 'Gamma curve set A = &HB5 Gosub Command A = 1 'GCPSET0 Gosub Parameter Gosub Cs 'Common driver output select A = &HBD Gosub Parameter A = 0 Gosub Parameter Gosub Cs '************************************************************************ ' 'Power control PWRCTL A = &HBE Gosub Command A = 4 'boosting clock half display clock, internal resistance, high power mode Gosub Parameter Gosub Cs 'Sleep out A = &H11 Gosub Command Gosub Cs 'Voltage control Rem A = &BA Rem Gosub Command Rem A = 127 'Voltage 127 - 63 Rem Gosub Parameter Rem A = 3 Rem Gosub Parameter Rem Gosub Cs 'Contrast Rem A = &H25 Rem Gosub Command Rem A = 63 'Voltage Rem Gosub Parameter Rem Gosub Cs 'Temperature gradient set A = &HB7 Gosub Command A = 0 For R = 1 To 14 'nur erster Wert relevant, restliche 13 Werte auf 0 setzen Gosub Parameter Next R Gosub Cs 'Booster voltage ON A = &H03 Gosub Command Gosub Cs Waitms 40 'Booster voltage stabilizing '************************************************************************** ' 'Inversion control A = &H20 'Off, normal Gosub Command Gosub Cs 'andere Einstellung per Reset definiert '************************************************************************* ' 'Interface pixel format '12 bit 'Colour set 'nur für 8 bit relevant 'Memory access control 'durch Reset definiert 'Page address set 'durch Reset definiert 'Column address set 'durch Reset defniert 'Memory write A = &H2C Gosub Command 'Beipsiel-Routine zeichnet horizontale farbige Balken im 12-bit Modus 'Leider ist die Bascom-Demo-Version speicherlimitiert, daher größten 'Teil der Schleifen löschen S = 0 'roter Balken For R = 1 To 999 If S = 0 Then A = 15 If S = 1 Then A = 240 If S = 2 Then A = 255 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R S = 0 'grüner Balken For R = 1 To 999 If S = 0 Then A = 240 If S = 1 Then A = 255 If S = 2 Then A = 15 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R S = 0 'blauer Balken For R = 1 To 999 If S = 0 Then A = 255 If S = 1 Then A = 15 If S = 2 Then A = 240 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R S = 0 'gelber Balken For R = 1 To 999 If S = 0 Then A = 0 If S = 1 Then A = 240 If S = 2 Then A = 15 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R S = 0 'magenta Balken For R = 1 To 999 If S = 0 Then A = 15 If S = 1 Then A = 0 If S = 2 Then A = 240 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R S = 0 'cyan Balken For R = 1 To 999 If S = 0 Then A = 240 If S = 1 Then A = 15 If S = 2 Then A = 0 Gosub Parameter S = S + 1 If S = 3 Then S = 0 Next R 'weißer Balken A = 0 For R = 1 To 1000 Gosub Parameter Next R 'schwarzer Balken A = 255 For R = 1 To 1002 Gosub Parameter Next R Gosub Cs 'Display ON A = &H29 Gosub Command Gosub Cs End 'Unterprogramme, Timing der Datenleitungen 'Senden eines Befehls Command: Porta.1 = 0 'Cs auf 0 Start der Sequenz Porta.3 = 0 Porta.2 = 0 '0 für Command Porta.3 = 1 Porta.3 = 0 B = A And 128 If B = 128 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 64 If B = 64 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 32 If B = 32 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 16 If B = 16 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 8 If B = 8 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 4 If B = 4 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 2 If B = 2 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 1 If B = 1 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Return 'Senden eines Wertes Parameter: Porta.1 = 0 'Cs auf 0 Start der Sequenz Porta.3 = 0 Porta.2 = 1 '1 für Parameter Porta.3 = 1 Porta.3 = 0 B = A And 128 If B = 128 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 64 If B = 64 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 32 If B = 32 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 16 If B = 16 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 8 If B = 8 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 4 If B = 4 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 2 If B = 2 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Porta.3 = 0 B = A And 1 If B = 1 Then Porta.2 = 1 If B = 0 Then Porta.2 = 0 Porta.3 = 1 Return Cs: Porta.1 = 1 Return