
#include "8051equ.inc"

.org	00h
	ajmp	start

.org	03h
        push    PSW

	; set 30h to new number based on timer
	mov	30h, TL0

        pop     PSW
	reti

.org	0bh
	reti

.org	13h
	reti

.org	1bh
	reti

.org	23h
	reti

.org	25h


initialize:
        mov     SP, #040h

	; start timer 0 - 16 bit timer mode
	mov	TMOD, #01h
	setb	TR0

	mov	PSW, #00h
	
	; interrupt when switch is hit
        clr     IT0
	setb	EA
	setb	EX0
	ret

; delay for short while (not important exactly how long)
delay_x:
	mov	r7, #0ffh
loop_1:
	dec	r7
	djnz	r7, loop_1
	ret

; 8-bit binary to bcd converter
; a  - input value
; r2 - output digit 1
; r3 - output digit 2
; r4 - output digit 3
bin_to_bcd:

	mov	B, #010d
	div	ab
	mov	r4, B
	mov	B, #010d
	div	ab
	mov	r3, B
	mov	B, #010d
	div	ab
	mov	r2, B
	ret

segment_table:	
	.db 	00001001b, 11101011b, 01000101b, 01100001b, 10100011b, 00110001b, 00010001b, 01101011b, 00000001b, 00100011b

; display 3 digit BCD number in the A register
display_bcd:
	mov	dptr, #segment_table
	movc	a, @a+dptr
	mov	P1, a
	ret
		
start:
	acall	initialize

display_loop:
        mov     a, 30h
	acall	bin_to_bcd

	mov	a, r2
	acall	display_bcd
	setb	P3.3
	acall	delay_x
	clr	P3.3

	mov	a, r3
	acall	display_bcd
	setb	P3.4
	acall	delay_x
	clr	P3.4

	mov	a, r4
	acall	display_bcd
	setb	P3.5
	acall	delay_x
	clr	P3.5

	ajmp	display_loop
	
.end
