$regfile = "attiny2313.dat"
$crystal = 1000000
$hwstack = 2
$swstack = 5
'$regfile = "m8def.dat"
'$crystal = 1000000
'Codeabfrage über Wählscheibentelefon
'Ein und Ausgänge konfigurieren
Config Portb = Output
Config Pind.0 = Input
Config Pind.1 = Input
'Timer konfigurieren
Config Timer1 = Timer , Prescale = 64
On Timer1 Bereit
Enable Timer1
Enable Interrupts
Const Timerstartwert = 49911
Timer1 = Timerstartwert
'Alias Namen zuweisen
Nsi Alias Pind.1 'Impulsleitung vom Nummernschalter
Nsa Alias Pind.0 'Nummernschalterkontakt, für Wählscheibe dreht oder steht
'Interne pullups zuschalten
Portd.0 = 1
Portd.1 = 1
'Variablen zuweisen
Dim A As Byte 'Anzahl der Impulse pro Wahlvorgang
Dim Nummer As String * 10 'Der String in dem die gewählte Nummer geschrieben wird
' !!genau so gross wie der String "Rufnummer"!!
Dim Rufnummer As String * 10 'Der String in dem die zu wählende Nummer festgelegt wird
'die max länge ist hier auf 10 Nummern beschränkt
'Alle Variablen auf Null setzen
A = 0
Nummer = "" 'Sicherstellen, das String leer
Portb = &B11000000
'Hauptprogrammschleife
Rufnummer = "12" 'Hier die zu wählende Nummer eintragen
'Abfrage des Nummernschalters
Do
Debounce Nsi , 1 , Impulse , Sub 'Impulsschalter entprellen und Sprunganweisung
Debounce Nsa , 1 , Auswerten , Sub 'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop
'Implse hochzählen
Impulse:
A = A + 1
Return
Auswerten:
If A = 0 Then 'Verhindern, das beim Start schon etwas in den Sting "Nummer"geschrieben wird
Return
End If
If A = 10 Then 'beim wählen der Nummer 0 werden 10 Impulse erzeugt.
A = 0 'hier durch wird im String eine "0" geschrieben
End If
Nummer = Nummer + Str(a) 'Die ermittelten Impulse der Rufnummer hinzufügen
If Len(nummer) = Len(rufnummer) Then 'Länge der gewählten Nummer mit Länge der zu wählenden Nummer vergleichen
'durch den Längenvergleich der Strings, muss keine extra längen Angabe mehr gemacht werden
Goto Kontrolle 'wenn Länge gleich dann zur Kontrolle
End If
A = 0 'Impulse für nächste Nummer löschen
Return
Kontrolle:
If Nummer = Rufnummer Then 'zu wählende Nummer mit gewählter Nummer vergleichen
Goto Koordinaten 'wenn gleich dann Anzeige der Koordinaten
Else
Goto Falsch 'wenn ungleich dann Anzeige "Falsch"
End If
End 'end program
'Koordinaten Anzeige
Koordinaten:
Disable Interrupts
Do
Gosub Leer
Wait 1 'Anzeigedauer des Zeichens
Gosub N
Wait 1
Gosub Eins
Wait 1
Gosub Zwei
Wait 1
Gosub Grad
Wait 1
Gosub Drei
Wait 1
Gosub Vier
Wait 1
Gosub Dp
Wait 1
Gosub Fuenf
Wait 1
Gosub Sechs
Wait 1
Gosub Sieben
Wait 1
Gosub Leer
Wait 1
Gosub E
Wait 1
Gosub Acht
Wait 1
Gosub Neun
Wait 1
Gosub Null
Wait 1
Gosub Grad
Wait 1
Gosub Eins
Wait 1
Gosub Zwei
Wait 1
Gosub Dp
Wait 1
Gosub Drei
Wait 1
Gosub Vier
Wait 1
Gosub Fuenf
Wait 1
Gosub Leer
Wait 1
Loop
'Falschanzeige
Falsch:
Disable Interrupts
Do
Gosub Leer
Waitms 500
Gosub F '
Waitms 500
Gosub A1
Waitms 500
Gosub L
Waitms 500
Gosub S
Waitms 500
Gosub C
Waitms 500
Gosub H
Waitms 500
Gosub Leer
Waitms 500
Loop
'Bereitanzeige
Bereit:
Timer1 = Timerstartwert
Toggle Portb
Portb.7 = 1
Portb.6 = 1
Return
' Zeichensatz
Leer:
Portb = &B11111111
Return
Dp:
Portb = &B01111111
Return
Null:
Portb = &B11000000
Return
Eins:
Portb = &B11111001
Return
Zwei:
Portb = &B10100100
Return
Drei:
Portb = &B10110000
Return
Vier:
Portb = &B10011001
Return
Fuenf:
Portb = &B10010010
Return
Sechs:
Portb = &B10000010
Return
Sieben:
Portb = &B11111000
Return
Acht:
Portb = &B10000000
Return
Neun:
Portb = &B10010000
Return
A1:
Portb = &B10001000
Return
C:
Portb = &B11000110
Return
E:
Portb = &B10000110
Return
F:
Portb = &B10001110
Return
H:
Portb = &B10001001
Return
L:
Portb = &B11000111
Return
N:
Portb = &B10101011
Return
S:
Portb = &B10010010
Return
Grad:
Portb = &B10011100
Return