'*******************************************************************************
'* Testprogramm für GLCD Von Pollin TG12864B-03 *
'* Bascom Version 1.11.9.8 ATMega 128 *
'* Fusbits von: Jtag aus *
'* und 103 Compartibilität aus *
'* externer Quartz 3,686 MHz *
'* von Rolf Möbert-Karge *
'*******************************************************************************
'-----------------------------------------------------------------------------
'Prozessor und Quartz
$regfile = "m128def.dat" 'Register-Datei für ATmega 128
$crystal = 3.686e6 'Frequenz externer Quarz
'*******************************************************************************
'*i/o Port Festlegung *
'*******************************************************************************
'Datenport für GLCD; alle auf Ausgang
Ddra = &B1111_1111
Porta = &B0000_0000
'Controlport für GLCD (Ausgänge) und Phase A(PB.7) und B(PB.6) für Drehgeber(Eingänge)
Ddrb = &B0011_1111
'Pullup's für Eingänge Phase a und b setzen
Portb = &B1100_0000
'Taster von Drehgeber (Eingang;PD.4) und Steuerungs-Bit für Backlight(Ausgang;PD.5) setzen
Ddrd = &B0010_0000
'Pullup's für Eingänge setzen
Portd = &B1101_1111
'*******************************************************************************
'*******************************************************************************
'* GLCD-Routine für GLCD von Pollin TG12864B-03 *
'*******************************************************************************
'Configurieren des GLCD mit KS108 Controler
'Einige der Routinen zur Kontrolle des Displays befinden sich in dem glcdKS108.Libary
'Einbinden des Libary
$lib "glcdKS108.lbx"
'Definition des GLCD mit 128 x 64 Pixel
Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portb , Cd = 5 , Rd = 4 , Ce = 1 , Ce2 = 2 , Enable = 3 , Reset = 0
'Port A wird für die Datenleitung definiert D0=PA 0....D7=PA
'Port B wird für die Steuerleitungen zum GLCD benutzt
'Wobei PortB.5= D/I =Cd ist
'PortB.4= R/W =Rd ist
'PortB.1= CE =CS1; Chip select von Controller 1(erste hälfte Display)
'PortB.2= CE =CS2; Chip select von Controller 2 (zweite hälfte Display)
'PortB.3= ENABLE= E;Chip Enable ansteuern
'PortB.0= RESET = RES;Reset
'
'
'Variabeln Zur Ansteuerung der Befehle des GLCD
Dim X1 As Byte
Dim Y1 As Integer
Dim Z1 As Byte
Dim Z2 As Byte
Dim Flag As Bit
'Zeichensatz einladen (hier den Namen des Zeichensatzes eingeben; mit Editor nachschauen)
Setfont Font5x5
'Diplay Löschen und initialisieren
Gosub Lcd_cls2
Wait 1
'*******************************************************************************
'*******************************************************************************
'*Timer 1 Configuration *
'*******************************************************************************
'System-Timer für periodische Encoder-Abfrage
'FQuarz/Prescale/2=3686000/8/2=230375Hz/1000Hz(500Hz=2ms will ich)=460
'Also muss bis ca.4600 zählen => 65535-460= also bis 65075 zählen dann überlauf
Config Timer1 = Timer , Prescale = 8
On Timer1 Isr_timer1
Enable Timer1
'zähler für Auslösen eines Messintervalls
Dim Mess_zaehler As Word
Dim Mess_flag As Bit
'Const Timer1_reload = 65305 'Wert für 1ms
Config Porte = Output
Porte.6 = 1
Porte.7 = 0
Enable Interrupts
'*******************************************************************************
'*******************************************************************************
'*Drehgeber *
'*******************************************************************************
'Globale Variablen für Drehgeber:
Dim Pwmzaehler As Long
Dim Enc_status As Integer
Dim Status_alt As Integer
Dim Enc_max As Integer
Dim Enc_min As Integer
Dim Phase_b_vorher As Bit
Dim Taster As Byte
Dim Licht As Bit
Dim Strhilf As String * 4
Dim Strh As String * 3
'Wertebereich des Drehgebers für Test (maximal von -32768 bis +327670)
Enc_max = 31
Enc_min = -31
Enc_status = Enc_min
'Backlight aus
Licht = 0
X1 = 6
'*******************************************************************************
'*******************************************************************************
'*Hauptschleife *
'*******************************************************************************
'
Gosub Lcd_cls2
Gosub _gitter
Do
If Flag = 1 Then
'Gosub _gitter
Y1 = 31 - Enc_status
Strh = Str(y1)
Strh = Format(strh , "000")
Lcdat 1 , 1 , Strh '<--------------hier meine ich
Pset X1 , Y1 , 1
Flag = 0
End If
Loop
'*******************************************************************************
End 'end program
'*******************************************************************************
'*******************************************************************************
'*Subroutinen *
'*******************************************************************************
'*******************************************************************************
'*Timer Interupt *
'*******************************************************************************
'interrupt bei Überlauf Timer1
Isr_timer1:
Timer1 = 65535 - 460
Gosub _encoder
Gosub _licht
Return
'*******************************************************************************
'*******************************************************************************
'*Drehgebersubroutine *
'*******************************************************************************
_encoder:
Dim Phase_a As Bit
Dim Phase_b As Bit
'ohne Entprellen(hier bitte auskommentieren)
'Phase_b = Pinb.6
'Phase_a = Pinb.7
'mit Entprellen des Drehgebers über Software Flipflop(aktuel aktiv)
If Pinb.6 = 1 And Pinb.7 = 1 Then Phase_b = 1
If Pinb.6 = 0 And Pinb.7 = 0 Then Phase_b = 0
If Pinb.6 = 0 And Pinb.7 = 1 Then Phase_a = 1
If Pinb.6 = 1 And Pinb.7 = 0 Then Phase_a = 0
'Auswertung des Drehgebers
If Phase_b <> Phase_b_vorher Then
If Phase_b = 1 And Phase_a = 1 Then Enc_status = Enc_status + 1
If Phase_b = 0 And Phase_a = 0 Then Enc_status = Enc_status + 1
If Phase_b = 1 And Phase_a = 0 Then Enc_status = Enc_status - 1
If Phase_b = 0 And Phase_a = 1 Then Enc_status = Enc_status - 1
'Wertebereich halten mit Rücksprung
If Enc_status > Enc_max Then Enc_status = Enc_min
If Enc_status < Enc_min Then Enc_status = Enc_max
'Wertebereich halten mit stop
'If Enc_status > Enc_max Then Enc_status = Enc_max
'If Enc_status < Enc_min Then Enc_status = Enc_min
Phase_b_vorher = Phase_b
End If
Strh = Str(enc_status)
Strhilf = Format(strh , "00")
If Enc_status <> Status_alt Then
'Lcdat 1 , 0 , Strhilf
Licht = 1
Flag = 1
Pwmzaehler = 0
X1 = X1 + 1
If X1 > 127 Then
X1 = 6
Gosub Lcd_cls2
Gosub _gitter
End If
End If
Status_alt = Enc_status
If Pind.4 = 0 Then
'Lcdat 2 , 0 , Strhilf
End If
Return
'-----------------------------------------------------------------------------
_licht:
'Backlight schalten
If Licht = 1 Then Portd.5 = 1 Else Portd.5 = 0
'Beleuchtungsdauer
If Licht = 1 Then Incr Pwmzaehler
If Pwmzaehler = 32000 Then
Licht = 0
Pwmzaehler = 0
End If
Return
'*******************************************************************************
'*******************************************************************************
'*Initialisierung des Displays *
'*******************************************************************************
Lcd_cls2:
'Beide Controler aus
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2
Cls
'Beide Controler an
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2
Return
'*******************************************************************************
'*Anzeigesubroutine *
'*******************************************************************************
_gitter:
'Horizontale Punktlinien
For Z2 = 2 To 62 Step 10
For Z1 = 6 To 127 Step 2
Pset Z1 , Z2 , 1
Next Z1
Next Z2
'Vertikale Punktlinien
For Z2 = 2 To 62 Step 2
For Z1 = 6 To 127 Step 10
Pset Z1 , Z2 , 1
Next Z1
Next Z2
For Z1 = 0 To 5 Step 2
Pset Z1 , 32 , 1
Next Z1
Return
'*******************************************************************************
'*******************************************************************************
'*Einbinden des Zeichensatzes *
'*******************************************************************************
'hier den Dateinamen des Zeichensatzes eingeben
$include "Sfont5x5.font"
'*******************************************************************************