$regfile = "m16def.dat" ' Atmega32 auswählen $crystal = 16000000 ' 16MHz Oszillator auswählen 'LCD Konfigurieren Config Lcd = 16 * 2 ' 16*2 LCD auswählen Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portb.4 , Rs = Portd.7 ' LCD Pins initialisieren Config Porta.3 = Input 'Tastatur Reihen auf Eingang stellen Config Porta.2 = Input ' "" Config Porta.1 = Input ' "" Config Porta.0 = Input ' "" Porta.3 = 1 'Pullups für Tastatur konfigurieren Porta.2 = 1 ' "" Porta.1 = 1 ' "" Porta.0 = 1 ' "" Config Porta.6 = Output 'Tastatur Spalten auf Ausgang stellen Config Porta.5 = Output ' "" Config Porta.4 = Output ' "" Config Portb.0 = Output 'Lautsprecher Pin auf Ausgang stellen Config Portc.6 = Input 'Ausgang vom Multiplex auf Eingang stellen Config Portc.3 = Output 'Multiplex Zähl Eingang auf Ausgang stellen Config Portc.4 = Output ' "" Config Portc.5 = Output ' "" 'Variablen deklarieren Dim S As String * 12 ' Variable S als String konfigurieren mit einer Länge von 12 Zeichen Dim Ss As String * 1 ' Variable Ss als String konfigurieren mit einer Länge von einem Zeichen Dim Zähler As Integer ' Variable Zähler als Integer konfigurieren Dim Mpx As Integer ' Variable Mpx als Integer konfigurieren Dim Zeit As Integer ' Variable Zeit als Integer konfigurieren Dim Ausgabe As Integer ' Variable Ausgabe als Integer konfigurieren Dim Zone As Integer ' Variable Zone als Integer konfigurieren Dim Adcwert As Integer ' Variable Adcwert als Integer konfigurieren Dim Volt As Single ' Variable Volt als Single konfigurieren ( wegen Kommastellen) Dim Code As String * 4 ' Variable Code als String konfigurieren mit einer Länge von 4 Zeichen Dim Test As Integer ' Variable Test als Integer konfigurieren Dim Codetest As String * 4 ' Variable Codetest als String konfigurieren mit einer Länge von 4 Zeichen 'ADC PROGRAMM ' ADC Initialisieren Config Adc = Single , Prescaler = Auto , Reference = Internal ' ADC Initialisieren, Interne Referenzspannung benutzen 'Startwerte in die Variablen setzen Zähler = 0 ' Multiplex Binärzähler auf 0 setzen Zeit = 10 ' Zeit auf 10 setzen Codetest = "770*" ' Hier kann man den gewünschten Code eingeben S = "123456789*0#" ' Aus dieser Variable wird das gewählte Zeichen herausgeholt 'Größe festsetzen Dim Kolonne As Byte ' Dim Reihe As Byte ' Dim Key As Byte 'key kritt tastennummer Declare Function Query_matrix() As Byte ' Funktion für Tastenerkennung Do ' Start Hauptprogram Gosub Passwuert ' Zeichen der Tastatur einlesen If Len(code) > 3 Then ' Kontrollieren ob schon 4 Zeichen eingegeben worden sind If Code = Codetest Then ' Eingabe mit dem Passwort vergleichen Gosub Schluss ' Passwort richtig eingegebn , Alarmanlage wird ausgeschaltet Else End If Code = "" ' Variable Code leeren Else End If Zeit = 10 ' Zeit zurücksetzen, sollte sie schon einmal auf 0 gelaufen sein Start Adc ' ADC starten Adcwert = Getadc(7) ' Spannungswert einlesen Volt = Adcwert * 2.56 ' Volt = Volt / 1024 ' Volt = Volt * 12 ' Volt = Volt + 0.2 ' Der Wert vom Spannungsteiler wird ungefähr auf den Wert der Eingangsspannung umgerechnet If Adcwert > 345 Then ' Kontrolliert ob die Spannung über 10,5V liegt Gosub Displayx ' Ist die Spannung in Ordnung wird sie durch ein Unterprogramm angezeigt Else Gosub Displayalarm ' Sinkt die Spannung unter 10,5V wird Alarm ausgelöst End If Zähler = Zähler + 8 ' Multiplex Zähler geht weiter ( In 8er Schritten, da die Ausgabe ab Port 3 erfolgt ) If Zähler > 56 Then ' Zähler zählt 8 Schritte Zähler = 0 ' Wird zurückgesetzt wenn der Endwert erreicht Else End If Portc = Zähler ' Zähler an Multiplex geben Mpx = Pinc.7 ' Multiplex Ausgang einlesen If Mpx <> 1 Then ' Kontrolle, ob 5V anliegen Gosub Alarm ' Sollte eine Unterbrechung vorliegen, wird Alarm ausgelöst Else End If Loop ' Endlosschleife End Function Query_matrix() As Byte ' Funktion zum Einlesen der Tastatur Key = 0 ' Variable Key auf 0 als Startwert legen For Kolonne = 0 To 2 ' Welche Kolonne ist betätigt Porta.4 = 1 Porta.5 = 1 Porta.6 = 1 If Kolonne = 0 Then Reset Porta.4 If Kolonne = 1 Then Reset Porta.5 If Kolonne = 2 Then Reset Porta.6 For Reihe = 4 To 7 Select Case Reihe Case 4 : Debounce Pina.0 , 0 , Calc_key , Sub Case 5 : Debounce Pina.1 , 0 , Calc_key , Sub Case 6 : Debounce Pina.2 , 0 , Calc_key , Sub Case 7 : Debounce Pina.3 , 0 , Calc_key , Sub End Select Next Next Query_matrix = Key ' Ausgewählte Taste auf Key legen End Function Query_matrix() Calc_key: ' Gewählte Taste aus Reihe auswählen Select Case Reihe Case 4 : Key = Kolonne + 1 Case 5 : Key = Kolonne + 4 Case 6 : Key = Kolonne + 7 Case 7 : Key = Kolonne + 10 End Select Return Alarm: ' Unterprogramm Alarm Cls Cursor Blink Cls Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd "Achtung Einbruch!" ' Text ausgeben Zone = Zähler / 8 ' Zone berechnen Locate 2 , 1 ' Untere Reihe vom LCD auswählen Lcd "Zone: " ; Zone ; " !" ' Zone ausgeben, in welcher Alarm ausgelöst wurde Sound Portb.0 , 124 , 675 ' Alarmsignal über Lautsprecher ausgeben Sound Portb.0 , 110 , 758 Sound Portb.0 , 248 , 675 Gosub Passwuert ' Zeichen der Tastatur einlesen über Unterprogramm If Len(code) > 3 Then ' Kontrollieren ob schon 4 Zeichen eingegeben worden sind If Code = Codetest Then ' Eingabe mit dem Passwort vergleichen Code = "" ' Variable Code leeren Return ' Aus Unterprogramm rauspringen wenn der Code richtig ist Else Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd "Falscher Code !" ' Text bei Falscheingabe anzeigen Wait 1 ' Text eine Sekunde lang anzeigen End If Code = "" ' Variable Code leeren Goto Alarm ' Alarm ausgeben wenn Code Falsch Else Goto Alarm ' Alarm ausgeben wenn Code noch nicht eingegeben End If Displayx: ' Unterprogramm Displayx Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd Ss ' Eingegebene Taste anzeigen Locate 2 , 1 ' Untere Reihe vom LCD auswählen Lcd "Spannung: " ; Volt ; "V" ' Eingangsspannung anzeigen Waitms 100 ' 100ms warten Return ' Aus Unterprogramm rausspringen Displayalarm: ' Unterprogramm Displayalarm Cls Cursor Blink Cls Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd "Achtung Spannung!" ' Text ausgeben Locate 2 , 1 ' Untere Reihe vom LCD auswählen Lcd "Spannung: " ; Volt ; "V" ' Text ausgeben und Spannung anzeigen Sound Portb.0 , 124 , 675 ' Alarmsignal über Lautsprecher ausgeben Sound Portb.0 , 110 , 758 Sound Portb.0 , 248 , 675 Waitms 250 ' 250ms warten Decr Zeit ' Gibt an wie oft Alarm ertönt, bis die Spannung erneut überprüft wird If Zeit > 0 Then ' Ist die Zeit über 0 gelaufen? Goto Displayalarm ' Nochmal Alarm ausgeben Else End If Return ' Ist Zeit auf 0 springt das Programm zurück Schluss: ' Unterprogramm Schluss Cls Cursor Blink Cls Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd "Alarmanlage im Ruhezustand" ' Anzeigen dass Alarmanlage im Ruhezustand ist Locate 2 , 1 ' Untere Reihe vom LCD auswählen Lcd "Code eingeben " Gosub Passwuert ' Zeichen der Tastatur einlesen über Unterprogramm If Len(code) > 3 Then ' Kontrollieren ob schon 4 Zeichen eingegeben worden sind If Code = Codetest Then ' Eingabe mit dem Passwort vergleichen Return ' Bei Übereinstimmung wird Alarm wieder eingeschaltet Else Locate 2 , 1 ' Untere Reihe vom LCD auswählen Lcd "Falscher Code !" ' Text ausgeben Wait 5 ' 5 Sekunden Wartezeit bei Falscheingabe End If Code = "" ' Variable Code leeren Else Goto Schluss ' Ruheschleife End If Passwuert: Key = Query_matrix() ' Funktion Query_matrix aufrufen If Key <> 0 Then ' Ist eine Taste gedrückt? Ss = Mid(s , Key , 1) ' Zeichen aus der Zeichenkette auswählen und in die Variable Ss schreiben End If Cls Locate 1 , 1 ' Obere Reihe vom LCD auswählen Lcd Ss ; " " ; Code ' Eingegebenes Zeichen und Code Zeichenkette anzeigen Waitms 50 ' 50 ms warten Code = Code + Ss ' Codezeichenkette füllen Ss = "" ' Variable Ss leeren Return ' Rücksprung