📄 自动垃圾桶的程序.asm
字号:
;; General purpose registers
;;
IDA EQU 0H ; Indirect data addressing
RTCC EQU 1H ; Real time counter
PC EQU 2H ; Program counter
STATUS EQU 3H ; Status register
FSR EQU 4H ; File select register
PORTA EQU 5H ; I/O port A
PORTB EQU 6H ; I/O port B
; EQU 7H ;
;
MM EQU 8H ;
TRAN_SPACE_CNT EQU 9H ;
PW_358_CNT EQU 0AH ;
T_CNT EQU 0BH ;
MOTOR_BRK_CNT EQU 0CH ;
BTN_MEM EQU 0DH
DLY_CNT0 EQU 0EH
DLY_CNT1 EQU 0FH
;
LED_CNT0 EQU 10H
LED_CNT1 EQU 11H
LED_MEM EQU 12H
;
;; --- << Status register defined >> ---
;
CY EQU 0H ; Carry flag
DC EQU 1H ; D_carry flag
ZERO EQU 2H ; Zero flag
PD EQU 3H ; Power down
TO EQU 4H ; Timer_out
PA0 EQU 5H ; Page preselect 0
PA1 EQU 6H ; Page preselect 1
PA2 EQU 7H ; General R/W bit
;
;; ****** Port A bit & compiler definitions ******
;
PW_358_2 EQU 0H ;
MOTOR_STOP EQU 1H ;
AUTO_OPEN EQU 2H ;
AUTO_CLOSE EQU 3H ;
;
TRISA EQU B'0000' ; Port A tri-state value
;
;; ****** Port B bit & compiler definitions ******
;
HUMAL_OPEN_SW EQU 0H ;
LED_G_OPEN EQU 1H ;
LED_R_CLOSE EQU 2H ;
IR_TRANSMIT EQU 3H ;
IR_SG_DET EQU 4H ;
CHK_358_1_PW EQU 5H ;
CHK_358_1_FB EQU 6H ;
PW_358_1 EQU 7H ;
;
TRISB EQU B'01010001' ; Port B tri-state value
;
;; RTCC EQU HUMAL_CLOSE_SW
;
;; ______ >>> Chip reset vector <<< ______
;
PIC16C54 EQU 1FFH ; For PIC16C54 reset vector
;
;; **********************************************************
;
ORG 0H
;;
IO_SETUP
MOVLW TRISA
TRIS PORTA
MOVLW TRISB
TRIS PORTB
RETLW 0H
;;
DELAY_900MS
MOVLW 90D ; 90 * 10 ms = 900 ms
DELAY_VAL_SET
MOVWF DLY_CNT1 ;
DLY_LP_S
MOVLW 68D
MOVWF DLY_CNT0
DLY_LP
CLRWDT
DECFSZ DLY_CNT0
GOTO DLY_LP
DECFSZ DLY_CNT1
GOTO DLY_LP_S
RETLW 0H
;;
LED_OFF_TMR_S
MOVLW 3D
MOVWF LED_CNT1
CLRF LED_CNT0
BCF LED_MEM,0 ; LED off flag
RETLW 0H
;;
LED_ON_TMR_S
MOVLW 1D
MOVWF LED_CNT1
MOVLW 0AH
MOVWF LED_CNT0
BSF LED_MEM,0 ; LED on flag
RETLW 0H
;;
ACT_PROCESS
CLRWDT ;
BTFSS RTCC,6
RETLW 0H
CLRF RTCC ; 5.12 ms
;;
DECFSZ TRAN_SPACE_CNT ; 200 ms timer
GOTO ACT_PRO_1
;
BSF PORTB,PW_358_1 ; Turn on 1th 358
BCF PORTA,PW_358_2 ; Turn on 2th 358
MOVLW 5D ; 5.12 ms * 5 = 25.6 ms
MOVWF PW_358_CNT ; 358 duty cycle
BSF MM,0 ;
;
BCF MM,2
MOVLW 39D ; 5.12 ms * 39 = 199.68 ms
MOVWF TRAN_SPACE_CNT
;;
ACT_PRO_1
BTFSC MM,0 ;
DECFSZ PW_358_CNT
GOTO ACT_PRO_2
BCF PORTB,PW_358_1 ; Turn off 1th 358
BSF PORTA,PW_358_2 ; Turn off 2th 358
BCF MM,0
MOVLW 5D ; 5.12 ms * 5 = 25.6 ms
MOVWF PW_358_CNT ; 358 duty cycle
;;
ACT_PRO_2
BTFSC MM,3
DECFSZ T_CNT
GOTO LED_PRO_ACT
BCF MM,3
BTFSC BTN_MEM,1 ; Humal open flag
GOTO LED_PRO_ACT
;
BCF PORTB,IR_TRANSMIT ; Turn on IR transmit 40 us
NOP ; 80 us
BSF PORTB,IR_TRANSMIT ; Turn off IR transmit
;
BTFSC PORTB,IR_SG_DET
BSF MM,4 ; IR signal receiver flag
;;
LED_PRO_ACT
BTFSC LED_MEM,6 ; LED flash enable flag
DECFSZ LED_CNT0
GOTO SKIP_RETURN
DECFSZ LED_CNT1
GOTO SKIP_RETURN
;
MOVLW 4H ; RED LED flash flag
BTFSS LED_MEM,7
MOVLW 2H ; GREEN LED flash flag
XORWF PORTB
BTFSS LED_MEM,0
GOTO LED_FLH_ON_T
CALL LED_OFF_TMR_S
GOTO SKIP_RETURN
;
LED_FLH_ON_T
CALL LED_ON_TMR_S
;;
SKIP_RETURN
BTFSC PORTB,HUMAL_OPEN_SW
BCF BTN_MEM,0
RETLW 0H
;
;; ***************************************
;; *** Init. reset ***
;; ***************************************
;
INIT_RESET
CALL IO_SETUP
MOVLW 1H
MOVWF PORTA
MOVLW 59H
MOVWF PORTB
MOVLW 40H
MOVWF LED_MEM
;;
CLOSE_ACTION
BSF PORTB,LED_R_CLOSE ; Turn on close LED
BSF PORTA,AUTO_CLOSE
MOVLW 1EH
CALL DELAY_VAL_SET
BCF PORTA,AUTO_CLOSE
;
BSF PORTA,MOTOR_STOP ; Motor brake
CALL DELAY_900MS
BCF PORTA,MOTOR_STOP
; CALL DELAY_900MS
BCF PORTB,LED_R_CLOSE ; Turn off close LED
BSF LED_MEM,7 ; RED LED flash flag
;;
MOVLW 0H ; RTCC prescaler 1:2
OPTION
MOVLW 39D
MOVWF TRAN_SPACE_CNT
CALL LED_OFF_TMR_S
CLRF MM
CLRF BTN_MEM
;
;; ***************************************
;
MAIN_PROG_LOOP
CALL ACT_PROCESS
BTFSS PORTB,HUMAL_OPEN_SW
GOTO BTN_OPEN_D_OK
BTFSC MM,4
GOTO IR_SG_RECE_OK
;
BTFSS PORTB,CHK_358_1_FB
GOTO MAIN_PROG_LOOP ;
BTFSC MM,2
GOTO MAIN_PROG_LOOP ;
BSF MM,2
MOVLW 2H ; Detect IR freeback signal after 10 ms
MOVWF T_CNT ;
BSF MM,3 ; 10 ms counter flag
GOTO MAIN_PROG_LOOP ;
;
;; **********************************************************
;
BTN_OPEN_D_OK
BTFSC BTN_MEM,0
GOTO BTN_DETECT_PASS
BSF BTN_MEM,0
;
IR_SG_RECE_OK
BCF PORTA,MOTOR_STOP
BCF LED_MEM,6 ; LED flash disable
CLRF MM
BSF PORTB,LED_G_OPEN ; Turn on open LED
;
BSF PORTB,PW_358_1 ; Turn on 1th 358 power
BCF PORTA,PW_358_2 ; Turn on 2th 358 power
;
BSF PORTA,AUTO_OPEN
CALL DELAY_900MS
BCF PORTA,AUTO_OPEN
NOP
BSF PORTA,MOTOR_STOP ; Motor brake
CALL DELAY_900MS
BCF PORTA,MOTOR_STOP ; Motor brake
;
BTN_DETECT_PASS
BTFSS BTN_MEM,0
GOTO RESET_OPEN_CNT
BCF PORTB,LED_G_OPEN
;
BSF BTN_MEM,1
BCF PORTB,PW_358_1 ; Turn off 1th 358 power
BSF PORTA,PW_358_2 ; Turn off 2th 358 power
BSF LED_MEM,6 ; LED flash enable
BCF LED_MEM,7 ; Green LED enable
CALL LED_OFF_TMR_S
GOTO MAIN_PROG_LOOP ;
;;
RESET_OPEN_CNT
MOVLW 128D ; 3 seconds
MOVWF MOTOR_BRK_CNT
;
DEC_3S_LP
MOVLW 2H
CALL DELAY_VAL_SET
BTFSS PORTB,HUMAL_OPEN_SW
GOTO BTN_OPEN_D_OK
;;
IR_T_D
BCF PORTB,IR_TRANSMIT ; 40 us
NOP ; 40 us + 40 us = 80 us
BSF PORTB,IR_TRANSMIT ; Turn off IR transmit
BTFSC PORTB,IR_SG_DET
GOTO RESET_OPEN_CNT
DECFSZ MOTOR_BRK_CNT
GOTO DEC_3S_LP
;
OPEN_DET_LP
MOVLW 2H
CALL DELAY_VAL_SET
BCF PORTB,IR_TRANSMIT ; 40 us
NOP ; 40 us + 40 us = 80 us
BSF PORTB,IR_TRANSMIT ; Turn off IR transmit
;
BTFSC PORTB,IR_SG_DET
GOTO OPEN_DET_LP
BCF PORTB,LED_G_OPEN ; Turn off open LED
;;
BSF PORTB,LED_R_CLOSE ; Turn on close LED
BSF PORTA,AUTO_CLOSE
MOVLW 1EH
CALL DELAY_VAL_SET
BCF PORTA,AUTO_CLOSE
BCF PORTB,LED_R_CLOSE ; Turn on close LED
;
MOVLW 48D
MOVWF MOTOR_BRK_CNT
;;
CLOSE_DET_LP
BSF PORTA,MOTOR_STOP ; Motor brake
MOVLW 2H
CALL DELAY_VAL_SET
BCF PORTB,IR_TRANSMIT ; 40 us
NOP ; 40 us + 40 us = 80 us
BSF PORTB,IR_TRANSMIT ; Turn off IR transmit
;
BTFSC PORTB,IR_SG_DET
GOTO IR_SG_RECE_OK
DECFSZ MOTOR_BRK_CNT
GOTO CLOSE_DET_LP
BCF PORTA,MOTOR_STOP
;
BCF PORTB,PW_358_1 ; Turn off 1th 358 power
BSF PORTA,PW_358_2 ; Turn off 2th 358 power
BSF LED_MEM,6 ; LED flash enable
CALL LED_OFF_TMR_S
GOTO MAIN_PROG_LOOP ;
;
;; ___ Reset vector for power on & reset ___
;
ORG PIC16C54
GOTO INIT_RESET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -