$crystal = 8000000 'Interner RC Oszillator 8MHz '$crystal = 1000000 '1 MHZ Quarz Config Portb = Output 'IO Ports setzen Config Pind.0 = Output Config Pind.1 = Output Config Pind.2 = Output Config Pind.3 = Input Config Pind.4 = Input Config Pind.5 = Input Dim Ziffer As String * 1 'Variablen definieren Dim Stelle As Integer Dim H As Integer Dim M As Integer Dim S As Integer Dim Timestring As String * 4 Dim Hs As String * 2 Dim Ms As String * 2 Dim Ss As String * 2 Dim Wert_preload As Integer 'Nur nötig bei Betrieb als Synchronuhr Portd.3 = 1 'Pull-UP Widerstände einschalten Portd.4 = 1 Portb = &H01111111 'IO Ports in Grundeinstellung bringen Portd.0 = 0 Portd.1 = 0 Portd.2 = 0 H = 0 'Alle Zähler auf "0" M = 0 S = 0 '************************ Timersettings für 50 Hz Synchronbetrieb ******************** Wert_preload = 50 '50 Ladewert für den Zähler Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1 'Timer konfigurieren On Timer1 Int_t1 'Bei Überlauf Interruptprogramm aufrufen Load Timer1 , Wert_preload 'Zähler laden Enable Timer1 '************************************************************************************* '************************ Timersettings für Quarzbetrieb ***************************** 'Ocr1a = 15625 ' 1000000 : 64 (Prescaler) : 15625 = 1 'Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Disconnect 'On Oc1a Int_t1 'Interrupt bei "compare" 'Enable Oc1a '************************************************************************************* Enable Interrupts While Pind.3 = 1 And Pind.4 = 1 'Solange die Uhr nicht gestellt ist, -- -- anzeigen! Ziffer = "e" Stelle = 4 Gosub Anzeigen 'Anzeigeprogramm aufrufen Stelle = 3 Gosub Anzeigen Stelle = 2 Gosub Anzeigen Stelle = 1 Gosub Anzeigen Wend Do Debounce Pind.3 , 0 , Stunden , Sub 'Bei Tastendruck Interruptprogramm aufrufen Debounce Pind.4 , 0 , Minuten , Sub Ss = Str(s) 'Integer in String umwandeln und formatieren Ss = Format(ss , "00") Hs = Str(h) Hs = Format(hs , "00") Ms = Str(m) Ms = Format(ms , "00") Timestring = Hs + Ms 'Sekunden werden bei dieser Version der Uhr nicht zur Anzeige gebracht. Stelle = 4 Ziffer = Mid(timestring , 1 , 1) 'Stunde Zehner ermitteln Gosub Anzeigen 'Anzeigeprogramm aufrufen Stelle = 3 Ziffer = Mid(timestring , 2 , 1) 'Stunden einer Gosub Anzeigen Stelle = 2 Ziffer = Mid(timestring , 3 , 1) 'Minuten zehner Gosub Anzeigen Stelle = 1 Ziffer = Mid(timestring , 4 , 1) 'Minuten einer Gosub Anzeigen Loop Stunden: 'Interruptprogramm Stunden stellen Incr H 'Den Stunden Zähler um eins erhöhen If H > 23 Then H = 0 End If Return Minuten: 'Interruptprogramm Minuten stellen Incr M 'Den Minuten Zähler um eins erhöhen If M > 59 Then M = 0 End If S = 0 'Sekundenzähler auf "0", ermöglicht sekundengenaues Stellen Return Int_t1: 'Interruptprogramm jede Sekunde durch Timer1 ausgelöst Load Timer1 , Wert_preload 'Nur nötig bei Betrieb als Synchronuhr Incr S If S > 59 Then S = 0 Incr M End If If M > 59 Then M = 0 Incr H End If If H > 23 Then H = 0 End If Return Anzeigen: If Ziffer = "0" Then 'Siebensegmentanzeige codieren und Port schalten Portb = &B00000001 Elseif Ziffer = "1" Then Portb = &B00111011 Elseif Ziffer = "2" Then Portb = &B01010000 Elseif Ziffer = "3" Then Portb = &B00011000 Elseif Ziffer = "4" Then Portb = &B00101010 Elseif Ziffer = "5" Then Portb = &B00001100 Elseif Ziffer = "6" Then Portb = &B00000100 Elseif Ziffer = "7" Then Portb = &B00111001 Elseif Ziffer = "8" Then Portb = &B00000000 Elseif Ziffer = "9" Then Portb = &B00001000 Elseif Ziffer = "e" Then '- Portb = &B01111110 End If If Stelle = 1 Then 'Jeweilige Anode einschalten Portb.7 = 1 Elseif Stelle = 2 Then Portd.2 = 1 Elseif Stelle = 3 Then Portd.1 = 1 Elseif Stelle = 4 Then Portd.0 = 1 End If Waitms 2 'Anzeigedauer je Stelle Portb.7 = 0 'Alle Anoden aus Portd.2 = 0 Portd.1 = 0 Portd.0 = 0 Return End