As recreation after studying for my exams I have made an binary bcd clock. The base is a PIC16F628A.
Main circuit:
Power supply circuit:
Led matrix circuit:
Main pcb layout:
The pcb as pdf: link
Pictures:
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.