Categorie: LED-Aftelklok V2

LED-Aftelklok V2

Omdat de eerste versie niet volledig voldoet moet er een tweede versie gemaakt worden.

Schema:

Schema
(Klikbaar)

Foto’s:

Keyboard:

Tobo

Keybord

Hoofdprint Ontwerp (Zitten nog fouten in die me niet waren opgevallen voor het etsten 🙁 ).

Printontwerp

Hoofdprint zonder componenten:

Hoofd Print

LED-Aftelklok V2 Update

De print is ondertussen bestukt:

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

Led Aftelklok V2 bestukt

LED-Aftelklok V2 Update

De code is ondertussen ook af:

'****************************************************************
'*  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