Hier noch der (Bascom-)Quellcode:
Code:
 ' Zeitschalter und Punktezähler für Spritzenhaus
 ' (c) AlKi
 '
 ' ATMega8 + LCD + Lichtschranke + 2 Taster + Poti + Lautsprecher + Relais für Wasserpumpe
 '
 ' Und NOT-AUS-Schalter in VCC!!! ( wenn Stromversorgung durch Trafo: Beide Adern durch NOT-AUS trennbar!!!)
 '
 '
 ' Anschlussbelegung:
 '
 '
 ' LCD: RS = PC1 ; Ex = PB1 ; DB4 = PC2 ; DB5 = PC3 ; DB6 = PC4 ; DB7 = PC5
 '
 ' Signaleingang:  PB6                     ( gegen GND da interner Pullup )
 '
 ' Taster:
 '   Start/Weiter: PD7                     ( beide gegen GND da interne Pullups und mit Kondensatoren entprellt )
 '   Rücksetzen:   PD6
 '
 ' Poti:           PC0/ADC0                ( als Spannungsteiler zwischen VCC und GND, mindestens 5kOhm )
 '
 ' Lautsprecher(-ansteuerung): PB0         ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
 '
 ' Relais(-ansteuerung):       PB7         ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
 '
 '
 '
 ' Features:
 '
 ' - Punktestand und Spielerzahl wird am LCD ausgegeben
 ' - über Poti einstellbare Rundenzeit (bis 2min 30sec)
 ' - Startsignal über Lautsprecher
 ' - automatisches Schalten der Pumpe ( bis 230V max 12A, auch Magnetventil möglich)
 ' - nach jedem Teilnemer Pumpenstopp
 ' - manuelles Zurücksetzen des Punktestandes und der Teilnehmerzahl
 '    nach jedem Teilnehmer möglich => egal wieviele Teilnehmer pro Gruppe (einzeln bis 255 pro Gruppe)
 '



 $regfile = "m8def.dat"
 $crystal = 8000000




      ' Ausgänge einstellen
 Config Portb.0 = Output
 Beeper Alias Portb.0

 Config Portb.7 = Output
 Pumpe Alias Portb.7



     ' Eingänge einstellen
 Config Pind.7 = Input                                 ' Start-/Weiter- Taster
 Portd.7 = 1                                                ' Pullup an
 Xstart Alias Pind.7

 Config Pind.6 = Input                                 ' Resettaster
 Xrueck Alias Pind.6
 Portd.6 = 1                                                ' Pullup an

 Config Pinb.6 = Input                                 ' Signaleingang von Lichtschranke
 Xsig Alias Pinb.6
 Portb.6 = 1                                                ' Pullup an





     ' LCD einstellen
 Config Lcd = 20 * 2                                        '
 Config Lcdbus = 4                                          '
 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.1 , Rs = Portc.1       '


     ' ADC einstellen
 Config Adc = Single , Prescaler = 64 , Reference = Avcc

 Start Adc                                                  'und gleich aktivieren



 Dim Zaehler As Long                          ' Variablen
 Dim Zeit As Long

 Dim Punkte As Long                           ' wird später nach x Vorpunkten um 1 erhöht
 Dim Vorpunkte As Byte                      ' Vorpunkte, damit nicht jedes Signal einen Punkt ergibt
 Dim Spieler As Byte                          ' Die Variable für Spieler

 Dim X As Long

 Dim Xsignalalt As Bit                        ' der letzte Zustand des Eingangs wird hier drauf abgespeichert (zum Vergleichen mit aktuellem)

 Dim Dreh As Byte                             ' Die Variable für die Animation



 ' ----------------- Programmstart -------------------------------------------------------------


 Wait 1                                          ' damit das LCD genug Zeit zum "Hochfahren" hat

 Initlcd


 Cursor Off

 Xsignalalt = 0
 Vorpunkte = 0
 Spieler = 0
 Punkte = 0
 Dreh = 0

 Cls                                                        ' erstmal alles =0 und leeren

 While Xstart = 1
  Locate 1 , 1
  Lcd " Bereit..."
 Wend
        ' weiter erst, wenn "Start" (Starttaster gedrückt)


 Do                                                         ' eigentliche Hauptschleife

  Zaehler = 0
  Zeit = 0
  X = 0
  Vorpunkte = 0
  Dreh = 4                                                 ' =4, da es gleich anderweitig genutzt wird (zum Tröter zählen)

  Incr Spieler                                              ' nächster Spieler ist dran


  Cls
  Locate 1 , 1
  Lcd Punkte ; " Punkte"
  Locate 2 , 1
  Lcd "Spieler " ; Spieler


  Zaehler = Getadc(0)                                       ' Wert des Potis als Zeit geladen



  While Dreh > 1                                            ' 4 mal Piepsen, "Dreh" wird hier "missbraucht"

   Decr Dreh

   Locate 1 , 17

   Lcd Dreh


   Beeper = 0          
   While X < 100000                                      ' vor/zwischen Piepsern warten
   Incr X
   Wend

   X = 0
   While X < 150                             ' Tröt-Schleife
    Toggle Beeper
    While Zeit < 100
     Incr Zeit
    Wend
    Zeit = 0
    While Zeit < 500
     Incr Zeit
    Wend
    Zeit = 0
    Incr X
   Wend
   X = 0

  Wend


  Locate 1 , 17
  Lcd "GO!"


  Zeit = 0
  X = 0
  Dreh = 0                                                  ' Variablen wieder = 0

  Beeper = 0                                                ' Lautsprecher garantiert aus


  Pumpe = 1                                                 'Pumpe an



  While Zeit < Zaehler                                      ' Anfang Zählschleife

   X = 0
   Incr Zeit

   While X < 5

    If Xsig = Xsignalalt Then                               ' hat sich der Eingang geändert?
                                                             ' wenn nicht, dann mach nix
    Else                                                    ' ansonsten

     Xsignalalt = Xsig                                      ' Zustand speichern
     Incr Vorpunkte                                         ' und Flanke zählen

     Select Case Vorpunkte

      Case 4 : Incr Dreh                                    ' Variable für die Animation verändern
      Case 8 : Incr Dreh
      Case 12 : Incr Dreh
      Case 16 : Incr Dreh

     End Select

     If Dreh = 4 Then                                       ' und wenn sie zu hoch ist => =0
      Dreh = 0
     End If

     If Vorpunkte = 16 Then                                 ' Endgültiges Punktezählen

      Incr Punkte
      Vorpunkte = 0
     End If

    End If


    Locate 1 , 1
    Lcd Punkte ; " Punkte"                                  ' Ausgabe des Punktestands

    Locate 1 , 14

    Select Case Dreh                                        ' Ausgabe der Animation in der oberen Zeile
      Case 0 : Lcd "^"
      Case 1 : Lcd "-"
      Case 2 : Lcd "_"
      Case 3 : Lcd " "
    End Select

    Locate 2 , 14

    Select Case Dreh                                        ' Ausgabe der Animation in der unteren Zeile
      Case 0 : Lcd "-  _   "
      Case 1 : Lcd "_   _  "
      Case 2 : Lcd " _   _ "
      Case 3 : Lcd "^ _   _"
    End Select

    Locate 2 , 1
    Lcd "Spieler " ; Spieler                                ' Ausgabe der Spielerzahl

    Incr X

   Wend

  Wend


  ' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#

  '    Ende der Runde

  ' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#


  Pumpe = 0                                                 ' Pumpe aus

  Zeit = 0
  X = 0

  Locate 2 , 14
  Lcd "Stopp"                                               'Ausgabe "Stopp"

  While X < 150                                             ' Endpiepser
   Toggle Beeper
   While Zeit < 100
    Incr Zeit
   Wend
   Zeit = 0
   While Zeit < 500
    Incr Zeit
   Wend
   Zeit = 0
   Incr X
  Wend
  X = 0


  Zeit = 0
  X = 0
  Vorpunkte = 0                                             ' Variablen wieder = 0

  Beeper = 0

  Cls

  While Xstart = 1                                          ' Solange Starttaster inaktiv (Warteschleife mit Ausgabe)

   If Xrueck = 0 Then                                       ' falls Resettaster aktiv
    Spieler = 0                                             ' Spielernummer und
    Punkte = 0                                              ' Punktestand auf 0 setzen
    Cls                                                     ' und das Display leeren (zur Siherheit)
   End If

   Locate 1 , 1
   Lcd Punkte ; " Punkte"                                   ' Punkte, Spielernummer, Punktestand und "Stopp" ausgeben
   Locate 2 , 1
   Lcd "Spieler " ; Spieler
   Locate 2 , 12
   Lcd "Stopp"
                                                             ' sonst nix tun
  Wend

  Zeit = 0
  X = 0

 Loop

 '---------------------------- Ende ------------------------------------------------