Zurück

'-----------------------------------------------------------------------------------------
'Titel : SchachtelUhr
'Name : SchachtelUhr.bas
'Autor : Arno Schweißinger
'Datum : 13.11.2009
'Version : 0.00
'Compiler : Bascom 1.11.8.7
'MicroController : 1 AtMega16 1MHz interner Takt
'Hardware : 24 Lämpchen aus einer 35er Lichterkette
' 4 ULN2003
' 1 UhrenQuarz 32768Hz
' 1 78L05
'Stromversorgung: : 8V , 500 mA
'Besonderes :
'Letzte Änderung : 20.11.2009
'
'
' Anordnung der Lampen
'
' PA0 PA1 PA2 PA3 PA4 E.I E.W GLH KRZ FNF
'
' PA5 PA6 PA7 PD0 PD1 ZHN VRL ZWG VOR NCH
'
' PD2 PD3 PC0 PD4 PD5 HLB PKT EIN ZWE
'
' PD6 PD7 PB0 PB1 PB2 DRE VIE FÜN SEC SIE
'
' PB3 PB4 PB5 PB6 PB7 ACH NEU ZEH ELF ZWÖ
'
'
'-----------------------------------------------------------------------------------------

$regfile = "m16def.dat"
$crystal = 1000000
$lib "mcsbyte.lbx"


Config Porta = Output ' = Lamp1
Config Portb = Output ' = Lamp3
Config Portc = Output
Config Portd = Output ' = Lamp2
Config Pinc.0 = Output ' Lampe mitte und LSP
Config Pinc.1 = Input
Config Rc5 = Pinc.1
Config Date = Dmy , Separator = . ' ANSI-Format
Config Clock = Soft ' Uhrenquarz 32768 Hz

Soundpin
Alias Portc.0

Declare Sub Zeitstellen
Declare Sub Getziffer
Declare Sub Ausgabelampen
Declare Sub Stundensignal
Declare Sub Bestaetigung
Declare Sub Ausgabestunde
Declare Sub Initprog

Dim Address As Byte , Command As Byte 'reserve space for variables
Dim S As String * 1 ' sendecode
Dim Zeit As String * 8
Dim Stunde As Byte
Dim Temp As Byte
Dim Togglebit As Bit , Togglealt As Bit
Dim Led_sec As Byte , Led_min As Byte , Led_hour As Byte ' Sub Led_updat
Dim I As Byte
Dim Lamp1 As Byte
Dim Lamp2 As Byte
Dim Lamp3 As Byte
Dim Offset As Byte

'****************************************************************************
'-------------------------
' Hauptprogramm
'-------------------------
'****************************************************************************
' Time$ = "01:59:30"
Call Initprog
Enable Interrupts
Call Zeitstellen

Do
Call Ausgabelampen
Call Stundensignal
Waitms 50 ' Verzögerung
Loop
End ' ende Hauptprogramm

'****************************************************************************
Sub Initprog
'****************************************************************************
Sound Soundpin , 100 , 40 ' Bereitschaftston
Lamp1
= 0 : Lamp2 = 0 : Lamp3 = 0 ' alle Lampen aus
Porta = Lamp1 : Portd = Lamp2 : Portb = Lamp3 ' Lampen ausschalten
Lamp1
= 1 : Lamp2 = 1 : Lamp3 = 1 ' erst Bit für Lauflicht

For I = 0 To 7
Porta = Lamp1 ' Lauflicht zur Kontrolle
Waitms 150
Rotate Lamp1 , Left
Next I
Porta = 0

For I = 0 To 7
Portd = Lamp2
Waitms 150
Rotate Lamp2 , Left
Next I
Portd = 0

For I = 0 To 7
Portb = Lamp3
Waitms 150
Rotate Lamp3 , Left
Next I
Portb = 0
End Sub

'****************************************************************************
Sub Ausgabelampen
'****************************************************************************
Offset
= _min * 2 ' 2 Byte je Minute
Lamp1
= Lookup(offset , Lampenfolge )
Incr Offset
Lamp2
= Lookup(offset , Lampenfolge )
Lamp3
= 0 ' Altlasten löschen

Stunde
= _hour ' kopie der Stunden
If Stunde = 0 Then Stunde = 12 ' Null Uhr gibt es nicht
If Stunde > 12 Then Stunde = Stunde - 12 ' Keine 13-24 stunden
If Lamp2.4 = 1 Then Incr Stunde ' Stunde weiter anzeigen
If Stunde = 13 Then Stunde = 1 ' Nullduchgang
Reset Lamp2.4 ' Info-Bit nicht anzeigen
Call Ausgabestunde
End Sub

'****************************************************************************
Sub Ausgabestunde
'****************************************************************************
Select Case Stunde ' Textausgabe
Case 1 : Set Lamp2.4 ' EINS
Case 2 : Set Lamp2.5 ' ZWEI
Case 3 : Set Lamp2.6 ' DREI
Case 4 : Set Lamp2.7 ' VIER
Case 5 : Set Lamp3.0 ' FÜNF
Case 6 : Set Lamp3.1 ' SECHS
Case 7 : Set Lamp3.2 ' SIEBEN
Case 8 : Set Lamp3.3 ' ACHT
Case 9 : Set Lamp3.4 ' NEUN
Case 10 : Set Lamp3.5 ' ZEHN
Case 11 : Set Lamp3.6 ' ELF
Case 12 : Set Lamp3.7 ' ZWÖLF
End Select
Porta = Lamp1 ' Lampen schalten
Portd = Lamp2
Portb = Lamp3
End Sub

