; version 1.0
timer2_int: clr ea
push psw
push acc
push ar0
anl psw,#11100111b
mov t2con,#00000100b
mov p0,#11100000b
mov a,col_ind_o
inc a
cjne a,col_no_o,t2i_ok
clr a
t2i_ok: mov col_ind_o,a
rl a
add a,col_ind_o
add a,#digits_o
mov r0,a
mov a,@r0
mov c,going_up_o
mov acc.7,c
mov p2,a
inc r0
mov a,@r0
mov c,going_dn_o
mov acc.7,c
mov p1,a
inc r0
mov a,@r0
orl a,#11100000b
mov p0,a
setb wrote_old
pop ar0
pop acc
pop psw
setb ea
reti
timer1_int: clr ea
push psw
push acc
push ar0
anl psw,#11100111b
jbc wrote_old,t1i_skip
push ar1
push ar2
mov r2,#15+1+1
mov r0,#digits_n
mov r1,#digits_o
t1i_lp: mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,t1i_lp
pop ar2
pop ar1
mov c,going_up_n
mov going_up_o,c
mov c,going_dn_n
mov going_dn_o,c
clr tr1
sjmp t1i_ret
t1i_skip: mov p0,#11100000b
mov a,col_ind_n
inc a
cjne a,col_no_n,t1i_ok
clr a
t1i_ok: mov col_ind_n,a
rl a
add a,col_ind_n
add a,#digits_n
mov r0,a
mov a,@r0
mov c,going_up_n
mov acc.7,c
mov p2,a
inc r0
mov a,@r0
mov c,going_dn_n
mov acc.7,c
mov p1,a
inc r0
mov a,@r0
orl a,#11100000b
mov p0,a
clr tr1
mov a,tl1 ; 1
add a,reload_lo ; 1
mov tl1,a ; 1
mov a,th1 ; 1
addc a,reload_hi ; 1
mov th1,a ; 1
setb tr1 ; 1
t1i_ret: pop ar0
pop acc
pop psw
setb ea
reti
init_outputs: clr ea
clr a
mov digits_o,a
mov digits_o+1,a
mov digits_o+2,a
mov col_no_o,#1
mov col_ind_o,a
orl tmod,#00010000b
mov rcap2l,#low(-tmr2_period)
mov rcap2h,#high(-tmr2_period)
setb tr2
setb et1
setb et2
setb ea
ret
init_transition:
clr ea
mov r7,a
clr c
subb a,#2 ; must be > 100/flicker
jnc it_trans_ok
mov r7,#10
it_trans_ok: mov a,r7
mov r2,#0
jnb acc.7,it_skip1
clr c
rrc a
inc r2
it_skip1: jnb acc.6,it_skip2
clr c
rrc a
inc r2
it_skip2: rl a
mov r1,a
inc a
mov dptr,#div_table
movc a,@a+dptr
xch a,r1
movc a,@a+dptr
mov r0,a
mov a,r2
jz it_skip3
it_lp0: clr c
mov a,r0
rrc a
mov r0,a
mov a,r1
rrc a
mov r1,a
djnz r2,it_lp0
it_skip3: clr tr1
clr tr2
mov a,#low(-tmr2_period+7)
add a,r1
mov tl1,a
mov reload_lo,a
mov a,#high(-tmr2_period+7)
addc a,r0
mov th1,a
mov reload_hi,a
mov tl2,#low(-tmr2_period)
mov th2,#high(-tmr2_period)
mov dptr,#column_mask
mov r0,#digits_n+2
call copy_data
mov col_no_n,#5
mov col_ind_n,#0
it_lp1: mov a,col_no_n
xrl a,#1
jz it_done
mov r0,#digits_n
mov r2,#0
it_lp2: mov r1,ar0
mov a,@r0
inc r0
mov r5,a
mov a,@r0
inc r0
inc r0
orl a,r5
jnz it_lp2_ok
it_lp2_lp: mov a,@r0
mov @r1,a
inc r0
inc r1
mov a,@r0
mov @r1,a
inc r0
inc r1
mov a,@r0
mov @r1,a
inc r0
inc r1
inc r2
mov a,r2
cjne a,col_no_n,it_lp2_lp
dec col_no_n
jmp it_lp1
it_lp2_ok: inc r2
mov a,r2
cjne a,col_no_n,it_lp2
if 0
it_lp3: mov a,col_no_n
xrl a,#1
jz it_done
mov r0,#digits_n
mov r2,#0
it_lp4: mov ar6,@r0
inc r0
mov ar7,@r0
inc r0
inc r0
mov r1,ar0
mov a,r2
inc a
mov r3,a
it_lp5: mov a,@r1
inc r1
xrl a,r6
mov r5,a
mov a,@r1
inc r1
inc r1
xrl a,r7
orl a,r5
jnz it_lp5_ok
dec r0
dec r1
mov a,@r1
orl a,@r0
mov @r0,a
inc r1
mov a,r1
add a,#-3
mov r0,a
it_lp5_lp: mov a,@r1
mov @r0,a
inc r1
inc r0
mov a,@r1
mov @r0,a
inc r1
inc r0
mov a,@r1
mov @r0,a
inc r1
inc r0
inc r3
mov a,r3
cjne a,col_no_n,it_lp5_lp
dec col_no_n
jmp it_lp3
it_lp5_ok: inc r3
mov a,r3
cjne a,col_no_n,it_lp5
inc r2
mov a,r2
inc a
cjne a,col_no_n,it_lp4
endif
it_done: setb wrote_old
setb tr1
setb tr2
setb ea
ret
copy_data: mov r1,#5
cd_lp: clr a
movc a,@a+dptr
inc dptr
mov @r0,a
inc r0
inc r0
inc r0
djnz r1,cd_lp
ret