// C code to use 6 binary digits as a clock 12:00:00
unsigned char hours10;
unsigned char hours;
unsigned char mins10;
unsigned char mins;
unsigned char secs10;
unsigned char secs;
// update clock each second
secs++;
if(secs >= 10)
{
secs=0;
secs10++;
}
if(secs10 >= 6)
{
secs10=0;
mins++;
}
if(mins >= 10)
{
mins=0;
mins10++;
}
if(mins10 >= 6)
{
mins10=0;
hours++;
}
if(hours >= 10)
{
hours=0;
hours10++;
}
if(hours10 == 1 && hours == 3) // roll from 12 to 1 o'clock
{
hours10=0;
hours = 1;
}
------------------------------------------
; Below is the assembler version
;Clock.c,12 :: secs++;
$0004 $1303 BCF STATUS, RP1
$0005 $1283 BCF STATUS, RP0
$0006 $0AA0 INCF _secs, 1
;Clock.c,13 :: if(secs >= 10)
$0007 $300A MOVLW 10
$0008 $0220 SUBWF _secs, 0
$0009 $1C03 BTFSS STATUS, C
$000A $280D GOTO L_main_0
;Clock.c,15 :: secs=0;
$000B $01A0 CLRF _secs, 1
;Clock.c,16 :: secs10++;
$000C $0AA1 INCF _secs10, 1
;Clock.c,17 :: }
$000D $ L_main_0:
;Clock.c,18 :: if(secs10 >= 6)
$000D $3006 MOVLW 6
$000E $0221 SUBWF _secs10, 0
$000F $1C03 BTFSS STATUS, C
$0010 $2813 GOTO L_main_1
;Clock.c,20 :: secs10=0;
$0011 $01A1 CLRF _secs10, 1
;Clock.c,21 :: mins++;
$0012 $0AA2 INCF _mins, 1
;Clock.c,22 :: }
$0013 $ L_main_1:
;Clock.c,23 :: if(mins >= 10)
$0013 $300A MOVLW 10
$0014 $0222 SUBWF _mins, 0
$0015 $1C03 BTFSS STATUS, C
$0016 $2819 GOTO L_main_2
;Clock.c,25 :: mins=0;
$0017 $01A2 CLRF _mins, 1
;Clock.c,26 :: mins10++;
$0018 $0AA3 INCF _mins10, 1
;Clock.c,27 :: }
$0019 $ L_main_2:
;Clock.c,28 :: if(mins10 >= 6)
$0019 $3006 MOVLW 6
$001A $0223 SUBWF _mins10, 0
$001B $1C03 BTFSS STATUS, C
$001C $281F GOTO L_main_3
;Clock.c,30 :: mins10=0;
$001D $01A3 CLRF _mins10, 1
;Clock.c,31 :: hours++;
$001E $0AA4 INCF _hours, 1
;Clock.c,32 :: }
$001F $ L_main_3:
;Clock.c,33 :: if(hours >= 10)
$001F $300A MOVLW 10
$0020 $0224 SUBWF _hours, 0
$0021 $1C03 BTFSS STATUS, C
$0022 $2825 GOTO L_main_4
;Clock.c,35 :: hours=0;
$0023 $01A4 CLRF _hours, 1
;Clock.c,36 :: hours10++;
$0024 $0AA5 INCF _hours10, 1
;Clock.c,37 :: }
$0025 $ L_main_4:
;Clock.c,38 :: if(hours10 == 1 && hours == 3) // roll from 12 to 1 o'clock
$0025 $0825 MOVF _hours10, 0
$0026 $3A01 XORLW 1
$0027 $1D03 BTFSS STATUS, Z
$0028 $2830 GOTO L_main_7
$0029 $0824 MOVF _hours, 0
$002A $3A03 XORLW 3
$002B $1D03 BTFSS STATUS, Z
$002C $2830 GOTO L_main_7
$002D $ L42_ex_L_main_7:
;Clock.c,40 :: hours10=0;
$002D $01A5 CLRF _hours10, 1
;Clock.c,41 :: hours = 1;
$002E $3001 MOVLW 1
$002F $00A4 MOVWF _hours