📄 gj0420.asm
字号:
CRRAMLP clrf INDF ;
incf FSR,1 ;
MOVF FSR,W ;
SUBLW 0x60 ;
BTFSS STATUS,Z
goto CRRAMLP ;
RETURN
;*******************************************************************
;SEND DTMF ROUTINE
;*******************************************************************
;DTMF_D ;H-door on
; movlw 0x0d ;Send "A"=01101", H-door is on
; movwf TEMP ;
; CALL WR_9200A ;
; RETURN
;---------------------------------------;
;DTMF_E ;Q-door on
; movlw 0x0e ;Send "b"=01110", Q-door is on
; movwf TEMP ;
; CALL WR_9200A ;
; RETURN
;---------------------------------------;
;DTMF_F ;H-door and Qdoor on
; movlw 0x0f ;Send "c"=01111", doors are on
; movwf TEMP ;
; CALL WR_9200A ;
; RETURN ;
;---------------------------------------;
;DTMF_0 ;Off door
; clrf TEMP ;Send "D"=00000", door is off
; CALL WR_9200A ;
; RETURN
;----------------------------------------------------------------------
;发送DTBUF中n位(DTCNT)双音频:
;----------------------------------------------------------------------
DTMF_SEND
BANKSEL PIR1
MOVF DTCNT,F ;
BTFSC STATUS,Z
RETURN ;发送长度0
;
CHG_INH ;禁止充电
;
BANKSEL TRISB ;RC3,RC7,RB6 IS OUTPUT
BCF TRISB,6 ;
BCF TRISC,7 ;
BCF TRISC,3 ;
BANKSEL PIR1
BSF SCK ;SCK=1
BCF MOSI
BCF HT92_CE ;CE=0 ,线路摘机
CALL T100MS ;
SDTMF_LP0
MOVF DTADDR,W ;地址指针至FSR
MOVWF FSR
INCF DTADDR,F ;地址指针增量
MOVF INDF,W ;
MOVWF TEMP ;
;
CALL WR_9200A ;写5位DTMF码
CLRWDT
; CALL T1S
; CALL T200MS ;到9200A
CALL T100MS ;!!!!!!!T100MS不行,分不开8888 8888
CALL T100MS ;添加????????
;
DECFSZ DTCNT,F
GOTO SDTMF_LP0 ;
;
MOVLW 0X1F ;写5位STOP码
MOVWF TEMP ;到9200A
CALL WR_9200A
;
BSF HT92_CE ;禁止9200A
BCF MOSI ;Let PB2=DATA=0
BANKSEL TRISB
BSF TRISC,3 ;CE=1,挂机
BSF TRISB,6 ;SCK=1
BSF TRISC,7 ;
BANKSEL PORTA
;
CALL T50MS ;等待挂机稳定
;
CLRF MSCNT ;重开定时发送
CLRF T_SEND ;
;
;** BANKSEL CM1CON0
;** MOVF CM1CON0,W ;消除自动发送DTMF
;** BANKSEL PORTA
;** BCF C1IF ;产生的摘,挂机中断
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读卡器程序
;###############################################################
;CRC16函数
; 参数:*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
;----------------------------------------------
;读RC522寄存器(地址在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
BSF TRISB,4
BCF TRISC,6
BANKSEL PIR1
;
CLRF VALUE
BCF SCK
NOP
BCF SS
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
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR2
;
BSF SS
NOP
BSF SCK
MOVF VALUE,W
RETURN
;-----------------------------------------------
;写RC522寄存器:入口,地址在REGADR中,数据在VALUE中)
;工作单元:REGADR,UCADDR,BJSQ(Bottom 计数器)
WRITERAWRC ;2
BANKSEL TRISC
BCF TRISC,3
BCF TRISC,7
BCF TRISB,6
BSF TRISB,4
BCF TRISC,6
BANKSEL PIR1
;
BCF SCK
NOP
BCF SS
MOVF REGADR,W
MOVWF UCADDR
RLF UCADDR,W
ANDLW 0X7E
MOVWF UCADDR ;UCADDR=0AAAAAA0
MOVLW 0X08
MOVWF BJSQ
LOOPR10
BCF MOSI ;写地址
BTFSC UCADDR,7
BSF MOSI
;
BSF SCK
RLF UCADDR,F
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR10
;写数据
MOVLW 0X08
MOVWF BJSQ
LOOPR20
BCF MOSI
BTFSC VALUE,7
BSF MOSI
MOSI_21 BSF SCK
RLF VALUE,F
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR20
;
BSF SS
NOP
BSF SCK
RETURN
;----------------------------------------------
;置 RC522寄存器 位 ;
;参数:REGADR:寄存器地址
; MASK:置位值;
;----------------------------------------------
SETBITMASK ;4
CALL READRAWRC ;读寄存器
MOVWF VALUE
MOVF MASK,W ;值修改
IORWF VALUE,F
CALL WRITERAWRC ;写寄存器
RETURN
;---------------------------------------------
;清 RC522寄存器 位
; 参数:REG:寄存器地址
; MASK:置位值;
;---------------------------------------------
CLEARBITMASK ;5
CALL READRAWRC ;读寄存器
MOVWF VALUE
COMF MASK,W
ANDWF VALUE,F ;值修改
CALL WRITERAWRC ;写寄存器
RETURN
;---------------------------------------------
;开启天线,每次开启或关闭之间应至少有1MS间隔!
;工作单元: TEMPA;
PCDANTENNAON ;
MOVLW TXCONTROLREG ;0X14: INVT2RF INVT1RF INVTX2RF INVTX1RF TX2CW 0 TX2RFEN TX1RFEN
MOVWF REGADR
CALL READRAWRC
MOVWF TEMPA
MOVLW 0X03
ANDWF TEMPA,W
BTFSS STATUS,Z ;TX2RFEN,TX1RFEN=11?
RETURN ;
MOVLW 0X03 ;
MOVWF MASK
MOVLW TXCONTROLREG ;0X14
MOVWF REGADR ;
CALL SETBITMASK ;TX2RFEN,TX1RFEN=11
RETURN
;----------------------------------------------
;关闭天线,每次开启或关闭之间应至少有1MS间隔!
PCDANTENNAOFF ;7
MOVLW TXCONTROLREG ;0X14: INVT2RF INVT1RF INVTX2RF INVTX1RF TX2CW 0 TX2RFEN TX1RFEN
MOVWF REGADR
MOVLW 0X03
MOVWF MASK
CALL CLEARBITMASK
RETURN
;-----------------------------------------------
;通过RC522和ISO14443卡通讯
;参数: COMMAND:RC522命令字,输入
; PINDATA:通过RC522发送到卡的数据,输入,开始地址PINDATA
; INLENBYTE:发送数据的字节长度,输入
; POUTDATA:接收到的卡片返回数据,输出
; POUTLENBIT:返回数据的长度
;------------------------------------------------
PCDCOMF522 ;9
MOVLW MI_ERR ;0XFE
MOVWF KA_STATUS
CLRF IRQEN
CLRF WAITFOR
MOVF COMMAND,W
;
XORLW PCD_AUTHENT ;0X0E
BTFSC STATUS,Z
GOTO YZMIMA
;
MOVF COMMAND,W
XORLW PCD_TRANSCEIVE ;0X0C
BTFSC STATUS,Z
GOTO TRANSCEIVE
GOTO NEXTA
;
YZMIMA MOVLW 0X12 ;验证密钥
MOVWF IRQEN
MOVLW 0X10
MOVWF WAITFOR
GOTO NEXTA ;???????????????
;
TRANSCEIVE MOVLW 0X77 ;发并收
MOVWF IRQEN
MOVLW 0X30
MOVWF WAITFOR
NEXTA
MOVLW COMIENREG ;0X02
MOVWF REGADR
MOVLW 0X80 ;ENABLE INTERRUPT
IORWF IRQEN,W
MOVWF VALUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -