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