📄 baojing.asm
字号:
MOVLW .20
MOVWF 10H ;2S计数器
BTFSC BUTTON ;判断有无按键操作 =0 跳
RETLW 0 ; =1 无按键操作
CALL DELAY_100MS
BTFSC BUTTON ;消除干扰信号
RETLW 0
CALL FMING ;有键按下鸣一声
BNT_SET1:
CALL DELAY_100MS
BTFSC BUTTON ; =0 有按键操作,判'0'结束
GOTO BNT_SET2 ;2S内抬手,进入"设防/解防"及解除报警
DECFSZ 10H, 0
GOTO BNT_SET1 ;判按键抬手
CALL FMING
CALL FMING
CALL FMING
; CALL REV_SET_DAT ;鸣三声,进入号码设置
RETLW 0
BNT_SET2: ;"设防/解防"及解除报警
DECFSZ DATA_H_93C46, 0
GOTO BNT_SET3 ;解防状态,进入设防状态
CLRF SYS_STATUS ;设防->解除
BCF ZJ_CTRL ;解除报警挂机
BCF CTR_LAMP ;灯灭
BSF INH_9170 ;9170停止工作
BSF CS_93C46 ;93C46停止工作
BCF ZJ_CTRL ;挂机
BSF MING ;关蜂鸣
BSF BUTTON ;设置按钮收零有效
BSF BAOJING ;报警'0'有效
CLRF ADDRESS_93C46 ;93C46 '00'地址内容清零
CLRF DATA_H_93C46
CLRF DATA_L_93C46
BSF PAGE1
CALL WRITE
BCF PAGE1
RETLW 0
BNT_SET3:
CLRF ADDRESS_93C46 ;进入设防
MOVLW 01H
MOVWF DATA_H_93C46 ;设防
CLRF DATA_L_93C46 ;首次设防,写入'0'
BSF PAGE1
CALL WRITE
BCF PAGE1
BCF CTR_LAMP ;灯亮
CALL FMING
RETLW 0
;************************************************************
;名称: WCODE
;功能:写入设置的脉冲号码
;注: 每次写入"号码"+"FFFF","FFFF"=结束,下一个号码写在"FFFF"
; 位置
;************************************************************
WCODE:
; MOV ADDRESS_93C46, 40H
; MOV DATA_H_93C46, 50H
; MOV DATA_L_93C46, #0FFH
; LCALL WRITE
; MOV A, 40H
; INC A
; MOV ADDRESS_93C46, A
; MOV DATA_H_93C46, #0FFH
; MOV DATA_L_93C46, #0FFH
; LCALL WRITE
; MOV R0, 40H
; MOV @R0, 50H
; INC R0
; MOV 40H, R0
; MOV 50H, #00H
RETLW 0
;**************************************************************
;名称: BJ_INIT
;功能: 收到报警延时10S同时接收是否有解除
;**************************************************************
BJ_INIT:
MOVLW 064H ;延时10S同时接收是否有解除
MOVWF DELAY_CNT3
D_10S:
CALL DELAY_100MS
CALL BNT_SET
MOVLW 02H
SUBWF SYS_STATUS, W
BZ D_10S1
GOTO M_LOOP ;报警解除,返回主循环
D_10S1:
DECFSZ DELAY_CNT3,F
GOTO D_10S
;-------------------------------------------------------------
;闪断500MS同时接收是否有解除
BCF ZJ_CTRL ;??*闪断????**********控制挂机
MOVLW 05H
MOVWF DELAY_CNT3
D_500MS:
CALL DELAY_100MS
CALL BNT_SET
MOVLW 02H
SUBWF SYS_STATUS, W
BZ D_500MS1
GOTO M_LOOP ;报警解除,返回主循环
D_500MS1:
DECFSZ DELAY_CNT3,F
GOTO D_500MS
BSF ZJ_CTRL
GOTO SYS_3
;******************************************************************
;名称: SEND_DTMF_DAT
;功能: 发送一组设置好的被叫号码
;******************************************************************
SEND_DTMF_DAT:
NOP
SEND_1:
MOVLW 02H
SUBWF SYS_STATUS, W
BZ SEND_11
GOTO M_LOOP ;报警解除,返回主循环
SEND_11:
CALL READ
MOVF DATA_H_93C46,W ;读出要发送的号码
MOVWF SEND_DAT_9200
MOVLW 0FFH
SUBWF SEND_DAT_9200,W
BNZ SEND_2
GOTO SYS_4 ;号码结束返回
SEND_2:
CALL SEND_DTMF
CALL DELAY_100MS
MOVLW 0FFH
MOVWF SEND_DAT_9200
CALL SEND_DTMF
CALL DELAY_100MS
INCF ADDRESS_93C46,F ;发号地址加1
GOTO SEND_1
;******************************************************************
; 分页处
;******************************************************************
ORG 0200H
BSF PAGE1
;******************************************************************
;名称: 读指令(READ指令)
;功能: 把93C46中ADDRESS_93C46所指向的存储器的数据读到
; DATA_H_93C46(H),DATA_L_93C46(L)
;******************************************************************
READ:
CALL START_93C46
MOVLW 06H ;发送读操作指令
MOVWF DATSEND_93C46
MOVLW 03H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
MOVF ADDRESS_93C46,W ;发送写入地址
MOVWF DATSEND_93C46
MOVLW 06H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
BSF DO_93C46 ;准备读入数据
MOVLW 10H
MOVWF BIT_CNT_93C46
READ1:
BSF SK_93C46 ;产生一个时钟信号
BSF SK_93C46
BCF SK_93C46
BCF SK_93C46
NOP
BTFSC DO_93C46 ;读取DO的信息
GOTO READ2
GOTO READ3
READ2:
SETC
GOTO READ4
READ3:
CLRC
READ4:
RLF DATA_L_93C46, F ;
RLF DATA_H_93C46, F
DECFSZ BIT_CNT_93C46,F
GOTO READ1
CALL STOP_93C46
RETLW 0
;******************************************************************
;名称:START_93C46
;功能:片选93C46做好读/写数据的准备
;******************************************************************
START_93C46:
BSF DO_93C46
BSF DI_93C46
BCF SK_93C46
BSF CS_93C46
BUSY_93C46:
BTFSS DO_93C46 ;查询器件是否繁忙
GOTO BUSY_93C46
BSF SK_93C46
BCF SK_93C46
BCF CS_93C46
BCF SK_93C46
BCF DI_93C46
BSF CS_93C46
RETLW 0
;******************************************************************
;名称:SEND_DATA
;功能:数据发送子程序,把待发送数据DATSEND_93C46的低BIT_SEND_93C46位
; 送到DI上
;******************************************************************
SEND_DATA:
;因为为了使程序容易读懂,前面把要发送的内容直接送给DATSEND_93C46,
;而现在就要把DATSEND_93C46中无用的位去掉,把要发送的内容移到最高位来
MOVF BIT_SEND_93C46, W
MOVWF BIT_CNT_93C46
MOVLW 08H ;计算要移位的个数
MOVWF BIT_CNT_93C46
MOVF BIT_SEND_93C46,W
SUBWF BIT_CNT_93C46,F
MOVF BIT_CNT_93C46,F
BZ SEND_DATA2 ;如果发送的位数为8位,则不用移位,跳转
SEND_DATA1:
RLF DATSEND_93C46,F ;把要送出数据的移到DATSEND_93C46的最高位
DECFSZ BIT_CNT_93C46,F
GOTO SEND_DATA1
SEND_DATA2:
MOVF BIT_SEND_93C46,W
MOVWF BIT_CNT_93C46
SEND_DATA4:
RLF DATSEND_93C46,F
BC SEND_DATA5
BCF DI_93C46 ;发送0码
GOTO SEND_DATA6
SEND_DATA5:
BSF DI_93C46 ;发送1码
NOP
NOP
SEND_DATA6:
BSF SK_93C46
BCF SK_93C46
DECFSZ BIT_CNT_93C46,F
GOTO SEND_DATA4
RETLW 0
;******************************************************************
;名称:写指令(WRITE指令)
;功能:把DATA_H_93C46(H),DATA_L_93C46(L)的数据写到93C46中
; ADDRESS_93C46所指向的存储器中
;******************************************************************
WRITE:
CALL WEN_93C46
CALL START_93C46
MOVLW 05H
MOVWF DATSEND_93C46 ;发送写入操作指令
MOVLW 03H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
MOVF ADDRESS_93C46,W ;发送写入地址
MOVWF DATSEND_93C46
MOVLW 06H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
MOVF DATA_H_93C46,W ;发送写入数据
MOVWF DATSEND_93C46
MOVLW 08H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
MOVF DATA_L_93C46,W
MOVWF DATSEND_93C46
MOVLW 08H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
CALL STOP_93C46
CALL WDS_93C46
RETLW 0
;******************************************************************
;名称:STOP_93C46
;功能:停止对93C46操作
;******************************************************************
STOP_93C46:
BCF SK_93C46
BCF DI_93C46
BCF CS_93C46
BSF DO_93C46
RETLW 0
;******************************************************************
;名称:WEN_93C46(EWEN指令)
;功能:93C46写允许
;******************************************************************
WEN_93C46:
CALL START_93C46
MOVLW 04H
MOVWF DATSEND_93C46 ;发送开始位和写允许操作码,共3位
MOVLW 03H
MOVWF BIT_SEND_93C46
CALL SEND_DATA ;调用发送子程序
MOVLW 30H
MOVWF DATSEND_93C46 ;发送6位的指令操作码
MOVLW 06H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
CALL STOP_93C46
RETLW 0
;******************************************************************
;名称:WDS_93C46(EWDS指令)
;功能:93C46写禁止
;******************************************************************
WDS_93C46:
CALL START_93C46
MOVLW 04H
MOVWF DATSEND_93C46 ;发送开始位和写禁止操作码,共3位
MOVLW 03H
MOVWF BIT_SEND_93C46
CALL SEND_DATA ;调用发送子程序
CLRF DATSEND_93C46 ;发送6位的指令操作码
MOVLW 06H
MOVWF BIT_SEND_93C46
CALL SEND_DATA
CALL STOP_93C46
RETLW 0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -