'----------------------------------------------------------------------------------------- '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 : 1 ' ' ' 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 "" , "" , "" , "" , "" , "" , "" , "" , "" , ""