Hallo,
hab mir heut einen Countdownzähler gebastelt auf Basis des RN-Control 1.4. Also kann Damit eine Zeit in Minuten einstellen. Und Wenn ich den Timer aktiviere läuft die Zeit ab und ein Ausgang wird gesetzt. Ist die Zeit abgelaufen Wird akustisch Alarm gegeben und der Ausgang wir zurückgesetzt. Alles in Verbindugn mit einen LCD (16X2).
Aber nun bin ich Blutiger Anfänger. Und für die kleine Funktion ist mein Code Riesig(siehe Anhang) , hat jmd vllt eine einfachere Lösung für das was ich brauche? Meine Lösung is besitmmt auch alles andere als Optimiert auf geschwindigkeit.......Sagt mir aml was alles Schlecht ist
Falls es jmd Testen will. Mit der Taste 1 startet man den Counter, Taste 2 hält ihn an. Mit Taste 5 geht man ins Menü zur Auswahl der Zeit. Ist man in diesem Menü kann man mit Taste 1 die Zeit um 1 Min. erhöhen und mit Taste 2 verringer. Mit den Tasten 3 und 4 geht das in 10er Schritten.Code:$regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 16000000 Declare Function Tastenabfrage() As Byte 'Für Tastenabfrage 'Variablen Dim Taste As Byte 'Für Tastenabfrage Dim Zeiteinstellung As Byte 'Variable für Eingestelte Zeit Zeiteinstellung = 0 Dim Sekunden As Byte 'Sekunden Sekunden = 0 Dim Timerstatus As Bit 'Timer: 1 = An oder 0 = Aus Dim Zeit As Byte 'Restzeit 'AUsgänge und Eingänge Config Portd.7 = Output 'Soundausgang Config Porta.7 = Input 'Eingang für Tasterabfrage Porta.7 = 1 'Pullup EIN Config Portc.0 = Output 'Countdownausgang Portc.0 = 1 'LCD-Config Cls Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , Rs = Porta.4 Config Lcdbus = 4 'ADC-Config Config Adc = Single , Prescaler = Auto 'Timer-Config Config Timer1 = Timer , Prescale = 256 On Timer1 Isr_von_timer1 Enable Interrupts Timer1 = 3036 Cls Locate 1 , 1 Lcd "Countdownzaehler " 'Begrüßungstext Sound Portd.7 , 300 , 350 ' Begrüsungssound:) Sound Portd.7 , 300 , 400 Sound Portd.7 , 300 , 450 Waitms 1500 Countdown: 'Menü 1 Waitms 200 Cls Locate 1 , 1 Lcd " Countdown " Locate 2 , 1 Lcd "Stop " Do If Zeit = 0 And Timerstatus = 1 Then 'Auschalten nach Ablauf der Zeit Aus: Disable Timer1 Portc.0 = 1 Print "Timer AUS" Reset Timerstatus Locate 1 , 1 Lcd "!!!!!!ALARM!!!!!! " Locate 2 , 1 Lcd "!ALARM!!!!Alarm! " Zeit = Zeiteinstellung Goto Alarm End If 'Anzeige der Restzeit auf LCD If Timerstatus = 1 Then Locate 2 , 1 Lcd "Start, Zeit:" ; Zeit ; " " End If 'Tastenabfrage Taste = Tastenabfrage() If Taste <> 0 Then Select Case Taste 'Countdown Starten Case 1 If Timerstatus = 0 And Zeit > 0 Then Zeit = Zeiteinstellung Set Timerstatus Timer1 = 3036 Enable Timer1 Print "Timer EIN" Portc.0 = 0 End If If Zeit = 0 Then 'Falls keine Zeit eingestellt ist, gehts automatisch zur Zeitauswahl bei versuch zu Starten Locate 2 , 1 Lcd "Zeit Einstellen!" Waitms 1200 Goto Zeiteinstellung End If Case 2 'Countdown Stopen per Hand If Timerstatus = 1 Then Disable Timer1 Portc.0 = 1 Print "Timer AUS" Reset Timerstatus Locate 2 , 1 Lcd "Stop " Zeit = Zeiteinstellung End If Case 3 'nicht zugewiesen Case 4 'nicht zugewisen Case 5 'Taste 5: Ins Menü zum einstellen der gewünschten Countdownzeit. If Timerstatus = 0 Then Goto Zeiteinstellung End If End Select Waitms 400 End If Loop Isr_von_timer1: 'Überlauf Timer1 nach 1 Sekunde Incr Sekunden Timer1 = 3036 If Sekunden >= 60 Then 'Umrechnen in Minuten Decr Zeit Sekunden = 0 End If Return 'Diese Unterfunktion fragt die Tastatur am analogen Port ab Function Tastenabfrage() As Byte Local Ws As Word Tastenabfrage = 0 Start Adc Ws = Getadc(7) If Ws < 500 Then Select Case Ws Case 400 To 450 Tastenabfrage = 1 Case 330 To 380 Tastenabfrage = 2 Case 260 To 305 Tastenabfrage = 3 Case 180 To 220 Tastenabfrage = 4 Case 90 To 130 Tastenabfrage = 5 End Select End If End Function Zeiteinstellung: 'Menü2 Waitms 200 Cls Locate 1 , 1 Lcd " Countdownzeit " Locate 2 , 1 Lcd " " ; Zeiteinstellung ; " Minuten " Do 'Tastenabfrage Taste = Tastenabfrage() If Taste <> 0 Then Select Case Taste Case 1 Incr Zeiteinstellung Waitms 150 Locate 2 , 1 Lcd " " ; Zeiteinstellung ; " Minuten " 'Taste1: Countdownzeit um 1 erhöhen Case 2 Decr Zeiteinstellung Waitms 150 Locate 2 , 1 Lcd " " ; Zeiteinstellung ; " Minuten " 'Taste2: Countdownzeit um 1 vermindern Case 3 Zeiteinstellung = Zeiteinstellung + 10 Waitms 150 Locate 2 , 1 Lcd " " ; Zeiteinstellung ; " Minuten " 'Taste3: Countdownzeit um 10 erhöhen Case 4 Zeiteinstellung = Zeiteinstellung - 10 Waitms 150 Locate 2 , 1 Lcd " " ; Zeiteinstellung ; " Minuten " 'Taste4: Countdownzeit um 10 vermindern Case 5 'Taste5:Bestätigen, Zurück zum Countdown Zeit = Zeiteinstellung 'Setzen der gewählten Zeit Goto Countdown End Select End If Waitms 100 Loop Alarm: 'Beep-Ton countdown Abgelaufen, Taste 2 Drücken zum Quittieren. Do Sound Pord.7 , 400 , 800 Sound Pord.7 , 400 , 700 'Tastenabfrage Taste = Tastenabfrage() If Taste <> 0 Then Select Case Taste Case 2 Goto Countdown End Select End If Loop End
Mit Taste 5 verlässt man das Menü.
PS: Zeit geht nur bis max 255 Minuten, aber egal eigentlich.
MFG







Zitieren
Lesezeichen