Category: Binary BCD clock

Binary BCD clock

As recreation after studying for my exams I have made an binary bcd clock. The base is a PIC16F628A.

Main circuit:

Schema binaire BCD klok

Power supply circuit:

Schema voeding

Led matrix circuit:

Led matrix circuit

Main pcb layout:

pcb binaire BCD klok

The pcb as pdf: link

Pictures:

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

binaire BCD klok

The code:

'****************************************************************
'*                       Binaire klok                           *
'*  Auteur  : Coenen Stijn [Stynus]                             *
'*            Copyright (c) 2008 ElektronicaStynus.be           * 
'*  Datum   : 12/06/2008                                        *
'*  Versie  : 1.0                                               *
'****************************************************************
    Device              16F628A
    Config WDT_OFF, PWRTE_ON, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_off
    ALL_DIGITAL         = true  

'****************************************************************   
'Leds 
    Dim     tijduur10   As Byte
    Dim     tijduur1    As Byte
    Dim     tijdmin10   As Byte
    Dim     tijdmin1    As Byte
    Symbol  leds        = PORTB   
    Symbol  uren10      = PORTA.0
    Symbol  uren1       = PORTA.1
    Symbol  minu10      = PORTA.2
    Symbol  minu1       = PORTA.3 
    TRISB               = %11000000
    TRISA               = %00010000

'instellen
    Symbol  incMin      = PORTB.6
    Symbol  incUur      = PORTB.7
    Dim     minBit      As Bit
    Dim     uurBit      As Bit
    PORTB_PULLUPS       = 1 
'interrupt
    Symbol  klok50      = PORTA.4
    Dim     tussenCount As Byte
    Clear
    
    Symbol T0IF         = INTCON.2      'Bit die hoog wordt bij overflow    
    Symbol T0IE         = INTCON.5      'Timer Overflow Interupt Enable bit
    Symbol GIE          = INTCON.7      'Global interupt enable bit
    Symbol PSA          = OPTION_REG.3  'Prescaler Assignment bit
    Symbol TOSE         = OPTION_REG.4  'Stijgende of dalende flank kiezen.
    Symbol T0CS         = OPTION_REG.5  'selecteren timer ingang    
    TOSE                = 0             'stijgende flank
    T0CS                = 1             'RA4 selecteren als timer ingang 
    PSA                 = 1             'Prescaler uit
    T0IE                = 1             'Interupt opzetten voor timer 0
    T0IF                = 0             'Timer 0 vlag clearen
    TMR0                = 206           '206 in register TMR0 gooien zoadat bij 
                                        '50Hz 1 keer per seconde interupt is
    GIE                 = 1             'Interupt opzetten  

GoTo over_interupt

on_hardware_interrupt GoTo Interupt 
Interupt: 
    T0IF = 0    'Overflow vlag terug afzetten
    TMR0 = 206  'Terug 205 in het TMR0 reg zetten 
                '(voor 1 interupt per sec bij 50 hz)
    Inc tussenCount
    If tussenCount = 60 Then
        tussenCount = 0
        Inc tijdmin1
        'minuten eenheden
         If tijdmin1 = 10 Then
            tijdmin1 = 0
            'Minuten tientallen
            Inc tijdmin10
            If tijdmin10 = 6 Then
                Inc tijduur1
                tijdmin1 = 0
                tijdmin10 = 0
                'Uren
                If tijduur1 = 4 And tijduur10 = 2 Then
                   tijduur1 = 0
                   tijduur10 = 0
                EndIf
                If tijduur1 = 10 Then
                   tijduur1 = 0
                   Inc tijduur10
                EndIf
            EndIf
        EndIf 
    EndIf
Context Restore  


over_interupt:
    
'preset waarde meegeven
    tijduur10           = 0 
    tijduur1            = 0
    tijdmin10           = 0
    tijdmin1            = 0
        
Hoofdprog:
    'leds aansturen
    'minuten eenheden
        High minu1
            leds = tijdmin1 
            DelayMS 1 
        Low minu1
        leds = 0
    DelayUS 50
    'Minuten tientallen
        High minu10
            leds = tijdmin10 
            DelayMS 1    
        Low minu10
        leds = 0
    DelayUS 50
    'Uren eenheden
        High uren1
            leds = tijduur1
            DelayMS 1    
        Low uren1
        leds = 0
    DelayUS 50
        'Uren tientallen
        High uren10
            leds = tijduur10  
            DelayMS 1   
        Low uren10
        leds = 0
    DelayMS 2
    GoSub Instellen

GoTo Hoofdprog

Instellen:
    'Minuten instellen
    If incMin = 0 And minBit = 0 Then
        Inc tijdmin1
        If tijdmin1 = 10 Then
            tijdmin1 = 0
            'Minuten tientallen
            Inc tijdmin10
            If tijdmin10 = 6 Then
                tijdmin1 = 0
                tijdmin10 = 0
            EndIf
        EndIf
        minBit = 1
    Else
        If incMin = 1 And minBit = 1  Then
            minBit = 0    
        EndIf
    EndIf
    'Uren instellen
    If incUur = 0 And uurBit = 0 Then
        Inc tijduur1
        If tijduur1 = 10 Then
            tijduur1 = 0
            'Minuten tientallen
            Inc tijduur10
            If tijduur10 = 6 Then
                tijduur1 = 0
                tijduur10 = 0
            EndIf
        EndIf
        uurBit = 1
    Else
        If incUur = 1 And uurBit = 1 Then
            uurBit = 0    
        EndIf
    EndIf
Return
End    

The hex file: link.