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
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
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.
Mit Taste 5 verlässt man das Menü.
PS: Zeit geht nur bis max 255 Minuten, aber egal eigentlich.
MFG
Lesezeichen