'****************************************************************************
Sub Bestaetigung
'****************************************************************************
Lamp1
= 0 : Lamp2 = 0 : Lamp3 = 0
Stunde
= Val(s)
If Stunde = 0 Then Stunde = 10 ' Ziffer Null gibt es nicht
Call Ausgabestunde
End Sub

'****************************************************************************
Sub Zeitstellen
'****************************************************************************
Zeit
= ""
For I = 1 To 4
Togglealt
= Togglebit
While Togglealt = Togglebit
Gosub Getziffer
Wend
Sound Soundpin , 20 , 40 ' Bereitschaftston
Call Bestaetigung ' Ausgabe der Ziffer
Zeit
= Zeit + S
If I = 2 Then Zeit = Zeit + ":"
Next I
Zeit
= Zeit + ":00"
Time$ = Zeit
Cls
Lcd "Zeit: " ; Time$
Waitms 300
End Sub

'****************************************************************************
Sub Getziffer
'****************************************************************************
Do
Getrc5(address , Command)
' Sound Soundpin , 20 , 40 ' Bereitschaftston
If Address <> 255 Then
If Command > 127 Then ' bx0000000 (Bit 7)
Togglebit
= 1 ' Togglebit merken
Else
Togglebit
= 0
End If
Command
= Command And &B00111111 ' clear the toggle bit
S
= Lookupstr(command , Asciidaten )
End If

Temp
= Asc(s)
If Temp > &H2F Then
If Temp < &H3A Then
Exit Do
End If
End If
Loop
End Sub


'****************************************************************************
Sub Stundensignal
'****************************************************************************
If _sec = 0 Then
If _min = 0 Then
Sound Soundpin , 50 , 40
Waitms 200
End If
End If
End Sub


Lampenfolge
:
'********************************************************
' Decodieren der Minuten in Text
'
' 00:00 1. Zeile Data 1 , 8
' . Zeile
' 00:59 60. Zeile Data 5 , 17
'
' 1. Byte
' 0.Bit = Es ist
' 1.Bit = Eben War
' 2.Bit = Gleich
' 3.Bit = Kurz
' 4.Bit = Fünf
' 5.Bit = Zehn
' 6.Bit = Viertel
' 7.Bit = Zwanzig
'
' 2. Byte
' 0.Bit = Vor
' 1.Bit = Nach
' 2.Bit = Halb
' 3.Bit = Punkt
' 4.Bit = Stunde + 1
'********************************************************
Data 1 , 8 ' 00
Data 2 , 0 ' 01
Data 9 , 2 ' 02
Data 9 , 2 ' 03
Data 21 , 2 ' 04
Data 17 , 2 ' 05
Data 18 , 2 ' 06
Data 18 , 2 ' 07
Data 37 , 2 ' 08
Data 37 , 2 ' 09
Data 33 , 2 ' 10
Data 34 , 2 ' 11
Data 34 , 2 ' 12
Data 69 , 2 ' 13
Data 69 , 2 ' 14
Data 65 , 2 ' 15
Data 66 , 2 ' 16
Data 66 , 2 ' 17
Data 133 , 2 ' 18
Data 133 , 2 ' 19
Data 129 , 2 ' 20
Data 130 , 2 ' 21
Data 130 , 2 ' 22
Data 21 , 21 ' 23
Data 21 , 21 ' 24
Data 17 , 21 ' 25
Data 18 , 21 ' 26
Data 18 , 21 ' 27
Data 13 , 21 ' 28
Data 9 , 21 ' 29
Data 1 , 20
Data 9 , 22
Data 9 , 22
Data 21 , 22
Data 21 , 22
Data 17 , 22
Data 18 , 22
Data 18 , 22
Data 133 , 17
Data 133 , 17
Data 129 , 17
Data 130 , 17
Data 130 , 17
Data 69 , 17
Data 69 , 17
Data 65 , 17
Data 66 , 17
Data 66 , 17
Data 37 , 17
Data 37 , 17
Data 33 , 17
Data 34 , 17
Data 34 , 17
Data 21 , 17
Data 21 , 17
Data 17 , 17
Data 18 , 17
Data 18 , 17 ' 57
Data 5 , 16 ' 58
Data 9 , 17 ' 59


'------------------------------------- Decodieren der Tastatur -----------------
Asciidaten
:
Data "1" , "2" , "9" , "4" , "0" , "p" , "<" , "5" , "8" , "o"
Data "v" , "r" , "L" , "b" , "õ" , "k" , "7" , "³" , "l" , "S"
Data "E" , "y" , "#" , "j" , "4" , "i" , "3" , "u" , "m" , "x"
Data "O" , "f" , "6" , "2" , "z" , "n" , "L" , "1" , "d" , "g"
Data "5" , "t" , "q" , "w" , "e" , "3" , "s" , "a" , "?" , " "
Data "?" , "h" , "R" , "c" , "U" , "÷" , "?" , "?" , "?" , "?"
Data "?" , "?" , "?" , "R"
Data "" , "" , "" , "" , "" , "" , "" , "" , "" , ""