📄 pc16bios.a51
字号:
mov a,r7
cjne a,#01,get_outstus1
mov a,r6
anl a,#00000001b
jmp check_stus
get_outstus1: cjne a,#02,get_outstus2
mov a,r6
anl a,#00000010b
jmp check_stus
get_outstus2: cjne a,#03,get_outstus3
mov a,r6
anl a,#00000100b
jmp check_stus
get_outstus3: cjne a,#04,get_outstus4
mov a,r6
anl a,#00001000b
jmp check_stus
get_outstus4: cjne a,#05,get_outstus5
mov a,r6
anl a,#00010000b
jmp check_stus
get_outstus5: cjne a,#06,get_outstus6
mov a,r6
anl a,#00100000b
jmp check_stus
get_outstus6: cjne a,#07,get_outstus7
mov a,r6
anl a,#01000000b
jmp check_stus
get_outstus7: cjne a,#08,check_end
mov a,r6
anl a,#10000000b
check_stus: jnz check_stus1
mov r7,#ON
jmp check_end
check_stus1: mov r7,#OFF
check_end: ret
;----------------------------------------------------------------------------
; PC16I8O sk2 explanation using read BCD function
; sk2.2 = MSB byte sk2.4 = LSB byte
; C call function prototype char _scan_manual(void)
;
_scan_manual: clr p3.6 ; read LSB byte
call delay5ms
call delay5ms
mov a,p3
rrc a
rrc a
cpl a
anl a,#00001111b
mov r0,a ; save LSB byte at r0
setb p3.6
clr p3.7 ; read MSB byte
call delay5ms
call delay5ms
mov a,p3
rrc a
rrc a
cpl a
anl a,#00001111b
setb p3.7
mov b,#10
mul ab
add a,r0
mov r7,a ; return BCD in r7 register
ret
;----------------------------------------------------------------------------
; PC16I8O sk2 explanation using panel control
; Sk2.5 & sk2.6 & sk2.8 & sk2.9 using for key
; C call function prototye char _get_key(char c)
;
_get_key: mov a,port3_stus
cjne r7,#01,get_key1
anl a,#04h
jmp get_key4
get_key1: cjne r7,#02,get_key2
anl a,#08h
jmp get_key4
get_key2: cjne r7,#03,get_key3
anl a,#10h
jmp get_key4
get_key3: cjne r7,#04,get_exit
anl a,#20h
get_key4: cjne a,#00,get_key5
mov r7,#ON
jmp get_exit
get_key5: mov r7,#OFF
get_exit: ret
;----------------------------------------------------------------------------
; PC16I8O sk2 explanation using panel control
; Sk2.2 & sk2.4 using indicating lamp for PASS & FAIL
; C call function prototype void _disp_pilot(char c stus s)
;
_disp_pilot: mov a,r7
cjne a,#01,disp_pilot2
mov a,r5
cjne a,#00,disp_pilot1
setb p3.6
jmp disp_exit
disp_pilot1: clr p3.6
jmp disp_exit
disp_pilot2: cjne a,#02,disp_exit
mov a,r5
cjne a,#00,disp_pilot3
setb p3.7
jmp disp_exit
disp_pilot3: clr p3.7
;
disp_exit: ret
;----------------------------------------------------------------------------
_delay: push acc
push b
mov a,r7
jz set_delayl4
set_delayl1: call subdelay
djnz r7,set_delayl1
set_delayl4: mov a,r6
jz set_delayend
set_delayl3: mov b,#0ffh
set_delayl2: call subdelay
djnz b,set_delayl2
djnz r6,set_delayl3
set_delayend: pop b
pop acc
ret
subdelay: mov a,#250 ;delay 1ms
subdelayl1: nop
nop
nop
nop
nop
dec a
jnz subdelayl1
ret
;----------------------------------------------------------------------------
; Read current time r6:MSB , r7: LSB
;
_current_time: mov r7,tick_clock+01h
mov r6,tick_clock
ret
;----------------------------------------------------------------------------
scand_input: mov @r0,p0
inc r0
mov @r0,p2
inc r0
mov @r0,p3
ret
;----------------------------------------------------------------------------
deal_signal: mov r0,#input_buf1
mov r1,#input_buf2
mov a,@r0
anl a,@r1
mov port0_stus,a
inc r0
inc r1
mov a,@r0
anl a,@r1
mov port2_stus,a
inc r0
inc r1
mov a,@r0
anl a,@r1
mov port3_stus,a
ret
;----------------------------------------------------------------------------
; Convert 8-bit BCD variable in accumulator
; Result 2-digit packed HEX format in acc.
;
_bcd2tohex8: mov r0,a
swap a
anl a,#00001111b
mov b,#10
mul ab
mov r1,a
mov a,r0
anl a,#00001111b
add a,r1
ret
;----------------------------------------------------------------------------
_delay50us: mov r1,#50 ; delay parameter
djnz r1,$ ; about 50*1 us = 50 us
ret
;----------------------------------------------------------------------------
delay5ms: mov r2,#25 ; delay parameter
delay51: mov r1,#200 ; delay parameter
djnz r1,$ ; about 10*200*1us = 2 ms
djnz r2,delay51
ret
;----------------------------------------------------------------------------
; To place interrupt routines, put an LJMP at the interrupt vector address.
cseg at 0BH ; 0BH is address for Timer 0 interrupt
ljmp timer0
int0_code_seg segment code ; segment for interrupt function
rseg int0_code_seg ; switch to this code segment
using 1 ; register bank for interrupt routine
timer0: push psw
mov psw,#08h ; register bank 1
push acc
mov tl0,#LSB_PERIOD
mov th0,#MSB_PERIOD ; reload interrupt period
inc tick_clock+01h ; timer pointer
mov a,tick_clock+01h
jnz int_timer
inc tick_clock
int_timer: mov r0,#input_buf2
lcall scand_input ; scand input port status
lcall deal_signal
pop acc
pop psw
reti
;----------------------------------------------------------------------------
; To place interrupt routines, put an LJMP at the interrupt vector address.
cseg at 1BH ; 1BH is address for Timer1 interrupt
ljmp timer1
int1_code_seg segment code ; segment for interrupt function
rseg int1_code_seg ; switch to this code segment
using 1 ; register bank for interrupt routine
timer1: push psw
mov psw,#08h ; register bank 1
push acc
mov tl1,#0ech ; reload interrupt period
mov th1,#0cbh
mov r0,#input_buf1
lcall scand_input ; scand input port status
pop acc
pop psw
reti
;----------------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -