📄 gj070613.asm
字号:
DECF DRVCNT,F ;
BTFSC STATUS,Z ;
GOTO QMNOPEN ;最大驱动时间到
GOTO QMOTRUN0 ;
;
BTFSC LOCKZT ;LOCKZT=RA1
GOTO QMOTRUN0 ;
CALL T10MS ;
BTFSC LOCKZT ;
GOTO QMOTRUN0 ;
CALL T10MS ;
BTFSC LOCKZT ;
GOTO QMOTRUN0 ;
;
DJ1OFF
MOVLW LOCKDLY ;锁开延时12秒上锁
MOVWF TEXIT1 ;
MOVLW BP_NN1 ;加载开锁蜂鸣6次
MOVWF BPCNT ;
RETURN ;
QMNOPEN ;最大驱动时间到
DJ1OFF
MOVLW LOCKDLY ;锁开延时12秒上锁
MOVWF TEXIT1 ;
MOVLW BP_NN2 ;加载开锁蜂鸣8次
MOVWF BPCNT ;
RETURN
;**************************************************
;锁延时归位驱动子程序
;**************************************************
LOCK1_CLOSE
MOVF TEXIT1,F
BTFSC ZERO
RETURN ;前锁已归位
QM_NOPEN
DECFSZ TEXIT1,F ;前锁驱动延时减量
RETURN ;驱动延时未到返回
;
MOVLW 0X02 ;电压低延时两秒
MOVWF TEXIT1 ;
BTFSS VCO
RETURN
DJ1_EXIT
CLRF TEXIT1
movlw DRVTIME2 ;电机解锁驱动1.5秒
movwf DRVCNT ;
DJ1_DRB ;电机归位
DJ1_EXIT1
CALL T50MS ;
DECFSZ DRVCNT,F ;
GOTO DJ1_EXIT1
DJ1OFF
RETURN
;**************************************************
;蜂鸣器延时驱动子程序
;**************************************************
BP_CLOSE
MOVF BPCNT,F
BTFSC ZERO
RETURN ;非开锁期间
DECFSZ BPCNT,F ;开锁期间
RETURN ;驱动延时未到返回
BEEP_OFF
RETURN
;**************************************************
;开锁蜂鸣驱动子程序
;**************************************************
OPLOCK_BP ;开锁蜂鸣
MOVF BPCNT,F
BTFSC ZERO
RETURN ;非开锁
;开锁期间蜂鸣
MOVF MSCNT,W
BTFSS ZERO
GOTO BPSTOP
BEEP_ON
RETURN
BPSTOP
MOVLW 0X04 ;蜂鸣200MS
SUBWF MSCNT,W
BTFSS CY
RETURN
;MSCNT>=04
BEEP_OFF ;关闭
RETURN
;*******************************************
T1S
MOVLW 0X0A
MOVWF TIM2
T1S0 CALL T100MS
DECFSZ TIM2,F
GOTO T1S0
RETURN
;*******************************************
T500MS
MOVLW 0X05
MOVWF TIM2
T500MS0 CALL T100MS
DECFSZ TIM2,F
GOTO T500MS0
RETURN
;-----------------------------------------
T200MS
MOVLW 0XC8
MOVWF TIM1
T200MS0 CALL T1MS
DECFSZ TIM1,F
GOTO T200MS0
RETURN
;-----------------------------------------
T100MS
MOVLW 0X64
MOVWF TIM1
T100MS0 CALL T1MS
DECFSZ TIM1,F
GOTO T100MS0
RETURN
;-----------------------------------------
T50MS
MOVLW 0X32
MOVWF TIM1
T50MS0 CALL T1MS
DECFSZ TIM1,F
GOTO T50MS0
RETURN
;-----------------------------------------
T10MS
MOVLW 0X0A
MOVWF TIM1
T10MS0 CALL T1MS
DECFSZ TIM1,F
GOTO T10MS0
RETURN
;-----------------------------------
T1MS ;
MOVLW 0XFA
MOVWF TIM0
T1MS0
NOP
DECFSZ TIM0,F
GOTO T1MS0
RETURN
;-----------------------------------
T100US ;
MOVLW 0X19
MOVWF TIM0
T100US0
NOP
DECFSZ TIM0,F
GOTO T100US0
RETURN
;***********************************************************
INIT690B ;BANK 1
BANKSEL OPTION_REG ;OP_REG:/RABPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
movlw b'01001111' ; 0 1 0 0 1 1 1 1
MOVWF OPTION_REG ;WDT=1:128,RAB弱上拉,INT下降沿触发中断
MOVLW B'00010010' ;Twdt=(1/31KHZ)X16384x128=64s
MOVWF WDTCON ;
BSF PCON,NOT_POR ;
BSF PCON,NOT_BOR ;
BANKSEL PORTA
;
CALL CR_RAM
CALL IO_INIT
CALL T1ME2_INIT
CHG_EN ;使能充电
;----
INT_ENB ;使能T1,C1,引脚变化中断
BANKSEL PIE1
CLRF PIE1
CLRF PIE2
BSF PIE1,TMR2IE ;
MOVLW B'01001000' ;GIE,PEIE,T0IE,INTE,RABIE,T0IF,INTF,RABIF
MOVWF INTCON
BANKSEL PORTA
;
MOVLW 0XFF
MOVWF DEFKEYBUF
MOVWF DEFKEYBUF1
MOVWF DEFKEYBUF2
MOVWF DEFKEYBUF3
MOVWF DEFKEYBUF4
MOVWF DEFKEYBUF5
MOVWF ANSTS
CLRF ANTIM
RETURN
;--------------------------------------------
;I/O口设置
;--------------------------------------------
IO_INIT
BANKSEL WPUA
MOVLW B'00010011' ;RA0,1,4弱上拉
MOVWF WPUA ;RA2,5外部弱下拉
MOVLW B'00000000' ;A无变化中断
MOVWF IOCA
;
BANKSEL WPUB
MOVLW B'11010000' ;RB4,6,7弱上拉
MOVWF WPUB
MOVLW B'10000000' ;RB7变化中断(RING)
MOVWF IOCB
;2bank
MOVLW b'00000000' ;ANS7,6,5,4,3,2,1,0 IS I/O
movwf ANSEL ;
MOVLW b'00000000' ;ANS11,10,9,8 IS I/O
movwf ANSELH ;
;
CLRF PORTA ;A口初始状态
CLRF PORTB ;B口初始状态
CLRF PORTC ;C口初始状态
MOVF PORTA,W ;读A口初始状态
ANDLW 0X03
MOVWF PASTS0 ;
MOVF PORTB,W ;读B口初始状态
RETURN
;--------------------------------------------
;TIME2设置:50MS中断
;--------------------------------------------
T1ME2_INIT
BANKSEL PR2 ;
MOVLW 0XC3 ;
MOVWF PR2 ;T=1X256X195
BANKSEL T2CON ;T2CON=TO3,TO2,TO1,TO0,T2ON,TI1,TI0
MOVLW B'01111111' ;
MOVWF T2CON
RETURN
;----------------------------------------------
;请20-5F
;----------------------------------------------
CR_RAM
movlw 0x20 ;Clear 20-5F
movwf FSR ;
CRRAMLP clrf INDF ;
incf FSR,1 ;
MOVF FSR,W ;
SUBLW 0x60 ;
BTFSS STATUS,Z
goto CRRAMLP ;
RETURN
;----------------------------------------------------------------------
;发送DTBUF中n位(DTCNT)双音频:
;----------------------------------------------------------------------
DTMF_SEND
CHG_INH ;禁止充电
HOOK_UP ;CE=0 ,线路摘机
;BTFSC DTCNT,3 ;DTCNT=01/0A
CALL CARD_BEEP ;刷卡成功提示
SDTMF_LP0
; CALL T100MS ;
MOVF DTADDR,W ;地址指针至FSR
MOVWF FSR
INCF DTADDR,F ;地址指针增量
MOVF INDF,W ;
MOVWF TEMP ;
CALL WR_9200A ;写5位DTMF码
CALL T100MS ;
DECFSZ DTCNT,F
GOTO WR_STOP
;
HOOK_OFF
CALL T50MS ;等待挂机稳定
CLRF MSCNT ;重开定时发送
CLRF T_SEND ;
RETURN ;
WR_STOP
MOVLW 0X1F ;写5位STOP码
MOVWF TEMP ;到9200A
CALL WR_9200A
CALL T100MS ;*** +
GOTO SDTMF_LP0 ;
;----------------------------------------------------------------------
;刷卡成功“嘀”-“嘀”提示:
;----------------------------------------------------------------------
CARD_BEEP
;MOVLW 0X01
;MOVWF DTBUF ;送发送缓冲区
; MOVLW 0X01
; MOVWF DTCNT ;发送码长1
;MOVLW DTBUF ;
;MOVWF DTADDR ; 置DTMF缓冲区首地址
;MOVLW 0XB0
; MOVWF FSR
;MOVLW 0X0B
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X01
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X02
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X03
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X04
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X05
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X06
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X07
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X08
;MOVWF INDF
;INCF FSR,F
;MOVLW 0X0C
;MOVWF INDF
;
;MOVLW 0XB0
; MOVWF DTADDR
;
LED_ON
BEEP_ON
CALL T100MS
BEEP_OFF
CALL T500MS
BEEP_ON
CALL T100MS
BEEP_OFF
CALL T1S
LED_OFF
RETURN
;----------------------------------------------------------------------
;发送一个双音频:TEMP=DTMF CODE
;执行时间:13X5+4=69US
;----------------------------------------------------------------------
WR_9200A
MOVLW 0X05
MOVWF VLCNT
WR_92LP
rrf TEMP,1 ;
bcf MOSI ;
btfsc STATUS,C ;
bsf MOSI ;PORTB=11011011/11011111
bcf SCK ;SCK ViH to ViL
NOP ;
NOP ;
NOP
NOP
bsf SCK ;CK ViL to ViH
decfsz VLCNT,1 ;
goto WR_92LP ;
RETURN ;
;###############################################################
;RF522读卡器程序
;###############################################################
;计算CRCV16函数
; 参数:*PINDATA 输入数据指针 LEN 长度
; *POUTDATA 输出数据指针 次序:crcL,crcH;
CALULATECRC ;18
BANKSEL PORTC
MOVLW DIVIRQREG ;0X05
MOVWF REGADR
MOVLW 0X04
MOVWF MASK
CALL CLEARBITMASK ;清CRCIRQ位
;
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVLW PCD_IDLE ;0X00
MOVWF VALUE
CALL WRITERAWRC ;取消当前执行的命令
;
MOVLW FIFOLEVILREG ;0X0A
MOVWF REGADR
MOVLW 0X80
MOVWF MASK
CALL SETBITMASK ;请FIFO指针
;
MOVLW 0
MOVWF JSQI
LOOPCRC
MOVF PINDATA,W
MOVWF FSR
MOVLW FIFODATAREG ;0X09
MOVWF REGADR
MOVF JSQI,W
ADDWF FSR,F
MOVF INDF,W
MOVWF VALUE
CALL WRITERAWRC ;写字节到FIFODATAREG
;
INCF JSQI,F
MOVF LEN,W
SUBWF JSQI,W
BTFSS STATUS,C ;C=0时,有借位
GOTO LOOPCRC ;未写完
; ;JSQI=len
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVLW PCD_CALCCRC ;0X03
MOVWF VALUE
CALL WRITERAWRC ;命令522计算校验和
;
MOVLW 0XFF
MOVWF JSQI ;
LOOPDO
MOVLW DIVIRQREG ;0X05
MOVWF REGADR
CALL READRAWRC ;
; MOVWF JSQL ;JSQL=x00x0 CRCIRQ 00
ANDLW 0X04
BTFSS STATUS,Z
GOTO CRCEND ;CRCIRQ=1,检验完
;
DECFSZ JSQI,F ;
GOTO LOOPDO ;未到256次
CRCEND ;读2字节检验和
MOVF POUTDATA,W
MOVWF FSR
MOVLW CRCRESULTREGL ;0X22
MOVWF REGADR
CALL READRAWRC
MOVWF INDF
;
INCF FSR,F
MOVLW CRCRESULTREGM ;0X21
MOVWF REGADR
CALL READRAWRC
MOVWF INDF
RETURN
;----------------------------------------------
;读RC632寄存器(地址在REGADR中)返回读出的值在VALUE中
;SCK==RB6,MISO==RB4,MOSI==RC7;
;工作单元:REGADR,UCADDR,VALUE,BJSQ
READRAWRC ;1
BANKSEL TRISC
BCF TRISC,3
BCF TRISC,7
BCF TRISB,6
BCF TRISC,6
BSF TRISB,4
BANKSEL PIR1
;
CLRF VALUE
BCF SCK
NOP
BCF SSEL
MOVF REGADR,W
MOVWF UCADDR
RLF UCADDR,W
ANDLW 0X7E
IORLW 0X80 ;UCADDR=1AAAAAA0
MOVWF UCADDR ;
MOVLW 0X08
MOVWF BJSQ
;写地址
LOOPR1
BCF MOSI ;写地址
BTFSC UCADDR,7
BSF MOSI
MOSI_2
BSF SCK
RLF UCADDR,F
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR1
;读数据
MOVLW 0X08
MOVWF BJSQ
LOOPR2
BSF SCK
;
RLF VALUE,F ;
BCF VALUE,0
BTFSC MISO
BSF VALUE,0
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -