'**************************************************************** '* Name : klok0_1.BAS * '* Author : Lucas Volwater * '* Notice : Copyright (c) 2008 Lucas Volwater * '* : All Rights Reserved * '* Date : 22-8-2008 * '* Version : 1.0 * '* Notes : functies: tijdweergave UU:MM*, tijdweergave MM:SS*, tijd instellen*, datumweergave***, datum instellen***, ; semicolon aan*, uit* of knipperen*, wekker*, buizen uit na xxuur* (en aan op wektijd*), geheime functie****. ; wektijd*, lampen-uit-tijd*, semicolongedrag*, wekkeraan* etc. oplsaan in RTC s NVram (en herstellen bij powerup) ; * = done ; **= done als ze tenminste bugvrij zijn ; *** = functie (nog) niet aanwezig ; **** = functie zal nooit gemaakt worden Device 16F628A XTAL = 4 'Internal xtal = 4 MHz ALL_DIGITAL = On 'Set PORTA and PORTB to all digital Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_On, BODEN_ON '76543210 TRISA = %01111101 TRISB = %00000000 Declare SDA_PIN PORTA.3 ; porta.3 is sda (nagemeten) Declare SCL_PIN PORTA.4 Dim wekuren As Byte ; behoorlijk inefficient Dim wektienuren As Byte ; qua geheugengebruik Dim wekminuten As Byte ; maar er is toch geheugen zat Dim wektienminuten As Byte ; en dit maakt de code simpeler Dim buisuituur As Byte Dim buisuittienuur As Byte Dim wekkeropslaan As Byte Dim knippervar As Byte Dim dotuse As Byte Dim temptime As Byte Dim modus As Byte Dim tienurenbuis As Byte Dim tienminutenbuis As Byte Dim minutenbuis As Byte Dim urenbuis As Byte Dim klok00h As Byte Dim klok01h As Byte Dim klok02h As Byte Dim klok03h As Byte Dim klok04h As Byte Dim klok05h As Byte Dim klok06h As Byte Dim weekdag As Byte Dim tienseconden As Byte Dim seconden As Byte Dim tienminuten As Byte Dim minuten As Byte Dim uren As Byte Dim tienuren As Byte Dim jaar As Byte Dim tienjaar As Byte Dim twaalfvierentwintig As Bit Dim ampm As Bit Dim wekkeraan As Bit Dim buisuit As Bit Clear Symbol BUTTON1 PORTA.0 Symbol BUTTON2 PORTA.2 ; Symbol BUTTON3 PORTA.3 ; moet vervallen of evt naar porta.6 maar dan moet ik jmp desolderen Symbol BUZZER PORTA.1 Symbol HV PORTA.7 Symbol CLK_OUT PORTB.0 Symbol DATA1 PORTB.1 Symbol DATA2 PORTB.2 Symbol DATA3 PORTB.3 Symbol MULT1 PORTB.4 Symbol MULT2 PORTB.5 Symbol MULT3 PORTB.6 Symbol MULT4 PORTB.7 Symbol LT MULT2 'left tube Symbol RT MULT4 'right tube Symbol DOT MULT3 'dots Symbol ALRM MULT1 'alarm dot Low HV ; alles uit Low LT Low RT Low DOT Low ALRM High BUZZER High HV DelayMS 50 Low BUZZER BusOut %11010000, $0000, [%00000000] ; gesprek met klok seconden op 0, osc aan DelayMS 15 ; tijd geven voor opslag BusIn %11010001, $0008, [wektienuren] ; opgeslagen wektijd ophalen (staat er nog niks heb je pech) BusIn %11010001, $0009, [wekuren] BusIn %11010001, $000A, [wektienminuten] BusIn %11010001, $000B, [wekminuten] BusIn %11010001, $000C, [dotuse] Select dotuse Case 0 DOT = 0 Case 1 DOT = 1 Case Else dotuse = 2 BusOut %11010001, $000C, [dotuse] EndSelect BusIn %11010000, $000D, [wekkeropslaan] wekkeraan = wekkeropslaan.1 ALRM=wekkeraan BusIn %11010001, $000E, [buisuituur] BusIn %11010001, $000F, [buisuittienuur] If buisuituur > 9 Then buisuituur = 2 End If If buisuittienuur > 2 Then buisuittienuur = 1 End If GoSub lampentest modus = 1 GoTo mainloop lampentest: urenbuis = 9 tienminutenbuis = 9 Repeat For temptime = 25 To 0 Step -1 GoSub weergeven Next tienurenbuis = tienurenbuis + 1 urenbuis = urenbuis - 1 Until tienurenbuis = 9 Repeat For temptime = 25 To 0 Step -1 GoSub weergeven Next tienminutenbuis = tienminutenbuis - 1 minutenbuis = minutenbuis + 1 Until minutenbuis = 9 Return instellen: Repeat DelayMS 5 Until BUTTON2 = 1 Low BUZZER dotinstellen: If BUTTON2 = 0 Then dotuse = dotuse + 1 End If Select dotuse Case 0 DOT = 0 Case 1 DOT = 1 Case 2 ; regel iets dat dot gaat knipperen Case 3 dotuse = 0 EndSelect tienurenbuis = dotuse urenbuis = 0 minutenbuis = 0 tienminutenbuis = 0 For temptime = 50 To 0 Step -1 GoSub weergeven Next If BUTTON1=0 Then While BUTTON1=0 High BUZZER Wend Low BUZZER DelayMS 100 ; debounce GoTo minuteninstellen End If GoTo dotinstellen minuteninstellen: If BUTTON2 = 0 Then minuten = minuten + 1 If minuten = 10 Then minuten = 0 tienminuten = tienminuten + 1 End If If tienminuten = 6 Then tienminuten = 0 End If End If urenbuis = uren tienurenbuis = tienuren tienminutenbuis = tienminuten minutenbuis = minuten For temptime = 25 To 0 Step -1 GoSub weergeven Next If BUTTON1 = 0 Then While BUTTON1=0 High BUZZER Wend Low BUZZER DelayMS 100 ; debounce GoTo ureninstellen End If GoTo minuteninstellen ureninstellen: If BUTTON2 = 0 Then uren = uren + 1 If tienuren = 2 And uren = 4 Then tienuren = 0 uren = 0 End If If uren = 10 Then uren = 0 tienuren = tienuren + 1 End If End If urenbuis = uren tienurenbuis = tienuren tienminutenbuis = tienminuten minutenbuis = minuten For temptime = 25 To 0 Step -1 GoSub weergeven Next If BUTTON1 = 0 Then While BUTTON1=0 High BUZZER Wend DelayMS 100 ; debounce Low BUZZER GoTo wekminuteninstellen End If GoTo ureninstellen wekminuteninstellen: If BUTTON2 = 0 Then wekminuten = wekminuten + 1 If wekminuten > 9 Then wekminuten = 0 wektienminuten = wektienminuten + 1 End If If wektienminuten > 5 Then wektienminuten = 0 End If End If urenbuis = wekuren tienurenbuis = wektienuren tienminutenbuis = wektienminuten minutenbuis = wekminuten For temptime = 25 To 0 Step -1 GoSub weergeven Next If BUTTON1 = 0 Then While BUTTON1=0 High BUZZER Wend Low BUZZER DelayMS 100 ; debounce GoTo wekureninstellen End If GoTo wekminuteninstellen wekureninstellen: If BUTTON2 = 0 Then wekuren = wekuren + 1 If wektienuren = 2 And wekuren = 4 Then wektienuren = 0 wekuren = 0 End If If wekuren > 9 Then wekuren = 0 wektienuren = wektienuren + 1 End If If wektienuren > 2 Then ; als de wektijd nog nooit eerder is ingesteld en er maar wat staat wektienuren = 0 End If End If urenbuis = wekuren tienurenbuis = wektienuren tienminutenbuis = wektienminuten minutenbuis = wekminuten For temptime = 25 To 0 Step -1 GoSub weergeven Next If BUTTON1 = 0 Then While BUTTON1=0 High BUZZER Wend DelayMS 100 ; debounce Low BUZZER Toggle ALRM wekkeraan = ALRM ; wekkeraan moet ten alle tijden gelijkblijven aan alrm GoTo buisuitureninstellen End If GoTo wekureninstellen buisuitureninstellen: If BUTTON2 = 0 Then buisuituur = buisuituur + 1 If buisuittienuur = 2 And buisuituur = 4 Then buisuituur = 0 buisuittienuur = 0 End If If buisuituur = 10 Then buisuituur = 0 buisuittienuur = buisuittienuur + 1 End If End If minutenbuis = 0 tienminutenbuis = 0 urenbuis = buisuituur tienurenbuis = buisuittienuur For temptime = 25 To 0 Step -1 GoSub weergeven Next If BUTTON1 = 0 Then While BUTTON1=0 High BUZZER Wend buisuit = 1 DelayMS 100 ; debounce Low BUZZER GoTo datuminstellen End If GoTo buisuitureninstellen datuminstellen: ; zoals gezegt: komt nog omzettenenwegschrijven: wekkeropslaan.1 = wekkeraan twaalfvierentwintig = 0 ; 24-uurs modus klok00h.6 = tienseconden.2 ;juiste bits setten klok00h.5 = tienseconden.1 klok00h.4 = tienseconden.0 klok00h.3 = seconden.3 klok00h.2 = seconden.2 klok00h.1 = seconden.1 klok00h.0 = seconden.0 klok01h.6 = tienminuten.2 klok01h.5 = tienminuten.1 klok01h.4 = tienminuten.0 klok01h.3 = minuten.3 klok01h.2 = minuten.2 klok01h.1 = minuten.1 klok01h.0 = minuten.0 klok02h.6 = twaalfvierentwintig klok02h.5 = tienuren.1 klok02h.4 = tienuren.0 klok02h.3 = uren.3 klok02h.2 = uren.2 klok02h.1 = uren.1 klok02h.0 = uren.0 BusOut %11010000, $0000, [klok00h] ; schrijf seconden BusOut %11010000, $0001, [klok01h] ; minuten BusOut %11010000, $0002, [klok02h] ; uren en uurinstellingen BusOut %11010000, $0008, [wektienuren] ; wektijd BusOut %11010000, $0009, [wekuren] BusOut %11010000, $000A, [wektienminuten] BusOut %11010000, $000B, [wekminuten] BusOut %11010000, $000C, [dotuse] BusOut %11010000, $000D, [wekkeropslaan] BusOut %11010000, $000E, [buisuituur] BusOut %11010000, $000F, [buisuittienuur] Return keyscan: If BUZZER = 0 Then If BUTTON1 = 0 Then High BUZZER modus = modus + 1 tienurenbuis = modus urenbuis = 0 minutenbuis = 0 tienminutenbuis = 0 For temptime = 50 To 0 Step -1 GoSub weergeven Next Low BUZZER End If If BUTTON2 = 0 Then High BUZZER GoSub instellen End If End If If wekkeraan = 1 And BUZZER = 1 Then If BUTTON1 = 0 Or BUTTON2 = 0 Then wekkeraan = 0 ALRM = 0 BUZZER = 0 wekkeropslaan.1 = wekkeraan BusOut %11010000, $000D, [wekkeropslaan] End If End If Return clock_update: BusIn %11010001, $0000, [klok00h] ; lees seconden + osc en. BusIn %11010001, [klok01h] ; lees minuten BusIn %11010001, [klok02h] ; lees uren en uurinstellingen BusIn %11010001, [weekdag] ; lees dag-van-de-week BusIn %11010001, [klok04h] ; lees dag-van-de-maand BusIn %11010001, [klok05h] ; lees maand BusIn %11010001, [klok06h] ; lees jaar tienseconden.2 = klok00h.6 ;BCD omzetten in los binair tienseconden.1 = klok00h.5 tienseconden.0 = klok00h.4 seconden.3 = klok00h.3 seconden.2 = klok00h.2 seconden.1 = klok00h.1 seconden.0 = klok00h.0 tienminuten.2 = klok01h.6 tienminuten.1 = klok01h.5 tienminuten.0 = klok01h.4 minuten.3 = klok01h.3 minuten.2 = klok01h.2 minuten.1 = klok01h.1 minuten.0 = klok01h.0 twaalfvierentwintig = klok02h.6 tienuren.1 = klok02h.5 tienuren.0 = klok02h.4 uren.3 = klok02h.3 uren.2 = klok02h.2 uren.1 = klok02h.1 uren.0 = klok02h.0 tienjaar.3 = klok04h.7 tienjaar.2 = klok04h.6 tienjaar.1 = klok04h.5 tienjaar.0 = klok04h.4 jaar.3 = klok04h.3 jaar.2 = klok04h.2 jaar.1 = klok04h.1 jaar.0 = klok04h.0 ; NOG UITBREIDEN om ook maand etc om te zetten voor een datumfunctie Select modus Case 0 minutenbuis = seconden tienminutenbuis = tienseconden urenbuis = minuten tienurenbuis = tienminuten ALRM = wekkeraan Case 1 minutenbuis = minuten tienminutenbuis = tienminuten urenbuis = uren tienurenbuis = tienuren ALRM = wekkeraan Case 2 GoSub lampentest modus = modus + 1 ; meer cases toevoegen voor wat je ook wilt laten zien Case Else modus = 0 EndSelect Return weergeven: If dotuse = 2 Then knippervar = knippervar + 1 If knippervar = 40 Then knippervar = 0 Toggle DOT End If End If Low LT Low RT CLK_OUT = 0 DATA2 = minutenbuis.3 DATA3 = tienurenbuis.3 CLK_OUT = 1 CLK_OUT = 0 DATA2 = minutenbuis.2 DATA3 = tienurenbuis.2 CLK_OUT = 1 CLK_OUT = 0 DATA2 = minutenbuis.1 DATA3 = tienurenbuis.1 CLK_OUT = 1 CLK_OUT = 0 DATA2 = minutenbuis.0 DATA3 = tienurenbuis.0 CLK_OUT = 1 High LT DelayMS 5 Low LT CLK_OUT = 0 DATA2 = tienminutenbuis.3 DATA3 = urenbuis.3 CLK_OUT = 1 CLK_OUT = 0 DATA2 = tienminutenbuis.2 DATA3 = urenbuis.2 CLK_OUT = 1 CLK_OUT = 0 DATA2 = tienminutenbuis.1 DATA3 = urenbuis.1 CLK_OUT = 1 CLK_OUT = 0 DATA2 = tienminutenbuis.0 DATA3 = urenbuis.0 CLK_OUT = 1 High RT DelayMS 5 Low RT Return wekker: If wekkeraan = 1 Then If tienuren=wektienuren And uren=wekuren And tienminuten=wektienminuten And minuten=wekminuten Then BUZZER = 1 End If End If Return buizenuit: If uren = buisuituur And tienuren = buisuittienuur And buisuit = 1 And minuten = 0 And tienminuten = 0 Then HV = 0 End If If uren = wekuren And tienuren = wektienuren And minuten = wekminuten And tienminuten = wektienminuten Then HV = 1 End If Return mainloop: GoSub weergeven GoSub keyscan GoSub clock_update GoSub wekker GoSub buizenuit GoTo mainloop End