Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6 'Grad Celsius Symbol für LCD
Menue:
Z = 3 'Pfeile auf Abbrechen vorgeben
Do
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Locate 1 , 1 : Lcd "Einstellmenue..."
Locate 2 , 1 : Lcd " Max-Wert " : Lcd Chr(0)
Locate 3 , 1 : Lcd " Min-Wert " : Lcd Chr(0)
Locate 4 , 1 : Lcd " Abbrechen "
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If
Select Case X
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then X = 0
Bitwait Taster , set
End Select
Select Case Y
Case 1
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Y = 0
Bitwait Taster , Set
End select
If Z > 3 Then Z = 1 'Z darf nicht größer 3 werden
If Z = 0 Then Z = 3 'Z darf nicht NULL sein
Select Case Z 'Z für Menüwahl auswerten
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Gosub Max_wert_set 'gehe zu Max_wert
Case 2
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Gosub Min_wert_set 'gehe zu Min_wert
Case 3
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd ">>"
If Taster = 0 Then Exit Do 'zurück zur Standardanzeige
End Select
Locate 2 , 13 : Lcd Max_temp 'aktuelle Max_temp anzeigen
Locate 3 , 13 : Lcd Min_temp 'aktuelle Min_temp anzeigen
Loop
Return
Select Case X
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then X = 0
Z = 1
Bitwait Taster , set
End Select
Select Case Y
Case 1
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Y = 0
Z = 2
Bitwait Taster , Set
End select
Select Case Z 'Z für Menüwahl auswerten
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then [B]Gosub Max_wert_set[/B] 'gehe zu Max_wert
Case 2
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then [B]Gosub Min_wert_set[/B] 'gehe zu Min_wert
Case 3
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd ">>"
If Taster = 0 Then Exit Do 'zurück zur Standardanzeige
End Select
$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 32
$swstack = 32
$hwstack = 64
Ddrd = &B11100010
'PD0 = Eingang
'PD1 = Ausgang
'PD2 = Encoder
'PD3 = Encoder
'PD4 = Taster-Encoder
'PD5 = LCD-RS
'PD6 = LCD-E
Portd = &B00011100
'pd2-pd4 auf high signal (5V)
' den Rest auf low Signal (0V)
Ddrb = &B11111111
' LCd anzeige 8 Bit
Portb = &B00000000
' alle auf Low Signal gelegt
' Lcd anzeige auf 8 Bit Configurieren
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5
' LCD Typ festlegen
Config Lcd = 20 * 4
Config Timer0 = Timer , Prescale = 256 'Overflow nach 2,048ms
On Timer0 Drehencoder 'Drehencoder abfragen
'Timer0 zur Überwachung des Drehencoders-------------------
Dim Lcd_flag As Bit
' LCD_flag Dient dazu die daten nur einmal auf die LCD anzeige zuschreiben
Dim Anzeige_flag As Bit
' Anzeige_flag sorgt für den wechsel vom standardbildschirm in die Menueführung
Dim Max_temp As Byte 'Variable für die bere Schwelle
Dim Min_temp As Byte ' Variable für den untere Schwelle
Dim De As Byte ' Dreh Encoder
Dim Y As Byte ' Variable zumverstellen des Unteren Schwellwerts
Dim X As Byte ' Variable zum verstellen der Oberen Schwellwertes
Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6 'Grad Celsius Symbol für LCD
Dim Z As Byte ' Variable die mit dem Encoder hoch und runter gezählt wird
Taster Alias Pind.4 ' Taster Alias damit nicht immer PIND.4 Geschrieben werden muss
Bl Alias Portd.1 ' reserve Ausgang
Ein Alias 1 'EIN
Aus Alias 0 ' AUS
'*******************************************************************************
' --------------Systemstart------------------
'*******************************************************************************
' Hier kommt alles rein was für den Systemstart wichtig ist
Max_temp = 60
Min_temp = 20
X = 0
Y = 0
Z = 0
'**********************************************************
' ----Hauptschleife----
'**********************************************************
Do
Enable Timer0 'Timer0 aktiv
Enable Interrupts
If Taster = 0 Then ' ist der Taster betätigt ?
' Ja dann setze Layout auf null oder eins abhänig davon welchen wert es vorher hatte.
Toggle Anzeige_flag
Lcd_flag = 0 ' Setze Flag LC auf 0
End If
If Anzeige_flag = 0 Then
' ist die LCD schon Beschrieben?
Gosub Lcdanzeige ' Nein Springe zur Routine LCDanzeige
Else
Gosub Menue ' ja dan springe in menue
End If
Loop
'*******************************************************************************
'*******************************************************************************
' -----------------------Subroutinen--------------------------
'*******************************************************************************
Lcdanzeige:
If Lcd_flag = 0 Then
X = 0
Y = 0
Z = 0 ' Standart Bildschirm festlegen
Cls
Locate 1 , 1 : Lcd "Kuehlagregat"
Locate 2 , 1 : Lcd "Kuehlhaus"
Locate 3 , 1 : Lcd "Obere Temp."
Locate 4 , 1 : Lcd "Untere Temp."
' festlegung Lcd ist schon beschrieben
Lcd_flag = 1
End If
Bitwait Taster , Set
' darauf warten das taster wieder betätigt wird
Return
'Sub für Taster-----------------------------------------------------------------
Menue:
Z = 3 'Pfeile auf Abbrechen vorgeben
Do
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Locate 1 , 1 : Lcd "Einstellmenue..."
Locate 2 , 1 : Lcd " Max-Wert " : Lcd Chr(0)
Locate 3 , 1 : Lcd " Min-Wert " : Lcd Chr(0)
Locate 4 , 1 : Lcd " Abbrechen "
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If
Select Case X
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then X = 0
Z = 1
Bitwait Taster , Set
End Select
Select Case Y
Case 1
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Y = 0
Z = 2
Bitwait Taster , Set
End Select
If Z > 3 Then Z = 1 'Z darf nicht größer 3 werden
If Z = 0 Then Z = 3 'Z darf nicht NULL sein
Select Case Z 'Z für Menüwahl auswerten
Case 1
Locate 2 , 1 : Lcd ">>" : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Gosub Max_wert_set 'gehe zu Max_wert
Case 2
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd ">>" : Locate 4 , 1 : Lcd " "
If Taster = 0 Then Gosub Min_wert_set 'gehe zu Min_wert
Case 3
Locate 2 , 1 : Lcd " " : Locate 3 , 1 : Lcd " " : Locate 4 , 1 : Lcd ">>"
If Taster = 0 Then Exit Do 'zurück zur Standardanzeige
End Select
Locate 2 , 13 : Lcd Max_temp 'aktuelle Max_temp anzeigen
Locate 3 , 13 : Lcd Min_temp 'aktuelle Min_temp anzeigen
Loop
Return
Drehencoder:
De = Encoder(pind.2 , Pind.3 , Rauf , Runter , 0)
Return
Rauf:
' Routine Z runter zählen
[B][U]If X = 1 Then
Decr Max_temp ' wenn X = 1 dann verringere den oberen Hysteresewert um 5
End If
If Max_temp < 40 Then
Max_temp = 40 ' minimale grenze für die obere Temperatur
End If
If Y = 1 Then
Decr Min_temp
' wenn X = 2 dann verringere den unteren Hysteresewert um 5
End If
If Min_temp < 20 Then
Min_temp = 20 ' minimale grenze für die untere Temperatur
End If[/U][/B]
If De = 0 Then ' ist K = 0 ?
Decr Z ' Ja dann Z = Z - 1
End If
If Z < 1 Then ' ist z = 0 ?
Z = 3 'ja dann Z = 3
End If
Return
Runter:
' Routine Z rauf zählen und hysterese werte rauftählen
[B][U]If X = 1 Then
Incr Max_temp ' wenn X = 1 dann verringere den oberen Hysteresewert um 5
End If
If Max_temp > 60 Then
Max_temp = 60 ' minimale grenze für die obere Temperatur
End If
If Y = 1 Then
Incr Min_temp
' wenn X = 2 dann verringere den unteren Hysteresewert um 5
End If
If Min_temp > 40 Then
Min_temp = 40 ' minimale grenze für die untere Temperatur
End If[/U][/B]
If De = 0 Then ' ist K = 0 ?
Incr Z ' Ja dann Z = Z + 1
End If
If Z > 3 Then ' ist z = 3 ?
Z = 1
End If
Return
[B][B][U]
Max_wert_set:
X = 1
Y = 0
Z = 1
Locate 3 , 1 : Lcd X
Return
Min_wert_set:
Y = 1
X = 0
Z = 2
Locate 2 , 1 : Lcd Y
Bitwait Taster , Set
Return
Abbrechen:
If Taster = 0 Then
Lcd_flag = 0
Gosub Lcdanzeige
End If
Return
[/U][/B][/B]
End
'Timer0 zur Überwachung des Drehencoders-------------------
Config Timer0 = Timer , Prescale = 64 'Overflow nach 2,048ms
On Timer0 Drehencoder 'Drehencoder abfragen
Enable Timer0 'Timer0 aktiv
Enable Interrupts 'Interrupts einschalten
Cls 'LCD löschen
Locate 1 , 1 : Lcd " Maximum-Wert "
Locate 2 , 1 : Lcd "li= - re= +"
Locate 3 , 1 : Lcd "Max-Wert= " : Lcd Chr(0)
Dim Max_wert As Byte 'Maximal mögliche Temperatur
Dim Min_wert As Byte 'Minimal mögliche Temperatur
Max_wert = 40 'Maximalwert vorgeben
Min_wert = 10 'Minimalwert vorgeben
$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 32
$swstack = 32
$hwstack = 64
Ddrd = &B11100010
'PD0 = Eingang
'PD1 = Ausgang
'PD2 = Encoder
'PD3 = Encoder
'PD4 = Taster-Encoder
'PD5 = LCD-RS
'PD6 = LCD-E
Portd = &B00011100
'pd2-pd4 auf high signal (5V)
' den Rest auf low Signal (0V)
Ddrc = &B00000000 ' alle Ports des ADC wandlers als eingang declarieren
Portc = &B00000000 ' alle eingänge auf 0 setzen
Ddrb = &B11111111
' LCd anzeige 8 Bit
Portb = &B00000000
' alle auf Low Signal gelegt
Admux = &B11000000 ' ADC wandlung über die Interne Referzen Spannung 2,56V es werden 10 bit genauigkeit verwendet
Adcsra = &B11100111 'Bit 7 ADCan Bit 6 =1 :start Bit 5 = 1 Freilauf Bits 2 1 0 AVR Clock / x
' Lcd anzeige auf 8 Bit Configurieren
Config Lcdpin = Pin , Port = Portb , E = Portd.6 , Rs = Portd.5
' LCD Typ festlegen
Config Lcd = 20 * 4
Config Timer0 = Timer , Prescale = 256 'Overflow nach 2,048ms
On Timer0 Drehencoder 'Drehencoder abfragen
'Timer0 zur Überwachung des Drehencoders-------------------
Dim Lcd_flag As Bit
' LCD_flag Dient dazu die daten nur einmal auf die LCD anzeige zuschreiben
Dim Anzeige_flag As Bit
' Anzeige_flag sorgt für den wechsel vom standardbildschirm in die Menueführung
Dim Max_temp As Byte 'Variable für die bere Schwelle
Dim Min_temp As Byte ' Variable für den untere Schwelle
Dim Temp As Byte
Dim De As Byte ' Dreh Encoder
Dim Y As Byte ' Variable zumverstellen des Unteren Schwellwerts
Dim X As Byte ' Variable zum verstellen der Oberen Schwellwertes
Dim Curch As Byte
Dim Lb1 As Word
Dim Hb1 As Word
Dim Lb2 As Word
Dim Hb2 As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word
Dim E As Word
Dim F As Word
Dim G As Word
Dim H As Word
Dim I As Word
Dim J As Word
Dim K As Byte
Dim L As Byte
Dim Xe As Word
Dim Ye As Word
Deflcdchar 0 , 24 , 24 , 32 , 6 , 9 , 8 , 9 , 6 'Grad Celsius Symbol für LCD
Dim Z As Byte ' Variable die mit dem Encoder hoch und runter gezählt wird
Taster Alias Pind.4 ' Taster Alias damit nicht immer PIND.4 Geschrieben werden muss
Bl Alias Portd.1 ' reserve Ausgang
Ein Alias 1 'EIN
Aus Alias 0 ' AUS
'*******************************************************************************
' --------------Systemstart------------------
'*******************************************************************************
' Hier kommt alles rein was für den Systemstart wichtig ist
Max_temp = 60
Min_temp = 20
X = 0
Y = 0
Z = 0
'**********************************************************
' ----Hauptschleife----
'**********************************************************
Do
B = 206 'Steigung 1° = 2,06 bit mehr und da man keine Kommastellen angeben kann * 100
C = 56300 'Offset wert bei 0° hat die Schaltung 563 Bit * 100 für die Rechnung
Incr Curch
If Curch > 1 Then Curch = 0
Temp = Admux And &B11110000
Admux = Temp Or Curch
Lb1 = Adcl 'Abfrage des Lowbits
Hb1 = Adch
Waitms 20 'Abfrage des Highbits
Hb1 = Hb1 And &B00000011 'Highbit mit 3 und verknüpfen um eventuele Störsignale ich ein zu Beziehen
Hb1 = Hb1 * 256 'High bit * 256 um 1023 bit zu bekommen
A = Lb1 + Hb1
'Variable A = Gesamt bit High- und Lowbit
D = A * 100 'Umwandlung von A für die Berechnung der Temperatur
Ye = D - C
'Bitwert der Temperatur - Offset
Xe = Ye / B
Udr = Xe
Incr Curch
If Curch < 1 Then Curch = 1
Temp = Admux And &B11110000
Admux = Temp Or Curch
Lb2 = Adcl
Hb2 = Adch 'Abfrage des Highbits
Waitms 20
Hb2 = Hb2 And &B00000011 'Highbit mit 3 und verknüpfen um eventuele Störsignale ich ein zu Beziehen
Hb2 = Hb2 * 256 'High bit * 256 um 1023 bit zu bekommen
G = Lb2 + Hb2
H = G * 100
I = H - C
'Resultierenden Wert Y durch die Steigung B X= Temperatur
J = I / B
Udr = J
If E < 40 Then E = 60
If F > 30 Then F = 20
Locate 1 , 15 : Lcd Xe : Lcd Chr(0)
Locate 2 , 15 : Lcd J : Lcd Chr(0)
Locate 3 , 15 : Lcd Max_temp : Lcd Chr(0)
Locate 4 , 15 : Lcd Min_temp : Lcd Chr(0)
Enable Timer0 'Timer0 aktiv
Enable Interrupts
If Taster = 0 Then ' ist der Taster betätigt ?
' Ja dann setze Layout auf null oder eins abhänig davon welchen wert es vorher hatte.
Toggle Anzeige_flag
Lcd_flag = 0 ' Setze Flag LC auf 0
End If
If Anzeige_flag = 0 Then
' ist die LCD schon Beschrieben?
Gosub Lcdanzeige ' Nein Springe zur Routine LCDanzeige
Else
Gosub Menue ' ja dan springe in menue
End If
Loop
'*******************************************************************************
'*******************************************************************************
' -----------------------Subroutinen--------------------------
'*******************************************************************************
Lcdanzeige:
If Lcd_flag = 0 Then
X = 0
Y = 0
Z = 0 ' Standart Bildschirm festlegen
Cls
Locate 1 , 1 : Lcd "Kuehlagregat"
Locate 2 , 1 : Lcd "Kuehlhaus"
Locate 3 , 1 : Lcd "Obere Temp."
Locate 4 , 1 : Lcd "Untere Temp."
' festlegung Lcd ist schon beschrieben
Lcd_flag = 1
End If
Bitwait Taster , Set
' darauf warten das taster wieder betätigt wird
Return
'Sub für Taster-----------------------------------------------------------------
Menue:
Z = 3 'Pfeile auf Abbrechen vorgeben
Do
If Lcd_flag = 0 Then 'wurde das LCD schon mal aktualisiert?
Cls
Locate 1 , 1 : Lcd "Einstellmenue..."
Locate 2 , 1 : Lcd " Max-Wert " : Lcd Chr(0)
Locate 3 , 1 : Lcd " Min-Wert " : Lcd Chr(0)
Locate 4 , 1 : Lcd " Abbrechen "
Lcd_flag = 1 'LCD wurde einmal aktualisiert
Bitwait Taster , Set 'warten ob der Taster losgelassen wurde
Else
End If
Max_wert_set:
X = 1
Y = 0
Z = 1
If Taster = 0 Then
' wenn X = 1 dann setzte den oberen hysterese wert um 5 hoch
Gosub Lcdanzeige
End If
Bitwait Taster , Set
Return
Min_wert_set:
Y = 1
X = 0
Z = 2
If Taster = 0 Then
' wenn X = 1 dann setzte den oberen hysterese wert um 5 hoch
Gosub Lcdanzeige
End If
Bitwait Taster , Set
Return
Abbrechen:
If Taster = 0 Then
Lcd_flag = 0
Gosub Lcdanzeige
End If
Return
End
Nichts gegen deine Version Cassio aber es darf auch nicht zu schwer werden, sonst kaufen die Prüfer mir das so gar nicht ab das ich mit Hilfe von euch erarbeitet habe.