'****************************************************************
'* Name : PC klok *
'* Author : Stijn Coenen [Stynus] *
'* Notice : Copyright (c) 2009 [www.elektronicastynus.be] *
'* : All Rights Reserved *
'* Date : 17/10/2009 *
'* Version : 1.0 *
'* elektronicastynus.be/Projecten/Klokken/PC_Klok/index.php *
'****************************************************************
Device 16F767
Config WDT_Off, PWRTE_Off, HS_OSC , PWRTE_ON
XTAL = 20
Declare ALL_DIGITAL TRUE
'LCD
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
'Relais
Symbol Power = PORTC.3 : TRISC.3 = 0
Symbol Startpuls = PORTC.2 : TRISC.2 = 0
'Knoppen
Symbol Knop_U = PORTA.0 : TRISA.0 = 1
Symbol Knop_R = PORTA.1 : TRISA.1 = 1
Symbol Knop_E = PORTA.2 : TRISA.2 = 1
Symbol Knop_L = PORTA.3 : TRISA.3 = 1
Symbol Knop_D = PORTA.4 : TRISA.4 = 1
'Real time clock
Symbol Reg_Seconden = $00
Symbol Reg_Minuten = $01
Symbol Reg_Uren = $02
Symbol Reg_Dag = $03
Symbol Reg_Datum = $04
Symbol Reg_Maand = $05
Symbol Reg_Jaar = $06
Symbol Reg_Min_on = $08
Symbol Reg_Uren_on = $09
Symbol Reg_Min_off = $10
Symbol Reg_Uren_off = $11
Symbol Lezen = %11010001
Symbol Schrijven = %11010000
Symbol SDA = PORTC.1
Symbol SLC = PORTC.0
Dim Seconden As Byte
Dim Minuten As Byte
Dim Uren As Byte
Dim Datum As Byte
Dim Maand As Byte
Dim Jaar As Byte
Dim Min_On As Byte
Dim Uur_On As Byte
Dim Min_Off As Byte
Dim Uur_Off As Byte
Dim bcd_in As Byte
Dim bcd_uit As Byte
'Statusbits
Dim Power_status As Bit
'Menu
Dim Menu_Item As Byte
'Afsluiten
Dim Uitschakeltijd As Byte
'Timer
Dim Timer_OnOff As Bit
Dim temp As Byte
'Tijd instellen
Dim Tijd[6] As Byte
Dim Max_Val As Byte
Dim Temp_Tijd As Byte
'****************************************************************
Clear
Cls
DelayMS 500
'1234567890123456
Print At 1,1, " PC schakelklok "
Print At 2, 1, "ElektronicaStynu"
DelayMS 250
Print At 2, 1, "lektronicaStynus"
DelayMS 250
Print At 2, 1, "ektronicaStynus."
DelayMS 250
Print At 2, 1, "ktronicaStynus.b"
DelayMS 250
Print At 2, 1, "tronicaStynus.be"
DelayMS 1000
'****************************************************************
Main:
Cls
DelayMS 200
While 1 = 1
I2CIN SDA, SLC, Lezen, Reg_Uren, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Minuten, [Minuten]
I2CIN SDA, SLC, Lezen, Reg_Seconden, [Seconden]
bcd_in = Uren
GoSub bcd_to_bin
Uren = bcd_uit
bcd_in = Minuten
GoSub bcd_to_bin
Minuten = bcd_uit
bcd_in = Seconden
GoSub bcd_to_bin
Seconden = bcd_uit
Print At 1,1, DEC2 Uren, ":", DEC2 Minuten, ":", DEC2 Seconden
GoSub Tijd_Controleren
If Power_status = 1 Then
Print At 1,10, "PC: On "
Else
Print At 1,10, "PC: Off"
EndIf
I2CIN SDA, SLC, Lezen, Reg_Jaar, [Jaar]
I2CIN SDA, SLC, Lezen, Reg_Maand, [Maand]
I2CIN SDA, SLC, Lezen, Reg_Datum, [Datum]
bcd_in = Jaar
GoSub bcd_to_bin
Jaar = bcd_uit
bcd_in = Maand
GoSub bcd_to_bin
Maand = bcd_uit
bcd_in = Datum
GoSub bcd_to_bin
Datum = bcd_uit
Print At 2,1, DEC2 Datum, "/", DEC2 Maand, "/", DEC2 Jaar
Print At 2,10, "-Menu-"
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
GoTo Menu
EndIf
DelayMS 200
Wend
GoTo Main
'****************************************************************
Menu:
Cls
DelayMS 200
Print At 1,1, "Menu: ->"
Menu_Item = 0
While 1 = 1
Select Menu_Item
Case 0
If Power_status = 0 Then
Print At 1,10, "Boot PC"
Else
Print At 1,10, "PC Off "
EndIf
If Timer_OnOff = 0 Then
Print At 2,10, "Tmr On "
Else
Print At 2,10, "Tmr Off"
EndIf
Case 1
If Timer_OnOff = 0 Then
Print At 1,10, "Tmr On "
Else
Print At 1,10, "Tmr Off"
EndIf
Print At 2,10, "EditClk"
Case 2
Print At 1,10, "EditClk"
Print At 2,10, "EditTmr"
Case 3
Print At 1,10, "EditTmr"
Print At 2,10, "Back "
Case 4
Print At 1,10, "Back "
If Power_status = 0 Then
Print At 2,10, "Boot PC"
Else
Print At 2,10, "PC OFF "
EndIf
EndSelect
'Bladeren in menu:
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Menu_Item < 4 Then
Inc Menu_Item
Else
Menu_Item = 0
EndIf
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
Else
Menu_Item = 4
EndIf
EndIf
'Menu item enteren
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Select Menu_Item
Case 0
'Pc opstarten/afsluiten overwrite
GoTo Pc_boot
Case 1
'Timer opzetten voor vanavond downloaden
GoTo tmr_op
Case 2
'Tijd op de klok aanpassen
GoTo Pas_Tijd_Aan
Case 3
'Tijd "aan" tijd van de pc aanpassen
GoTo Aan_Tijd
Case 4
'Terug naar het begin scherm
GoTo Main
EndSelect
EndIf
Wend
GoTo Main
'****************************************************************
Pc_boot:
Cls
DelayMS 200
If Power_status = 0 Then
'Inschakelen
'1234567890123456
Print At 1,1, " Booting... "
GoSub Pc_aan 'Spanning opzetten
DelayMS 1500 'Wachten tot voeding opgestart is
GoSub Puls_uit 'Puls voor pc te doen booten
Else
'Uitschakelen
'1234567890123456
Print At 1,1, "Shutting down..."
Print At 2, 1, Rep "-"\16
GoSub Puls_uit 'Pc een puls geven om te doen afsluiten
'Nu moet er 160 sec gewacht worden voordat de spanning wordt uitgeschakeld
'Uitschakeltijd uitrekenen:
For Uitschakeltijd = 0 To 160
Print At 2,1, Rep 255\ (Uitschakeltijd / 10 ) + 1
'Print At 1,1, dec3 16* (100/Uitschakeltijd)
DelayMS 1000
Next
GoSub Pc_uit 'Spanning uitzetten
EndIf
GoTo Main
'****************************************************************
tmr_op:
'PC vanavond opstarten Ja/Nee?
Cls
DelayMS 200
If Timer_OnOff = 0 Then
Print At 1, 5, "Timer On"
Timer_OnOff = 1
DelayMS 1000
Else
Print At 1, 5, "Timer Off"
Timer_OnOff = 0
DelayMS 1000
EndIf
GoTo Main
'****************************************************************
Pas_Tijd_Aan:
'Tijd RTC aanpassen
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Minuten, [Minuten]
I2CIN SDA, SLC, Lezen, Reg_Seconden, [Seconden]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Tijd[4] = Seconden >> 4
Tijd[5] = Seconden & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "Time: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3], ":", Dec Tijd[4], Dec Tijd[5]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
'Seconden
Case 4
'tijd[4] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 5
'tijd[5] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 5 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,4, "Saving time"
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Minuten, [Minuten]
Seconden = Tijd[4] << 4
Seconden = Seconden + Tijd[5]
I2COUT SDA, SLC, Schrijven ,Reg_Seconden, [Seconden]
DelayMS 1000
'Datum RTC aanpassen
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Datum, [Datum]
I2CIN SDA, SLC, Lezen, Reg_Maand, [Maand]
I2CIN SDA, SLC, Lezen, Reg_Jaar, [Jaar]
Tijd[0] = Datum >> 4
Tijd[1] = Datum & %00001111
Tijd[2] = Maand >> 4
Tijd[3] = Maand & %00001111
Tijd[4] = Jaar >> 4
Tijd[5] = Jaar & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "Date: ", Dec Tijd[0], Dec Tijd[1], "/", Dec Tijd[2], Dec Tijd[3], "/", Dec Tijd[4], Dec Tijd[5]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 3
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 3 Then
Max_Val = 1
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 1
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 1 Then
Max_Val = 2
Else
Max_Val = 9
EndIf
'Seconden
Case 4
'tijd[4] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
Case 5
'tijd[5] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 5 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,4, "Saving date"
'Tijd wegschrijven
Datum = Tijd[0] << 4
Datum = Datum + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Datum, [Datum]
Maand = Tijd[2] << 4
Maand = Maand + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Maand, [Maand]
Jaar = Tijd[4] << 4
Jaar = Jaar + Tijd[5]
I2COUT SDA, SLC, Schrijven ,Reg_Jaar, [Jaar]
DelayMS 1000
Cls
GoTo Main
'****************************************************************
Aan_Tijd:
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren_on, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Min_on, [Minuten]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "On: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 3 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,2, "Saving on time"
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren_on, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Min_on, [Minuten]
DelayMS 1000
'Uit tijd
Cls
DelayMS 200
I2CIN SDA, SLC, Lezen, Reg_Uren_off, [Uren]
I2CIN SDA, SLC, Lezen, Reg_Min_off, [Minuten]
Tijd[0] = Uren >> 4
Tijd[1] = Uren & %00001111
Tijd[2] = Minuten >> 4
Tijd[3] = Minuten & %00001111
Menu_Item = 0
While 1 = 1
Print At 1,1, "Off: ", Dec Tijd[0], Dec Tijd[1], ":", Dec Tijd[2], Dec Tijd[3]
Select Menu_Item
'Uren
Case 0
'tijd[0] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 2
Case 1
'tijd[1] aanpassen
'1234567890123456
Print At 2,1, " ^ "
If Tijd[0] = 2 Then
Max_Val = 3
Else
Max_Val = 9
EndIf
'Minuten
Case 2
'tijd[2] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 5
Case 3
'tijd[3] aanpassen
'1234567890123456
Print At 2,1, " ^ "
Max_Val = 9
EndSelect
'Aanpassen
If Temp_Tijd > Max_Val Then
Temp_Tijd = 0
EndIf
If Knop_U = 0 Then
DelayMS 20
While Knop_U = 0: Wend
If Temp_Tijd < Max_Val Then
Inc Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
If Knop_D = 0 Then
DelayMS 20
While Knop_D = 0: Wend
If Temp_Tijd > 0 Then
Dec Temp_Tijd
Tijd[Menu_Item] = Temp_Tijd
EndIf
EndIf
'Links rechts bewegen
If Knop_R = 0 Then
DelayMS 20
While Knop_R = 0: Wend
If Menu_Item < 3 Then
Inc Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
If Knop_L = 0 Then
DelayMS 20
While Knop_L = 0: Wend
If Menu_Item > 0 Then
Dec Menu_Item
EndIf
Temp_Tijd = Tijd[Menu_Item]
EndIf
'Tijd vastzetten
If Knop_E = 0 Then
DelayMS 20
While Knop_E = 0: Wend
Break
EndIf
Wend
Cls
Print At 1,2, "Saving off time"
'Tijd wegschrijven
Uren = Tijd[0] << 4
Uren = Uren + Tijd[1]
I2COUT SDA, SLC, Schrijven ,Reg_Uren_off, [Uren]
Minuten = Tijd[2] << 4
Minuten = Minuten + Tijd[3]
I2COUT SDA, SLC, Schrijven ,Reg_Min_off, [Minuten]
DelayMS 1000
GoTo Main
'****************************************************************
Subroutines:
'************************************************************
Puls_uit:
High Startpuls
DelayMS 1000
Low Startpuls
Return
'************************************************************
Pc_aan:
High Power
Power_status = 1
Return
'************************************************************
Pc_uit:
Low Power
Power_status = 0
Return
'************************************************************
bcd_to_bin:
bcd_uit = bcd_in >> 4
bcd_uit = bcd_uit * 10
bcd_in = bcd_in & %00001111
bcd_uit = bcd_uit + bcd_in
Return
'************************************************************
Tijd_Controleren:
If Timer_OnOff = 1 Then
I2CIN SDA, SLC, Lezen, Reg_Min_on, [Min_On]
I2CIN SDA, SLC, Lezen, Reg_Uren_on, [Uur_On]
temp = Uur_On & %11110000
temp = temp >> 4
temp = temp * 10
Uur_On = Uur_On & %00001111
Uur_On = Uur_On + temp
temp = Min_On & %11110000
temp = temp >> 4
temp = temp * 10
Min_On = Min_On & %00001111
Min_On = Min_On + temp
If Minuten = Min_On And Uren = Uur_On And Seconden = 0 Then
Cls
DelayMS 200
'Inschakelen
'1234567890123456
Print At 1,1, " Booting... "
GoSub Pc_aan 'Spanning opzetten
DelayMS 1500 'Wachten tot voeding opgestart is
GoSub Puls_uit 'Puls voor pc te doen booten
Timer_OnOff = 0
Cls
EndIf
EndIf
If Power_status = 1 Then
I2CIN SDA, SLC, Lezen, Reg_Min_off, [Min_Off]
I2CIN SDA, SLC, Lezen, Reg_Uren_off, [Uur_Off]
temp = Uur_Off & %11110000
temp = temp >> 4
temp = temp * 10
Uur_Off = Uur_Off & %00001111
Uur_Off = Uur_Off + temp
temp = Min_Off & %11110000
temp = temp >> 4
temp = temp * 10
Min_Off = Min_Off & %00001111
Min_Off = Min_Off + temp
If Minuten = Min_Off And Uren = Uur_Off And Seconden = 0 Then
'Uitschakelen
'1234567890123456
Print At 1,1, "Shutting down..."
Print At 2, 1, Rep "-"\16
GoSub Puls_uit 'Pc een puls geven om te doen afsluiten
'Nu moet er 160 sec gewacht worden voordat de spanning wordt uitgeschakeld
'Uitschakeltijd uitrekenen:
For Uitschakeltijd = 0 To 160
Print At 2,1, Rep 255\ (Uitschakeltijd / 10 ) + 1
'Print At 1,1, dec3 16* (100/Uitschakeltijd)
DelayMS 1000
Next
GoSub Pc_uit 'Spanning uitzetten
Cls
EndIf
EndIf
Return
'****************************************************************
End