📄 mypjt.asm
字号:
LIST P=16C54
#include <p16C5x.inc>
;---------------------------------------------
;WORK_MODE define
;---------------------------------------------
#define AUTO_MODE 0x01
#define KEY_MODE 0x02
#define DUMMY_MODE 0x00
;--------------------------------------------
; motor_mode define
;--------------------------------------------
#define MM_DUMMY 0x00
#define MM_OPEN 0x01
#define MM_CLOSE 0x02
;-----------------------------------------------
;控制motor define
;-----------------------------------------------
#define MM_OPEN_ROLL 0x20 ;;RB6=0,RB5=1
#define MM_CLOSE_ROLL 0x40 ;;RB6=1,RB5=0
#define MM_STOP 0x9F ;;RB6=0,RB5=0
;-----------------------------------------------
;;按键键值定义
;-----------------------------------------------
#define OPEN_KEY 0x01
#define CLOSE_KEY 0x02
#define DUMMY_KEY 0x00
;-----------------------------------------------
; door_stu define
;-----------------------------------------------
#define DOOR_CLOSE_STU 0x00
#define DOOR_KEY_OPEN_STU 0x01
#define DOOR_AUTO_OPEN_STU 0x02
#define DOOR_CLOSING_STU 0x03
#define DOOR_OPENING_STU 0x04
;LED PORT DEFINE
MAIN_OP_POWER EQU PORTB*8+0 ;RB0
INFRARED_LED EQU PORTB*8+1 ;RB1
LED_RED EQU PORTB*8+2 ; RB2
LED_GREEN EQU PORTB*8+3 ;RB3
SUB_OP_POWER EQU PORTB*8+7 ;RB7
#define TM2S 0x0e ;200
#define TM8S_L 0x9b
#define TM8S_H 0x02
#define TM500MS 0x01
#define TM4S 0x1c
; bit define
flag equ 0x08
INFRARED_F equ flag*8+0 ;flag.0
KEYREQ_F equ flag*8+1 ;flag.1
LOW_V_F equ flag*8+2 ;flag.2
RED_FRESH_F equ flag*8+3 ;红灯闪烁标志
;---------------------------------------------
;1 byte variable define
;---------------------------------------------
motor_mode equ 0x09
motor_mode_old equ 0x0A
motor_step equ 0x0b
door_stu equ 0x0c
delay_time_L equ 0x0d
delay_time_H equ 0x0e
keyvld equ 0x0f
keyvld_old equ 0x10
;------------------------------------
; INFRARED CHECK
;------------------------------------
HIGH_LEVEL_COUNT EQU 0x11
LOW_LEVEL_COUNT EQU 0x12
;------------------------------------
work_mode equ 0x13
fresh_red_time equ 0x14
;------------------------------------
;;ram area: 0x1a-0x1f is temp varible
;------------------------------------
temp_va1 equ 0x1a
temp_va2 equ 0x1b
temp_va3 equ 0x1c
temp_va4 equ 0x1d
temp_va5 equ 0x1e
temp_va6 equ 0x1f
;--------------------------------------------------------------
;--------------------------------------------------------------
CPU_INIT:
MOVLW 0FH
TRIS 5 ;; RA0,RA1,RA2,RA3 INPUT
CLRW
TRIS 6 ;; 全部输出
MOVLW 0x09 ;;设置WDT 时间77ms
OPTION
BTFSS STATUS,3
RETLW 00H ;;从睡眠模式唤醒
;上电复位,先初始化
MOVLW 0x82
MOVWF PORTB
;RAM 清0
MOVLW 0x08
MOVWF FSR
RAM_CLEAR:
CLRF INDF
INCF FSR
MOVLW 0x1f
ANDWF FSR,w
XORLW 0x1f
BTFSS STATUS,Z
GOTO RAM_CLEAR
MOVLW 0x01
MOVWF fresh_red_time
RETLW 00H
;------------------------------------------------------------
;------------------------------------------------------------
ORG 1FFH
GOTO START
ORG 20H
START:
CALL CPU_INIT
;------------------------------------------------------------
;------------------------------------------------------------
MAIN_LOOP:
KEY_HD:
CLRWDT
TEST_DOOR_CLOSE:
MOVF door_stu,w
XORLW DOOR_CLOSE_STU
BTFSS STATUS,Z
GOTO TEST_DOOR_OPEN
GOTO NEXT_STEP1 ;在关门状态下可以去扫描按键
TEST_DOOR_OPEN:
MOVF door_stu,w
XORLW DOOR_KEY_OPEN_STU ;是否为按键开门状态?
BTFSC STATUS,Z ;不是,进入红外处理
NEXT_STEP1:
CALL KEY_SCAN ;只有在按键开门状态下可以扫描按键
;------------------------------------------------------------
;------------------------------------------------------------
INFRA_HD:
BTFSC flag,KEYREQ_F
GOTO NEXT_STEP2 ;有按键,不处理红外扫描
;没有按键时
MOVF door_stu,w ;判别门的状态
XORLW DOOR_CLOSE_STU ;关着状态?
BTFSC STATUS,Z
GOTO INFRA_LABEL1 ;是关着
;原则上在关门的状态下处理红外才有效
; MOVF door_stu,w ; 不在关状态,再判是否是红外打开状态
; XORLW DOOR_AUTO_OPEN_STU
; BTFSS STATUS,Z
GOTO NEXT_STEP2 ;不是,返回
INFRA_LABEL1:
CALL INFRARED_SCAN
;---------------------------------------------------------
;---------------------------------------------------------
NEXT_STEP2:
KEY_PRC:
BTFSS flag,KEYREQ_F
GOTO NEXT_STEP3 ;没按键,执行红外处理
BCF flag,KEYREQ_F ;
MOVLW KEY_MODE ;保存工作模式
MOVWF work_mode
MOVF keyvld,w
XORLW CLOSE_KEY
BTFSC STATUS,Z
GOTO CLOSE_KEY_HD ;关门键
MOVLW MM_OPEN ;开门键
GOTO LABEL6
CLOSE_KEY_HD:
MOVF door_stu,w
XORLW DOOR_KEY_OPEN_STU
BTFSS STATUS,Z
GOTO NEXT_STEP3
MOVLW MM_CLOSE
GOTO LABEL6
LABEL6
MOVWF motor_mode
;-------------------------------------------------------
;-------------------------------------------------------
NEXT_STEP3:
INFRARED_PRC:
BTFSS flag,INFRARED_F
GOTO NEXT_STEP4 ;没感应,下一步
;有感应时
BCF flag,INFRARED_F ;清标志
MOVLW AUTO_MODE ;保存工作模式
MOVWF work_mode
; MOVF door_stu,w ;检测门状态
; XORLW DOOR_CLOSE_STU
; BTFSC STATUS,Z
; GOTO LABEL7 ;门关着
;不在门关着状态,再判是否是自动开状态
; MOVF door_stu,w
; XORLW DOOR_AUTO_OPEN_STU
; BTFSC STATUS,Z
; GOTO NEXT_STEP4 ;是自动开态
; MOVLW MM_CLOSE
; GOTO LABEL8
LABEL7:
MOVLW MM_OPEN
LABEL8:
MOVWF motor_mode
;------------------------------------------------------
;------------------------------------------------------
NEXT_STEP4:
MOTOR_HD:
CALL MOTOR_PRC
NEXT_STEP5:
CALL LED_PRC
GOTO MAIN_LOOP
;------------------------------------------------------
;------------------------------------------------------
INFRARED_SCAN:
BSF PORTB,MAIN_OP_POWER ;OPEN MAIN_OP_POWER
BCF PORTB,SUB_OP_POWER ;OPEN SUB_OP_POWER
MOVLW 0x6 ;共发5次红外光
MOVWF temp_va5
CHECK:
CLRWDT
; CALL DELAY_10MS
CALL DELAY_1MS
CALL DELAY_1MS
CALL DELAY_1MS
CALL DELAY_1MS
BCF PORTB,INFRARED_LED ;发红外光
NOP
NOP
NOP
BSF PORTB,INFRARED_LED ;停发
; CALL DELAY_1MS
CALL DELAY_1MS ;延迟1MS后,检测有没有接收红外光
MOVLW 0x0a
MOVWF temp_va6
NEXT:
MOVF PORTA,W
MOVWF temp_va1
BTFSC temp_va1,0
INCF HIGH_LEVEL_COUNT ;有收到
DECFSZ temp_va6
GOTO NEXT
DECFSZ temp_va5 ;没有,5次发完没?
GOTO CHECK ;5次没发完,继续发
;检测一下电源电压是否正常
; MOVF PORTA,W
; MOVWF temp_va1
; BTFSC temp_va1,1
BTFSC PORTA,1
GOTO VOLATAGE
BCF flag,LOW_V_F ;清除欠压标志
GOTO POWER_OFF
VOLATAGE:
BSF flag,LOW_V_F ;置位欠压标志
; 5次已发完,关闭相应的电源
POWER_OFF
BCF PORTB,MAIN_OP_POWER ;CLOSE MAIN_OP_POWER
BSF PORTB,SUB_OP_POWER ;CLOSE SUB_OP_POWER
;5次已发完,判别有没有检测到人
MOVLW 0x30 ;暂定接收到10次为有感应
SUBWF HIGH_LEVEL_COUNT,W
BTFSC STATUS,C
GOTO LABEL3
BCF flag,INFRARED_F
CLRF HIGH_LEVEL_COUNT
RETLW 00H
LABEL3:
BSF flag,INFRARED_F
CLRF HIGH_LEVEL_COUNT
RETLW 00H
;---------------------------------------------------------------
;--------------------------------------------------------------- MOVF door_stu,w
;------------------------------------------------------
;------------------------------------------------------
LED_PRC:
BTFSC flag,LOW_V_F
GOTO RED_LED_ON ;欠压了,红灯报警
MOVF motor_mode,w
XORLW MM_OPEN
BTFSC STATUS,Z
GOTO GREEN_LED_ON
MOVF motor_mode,w
XORLW MM_DUMMY
BTFSS STATUS,Z
RETLW 00H
GOTO FLASH_RED_LED ;待机时红灯闪烁
GREEN_LED_ON:
BCF PORTB,LED_RED
BSF PORTB,LED_GREEN
GOTO RET_LED_PRC
RED_LED_ON:
BCF PORTB,LED_GREEN
BSF PORTB,LED_RED
GOTO RET_LED_PRC
FLASH_RED_LED:
BCF PORTB,LED_GREEN
DECFSZ fresh_red_time
GOTO ENTER_SLEEP
BTFSS flag,RED_FRESH_F
GOTO FRESH_ON
GOTO FRESH_OFF
FRESH_ON:
MOVLW TM500MS
MOVWF fresh_red_time
BSF PORTB,LED_RED
BSF flag,RED_FRESH_F
GOTO ENTER_SLEEP
FRESH_OFF:
MOVLW TM4S
MOVWF fresh_red_time
BCF PORTB,LED_RED
BCF flag,RED_FRESH_F
ENTER_SLEEP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -