'****************************************************************
'* Name : Aftelklok *
'* Author : Coenen Stijn [Stynus] *
'* Notice : Copyright (c) 2008 ElektronicaStynus.be *
'* : All Rights Reserved *
'* Date : 26/04/2008 *
'* Version : 2.8 *
'****************************************************************
'Declaraties:
Device 16F877A
Config XT_OSC, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, PWRTE_ON
XTAL 3',2768 MHz
ALL_DIGITAL true
'Lcd declaraties
Symbol Lengte = 16
Symbol Regels = 2
Declare LCD_DTPIN PORTD.4
Declare LCD_ENPIN PORTD.1
Declare LCD_RSPIN PORTD.0
Declare LCD_INTERFACE 4
Declare LCD_LINES Regels
'Knoppen
Symbol Knop1 = PORTE.2
Symbol Knop2 = PORTA.0
Symbol Knop3 = PORTA.4
Symbol Knop4 = PORTC.0
Symbol Knop5 = PORTA.1
Symbol Knop6 = PORTA.5
Symbol Knop7 = PORTC.1
Symbol Knop8 = PORTA.2
Symbol Knop9 = PORTE.0
Symbol Knop0 = PORTA.3
Symbol Knopenter = PORTE.1
Symbol Knopback = PORTC.2
Symbol Back = 10
Symbol Enter = 11
Dim Knop As Byte
Dim Uren10 As Byte
Dim Uren1 As Byte
Dim Min10 As Byte
Dim Min1 As Byte
'Algemeen
Dim Index As Byte
Dim intAan As Bit
Dim temp As Byte
Dim initbit As Bit
'Leds
Symbol rij0 = PORTC.7
Symbol rij1 = PORTC.6
Symbol rij2 = PORTC.5
Symbol rij3 = PORTC.4
Symbol rij4 = PORTD.3
Symbol rij5 = PORTD.2
Symbol ledKolom = PORTB
Dim ledTabel[6] As Byte
TRISB = 0
'Tijden
Dim Uren As Byte
Dim Minuten As Byte
Dim Seconden As Byte
Dim Tijd As DWord
Dim LedTijd As Word
'Interupt
Symbol T0IE = INTCON.5 'TMR0 Overflow Interrupt Enable
Symbol T0IF = INTCON.2 'TMR0 Overflow Interrupt Flag
Symbol GIE = INTCON.7 'Global Interrupt Enable
Symbol PS0 = OPTION_REG.0 'Prescaler bit-0
Symbol PS1 = OPTION_REG.1 'Prescaler bit-1
Symbol PS2 = OPTION_REG.2 'Prescaler bit-2
Symbol PSA = OPTION_REG.3 'Prescaler Assignment
Symbol T0CS = OPTION_REG.5 'Timer0 Clock Source Select
Dim klaarBit As Bit
'****************************************************************
Init:
'Interupt (Maar nog niet inschakelen)
'3276800/4*256*128*25=1sec
PSA = 0 'Prescaler op het externe cristal zetten
PS0 = 1 'De prescaler op 255x zetten
PS1 = 1
PS2 = 1
T0CS = 0
TMR0 = 128
T0IF = 0
T0IE = 0
GIE = 0
'Lcd wissen
Cls
DelayMS 30
GoSub DispClear
'registers clearen
Clear
'Opstartscherm
Print At 1, 1, " Elektro-Stynus "
Print At 2, 1, "Led-Aftelklok V2"
DelayMS 1000
'Tijd instellen
GoSub Instellen
If initbit = 1 Then
initbit = 0
GoTo Init
EndIf
Uren = Uren10 * 10
Uren = Uren + Uren1
Minuten = Min10 * 10
Minuten = Minuten + Min1
'Tijd per led uitrekenen
Tijd = Uren * 60
Tijd = Tijd + Minuten
LedTijd = Tijd / 37
GoSub DispClear
Print At 1, 1, "Resterende tijd:"
T0IE = 1
GIE = 1
'Alle leds aan
ledTabel[0] = 255
ledTabel[1] = 255
ledTabel[2] = 255
ledTabel[3] = 255
ledTabel[4] = 255
ledTabel[5] = 255
GoTo Main
'****************************************************************
Main:
'Leds berekenen
'Array's invullen
If Tijd > (LedTijd * 30) Then
'5de rij array plaatsen
If Tijd > (LedTijd * 36) Then
ledTabel[5] = %00111111
Else
If Tijd > (LedTijd * 35) Then
ledTabel[5] = %00011111
Else
If Tijd > (LedTijd * 34) Then
ledTabel[5] = %00001111
Else
If Tijd > (LedTijd * 33) Then
ledTabel[5] = %00000111
Else
If Tijd > (LedTijd * 32) Then
ledTabel[5] = %00000011
Else
ledTabel[5] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[0] = 255
ledTabel[1] = 255
ledTabel[2] = 255
ledTabel[3] = 255
ledTabel[4] = 255
Else
'4de rij array plaatsen
If Tijd > (LedTijd * 24) Then
If Tijd > (LedTijd * 30) Then
ledTabel[4] = %00111111
Else
If Tijd > (LedTijd * 29) Then
ledTabel[4] = %00011111
Else
If Tijd > (LedTijd * 28) Then
ledTabel[4] = %00001111
Else
If Tijd > (LedTijd * 27) Then
ledTabel[4] = %00000111
Else
If Tijd > (LedTijd * 26) Then
ledTabel[4] = %00000011
Else
ledTabel[4] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[0] = 255
ledTabel[1] = 255
ledTabel[2] = 255
ledTabel[3] = 255
ledTabel[5] = 0
Else
'3de rij array plaatsen
If Tijd > (LedTijd * 18) Then
If Tijd > (LedTijd * 24) Then
ledTabel[3] = %00111111
Else
If Tijd > (LedTijd * 23) Then
ledTabel[3] = %00011111
Else
If Tijd > (LedTijd * 22) Then
ledTabel[3] = %00001111
Else
If Tijd > (LedTijd * 21) Then
ledTabel[3] = %00000111
Else
If Tijd > (LedTijd * 20) Then
ledTabel[3] = %00000011
Else
ledTabel[3] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[0] = 255
ledTabel[1] = 255
ledTabel[2] = 255
ledTabel[4] = 0
ledTabel[5] = 0
Else
'2de rij array plaatsen
If Tijd > (LedTijd * 12) Then
If Tijd > (LedTijd * 18) Then
ledTabel[2] = %00111111
Else
If Tijd > (LedTijd * 17) Then
ledTabel[2] = %00011111
Else
If Tijd > (LedTijd * 16) Then
ledTabel[2] = %00001111
Else
If Tijd > (LedTijd * 15) Then
ledTabel[2] = %00000111
Else
If Tijd > (LedTijd * 14) Then
ledTabel[2] = %00000011
Else
ledTabel[2] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[0] = 255
ledTabel[1] = 255
ledTabel[3] = 0
ledTabel[4] = 0
ledTabel[5] = 0
Else
'1ste rij array plaatsen
If Tijd > (LedTijd * 6) Then
If Tijd > (LedTijd * 12) Then
ledTabel[1] = %00111111
Else
If Tijd > (LedTijd * 11) Then
ledTabel[1] = %00011111
Else
If Tijd > (LedTijd * 10) Then
ledTabel[1] = %00001111
Else
If Tijd > (LedTijd * 9) Then
ledTabel[1] = %00000111
Else
If Tijd > (LedTijd * 8) Then
ledTabel[1] = %00000011
Else
ledTabel[1] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[0] = 255
ledTabel[2] = 0
ledTabel[3] = 0
ledTabel[4] = 0
ledTabel[5] = 0
Else
'0ste rij array plaatsen
If Tijd > (LedTijd * 6) Then
ledTabel[0] = %00111111
Else
If Tijd > (LedTijd * 5) Then
ledTabel[0] = %00011111
Else
If Tijd > (LedTijd * 4) Then
ledTabel[0] = %00001111
Else
If Tijd > (LedTijd * 3) Then
ledTabel[0] = %00000111
Else
If Tijd > (LedTijd * 2) Then
ledTabel[0] = %00000011
Else
ledTabel[0] = %00000001
EndIf
EndIf
EndIf
EndIf
EndIf
ledTabel[1] = 0
ledTabel[2] = 0
ledTabel[3] = 0
ledTabel[4] = 0
ledTabel[5] = 0
EndIf
EndIf
EndIf
EndIf
EndIf
TRISB = 0
'Leds aansturen
Call ledUit
'Display aansturen
Print At 2, 4, DEC2 Uren, ":", DEC2 Minuten, ":", DEC2 Seconden
If klaarBit = 1 Then
GoTo Klaar
EndIf
If Knopback = 0 Then
GoTo cancel
EndIf
GoTo Main
'****************************************************************
Klaar:
klaarBit = 0
T0IE = 0
GIE = 0
GoSub DispClear
Print At 1, 1, " Klaar! "
Print At 2, 1, " (enter = reset) "
While 1 = 1
If Knopenter = 0 Then
GoTo Init
EndIf
Wend
'****************************************************************
cancel:
klaarBit = 0
T0IE = 0
GIE = 0
GoSub DispClear
Print At 1, 1, " Druk op Enter om"
Print At 2, 1, " te resetten "
While 1 = 1
If Knopenter = 0 Then
GoTo Init
EndIf
Wend
'****************************************************************
'Interrupt routine
ON_HARDWARE_INTERRUPT GoTo Interupt
Interupt:
'Checken of de interrrupt wel van timer0 komt
If T0IF = 1 Then
T0IF = 0 'Timer overflow flag weer resetten
TMR0 = 118 'Normaal 128 maar door afweiking kristal 118
Inc Index
'1 sec is afgelopen
If Index = 26 Then
Index = 0
'Tijd aftellen
Dec Seconden
'Als de seconden "op zijn" dan minuut aftellen
If Seconden = 255 Then
Seconden = 59
Dec Minuten
Dec Tijd
'Als de minuten "op zijn" dan uur aftellen
If Minuten = 255 Then
Minuten = 59
Dec Uren
'Als uren "op" zijn dan klaar
If Uren = 255 Then
'Klaar!
T0IE = 1
GIE = 1
klaarBit = 1
EndIf
EndIf
EndIf
EndIf
EndIf
Context Restore ' Restore the registers and exit the interrupt
'****************************************************************
subroutines:
'************************************************************
'Tijden instellen
Instellen:
'Scherm wissen
GoSub DispClear
Print At 1, 1, "Tijd: uu:mm"
'****************************************************
'Tientallen van de uren
urenInstellenHoog:
'Cursor op positie 6 zetten
Print $FE ,128
For Index = 1 To 6
Print $FE, $14
Next
Print $FE, $0F
GoSub Inlezen
'Terug
If Knop = Back Then
DelayMS 500
GoTo urenInstellenHoog
EndIf
'Enter
If Knop = Enter Then
GoTo urenInstellenHoog
EndIf
'Lcd aansturen
Print Dec Knop
'Tijd in variabele zetten
Uren10 = Knop * 10
DelayMS 500
'****************************************************
'Eenheden uren
urenInstellenLaag:
'Cursor op positie 7 zetten
Print $FE ,128 'cursor naar pos 1,1
For Index = 1 To 7
Print $FE, $14 'Cursor 1 positie naar rechts opschuiven
Next
Print $FE, $0F
GoSub Inlezen
'Terug
If Knop = Back Then
DelayMS 500
GoTo urenInstellenHoog
EndIf
'Enter
If Knop = Enter Then
GoTo urenInstellenLaag
EndIf
'Lcd aansturen
Print Dec Knop
'Tijd in variabele zetten
Uren1 = Knop
DelayMS 500
'****************************************************
'Tientallen van de Minuten
minutenInstellenHoog:
'Cursor op positie 9 zetten
Print $FE ,128
For Index = 1 To 9
Print $FE, $14
Next
Print $FE, $0F
GoSub Inlezen
'Terug
If Knop = Back Then
DelayMS 500
GoTo urenInstellenLaag
EndIf
'Kijken of het aantal niet hoger is dan 6
If Knop > 5 And Knop < 10 Then
'Bij 6 accepteren maar volgende input automatisch 0 maken
If Knop = 6 Then
Min10 = 6
Min1 = 0
Print "60"
GoTo StartenOfTerug
Else
GoTo minutenInstellenHoog
EndIf
EndIf
'Enter
If Knop = Enter Then
GoTo minutenInstellenHoog
EndIf
'Lcd aansturen
Print Dec Knop
'Tijd in variabele zetten
Min10 = Knop
DelayMS 500
'****************************************************
'Eenheden Minuten
minutenInstellenLaag:
'Cursor op positie 10 zetten
Print $FE ,128 'cursor naar pos 1,1
For Index = 1 To 10
Print $FE, $14
Next
Print $FE, $0F
GoSub Inlezen
'Terug
If Knop = Back Then
DelayMS 500
GoTo minutenInstellenHoog
EndIf
'Enter
If Knop = Enter Then
GoTo minutenInstellenLaag
EndIf
'Lcd aansturen
Print Dec Knop
'Tijd in variabele zetten
Min1 = Knop
DelayMS 500
'****************************************************
'Starten of terug?
StartenOfTerug:
Print $FE, $0C
Print At 2, 11, "KLAAR?"
DelayMS 500
If Knopback = 0 Then
DelayMS 500
GoTo minutenInstellenLaag
EndIf
'Enter
If Knopenter = 0 Then
GoTo Vergrendelen
EndIf
GoTo StartenOfTerug
'****************************************************
Vergrendelen:
Print At 1,1, " Tijd Ingesteld "
Print At 2,1, " Starten? "
DelayMS 500
While 1 = 1
If Knopback = 0 Then
initbit = 1
Return
EndIf
If Knopenter = 0 Then
DelayMS 1000
Return
EndIf
Wend
Return
'************************************************************
'Knoppen inlezen
Inlezen:
While 1 = 1
If Knop0 = 0 Then
Knop = 0
Return
EndIf
If Knop1 = 0 Then
Knop = 1
Return
EndIf
If Knop2 = 0 Then
Knop = 2
Return
EndIf
If Knop3 = 0 Then
Knop = 3
Return
EndIf
If Knop4 = 0 Then
Knop = 4
Return
EndIf
If Knop5 = 0 Then
Knop = 5
Return
EndIf
If Knop6 = 0 Then
Knop = 6
Return
EndIf
If Knop7 = 0 Then
Knop = 7
Return
EndIf
If Knop8 = 0 Then
Knop = 8
Return
EndIf
If Knop9 = 0 Then
Knop = 9
Return
EndIf
If Knopback = 0 Then
Knop = 10
Return
EndIf
If Knopenter = 0 Then
Knop = 11
Return
EndIf
Wend
Return
'************************************************************
'cls wil niet werken bij dit lcd dus daarom zo:
DispClear:
Print At 1, 1, " "
Print At 2, 1, " "
DelayMS 500
Return
'************************************************************
'Led matrix aansturen
ledUit:
'Rij 0
High rij0
ledKolom = ledTabel[0]
DelayMS 1
Low rij0
'Rij 1
High rij1
ledKolom = ledTabel[1]
DelayMS 1
Low rij1
'Rij 2
High rij2
ledKolom = ledTabel[2]
DelayMS 1
Low rij2
'Rij 3
High rij3
ledKolom = ledTabel[3]
DelayMS 1
Low rij3
'Rij 0
High rij4
ledKolom = ledTabel[4]
DelayMS 1
Low rij4
'Rij 5
High rij5
ledKolom = ledTabel[5]
DelayMS 1
Low rij5
'Rij 0
High rij5
ledKolom = ledTabel[5]
DelayMS 1
Low rij5
Return
'****************************************************************
End