⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc16bios.a51

📁 16输入8输出单片机程序
💻 A51
📖 第 1 页 / 共 2 页
字号:
                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 + -