📄 7816demo4pic.asm
字号:
#include <p16c622.inc>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SAMIO EQU 7
SAMRST EQU 6
CPUIO EQU 5
CPURST EQU 4
DENUM EQU 0X20 ; 延时系数
DENUM1 EQU 0X21 ; 延时系数1
RESENUM EQU 0X22 ; T=0 发送接收错误次数
SCHAR EQU 0X23
FCHAR EQU 0X24
NUMBER EQU 0X25 ; 0-3:复位应答历史个数 4-7:判别TA,TB,TC,TD
NUMM1 EQU 0X26 ; 接收赋值8次
ICFLAG EQU 0X27 ; D0 0:正向 1:反向
; D1 0:T=0协议 1:T=1协议
; D2 0:ICCARD 1:SAM模块
; D6 卡传输的奇偶校验位
; D7 T=0奇偶校验位(MCU计算)
REC_BUF EQU 0X30
SEN_BUF EQU 0X40
SS_CSAM MACRO IOO
LOCAL AAHHH,SZHX1,AAHH1
SZHX1: BTFSS PORTB,IOO ; 读 SAM 模块 /CPU卡 位操作
GOTO AAHHH
MOVLW 0X80
XORWF ICFLAG,1
BSF STATUS,0
RRF SCHAR,1
GOTO AAHH1
AAHHH: BCF STATUS,0
RRF SCHAR,1
NOP
NOP
AAHH1: CALL DE372CLK
DECFSZ NUMM1,1
GOTO SZHX1
BTFSC PORTB,IOO ; 获得卡传输的奇偶校验位
BSF ICFLAG,6
ENDM
;
FF_CSAM MACRO IO1
LOCAL BBJJ,BBJJ1,BZHX1,PPLL,PPLL1
BZHX1: RRF FCHAR,1
BTFSS STATUS,0 ; 发 SAM 模块 /CPU卡 位操作
GOTO BBJJ
BSF PORTB,IO1
MOVLW 0X80
XORWF ICFLAG,1
GOTO BBJJ1
BBJJ: BCF PORTB,IO1
NOP
NOP
BBJJ1: CALL DE372CLK
DECFSZ NUMM1,1
GOTO BZHX1
BTFSC ICFLAG,7
GOTO PPLL
BCF PORTB,IO1 ; 发送校验位
GOTO PPLL1
PPLL: BSF PORTB,IO1
PPLL1: NOP
CALL DE372CLK
NOP
NOP
NOP
BSF PORTB,IO1
ENDM
;
COMMAND MACRO TABL
CALL TABL
MOVWF FCHAR
CALL SECHAR
ENDM
;
ORG 0
GOTO START
;
ORG 0100H
START:
NOP
CALL MINIT
CALL DE372CLK
CALL CDSAMATR
CALL DE200CLK
COMMAND RAMD
COMMAND RAMD+1
COMMAND RAMD+2
COMMAND RAMD+3
COMMAND RAMD+4
NOP
CALL RECHAR
CALL DE200CLK
NOP
COMMAND RAMD+5
COMMAND RAMD+6
CALL DE200CLK
CALL RECHAR
NOP
CALL RECHAR
NOP
NOP
;
RAMD: RETLW 0X00
RETLW 0XA4
RETLW 0X00
RETLW 0X00
RETLW 0X02
RETLW 0X3F
RETLW 0X00
;
MINIT:
MOVLW 0
MOVWF ICFLAG
BSF ICFLAG,2
CALL CPUSAM_DOWN
CALL DE372CLK
CALL DE372CLK
RETURN
CPUSAM_DOWN:
MOVLW B'10101111'
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
BTFSS ICFLAG,2
GOTO CPUDOW
BCF PORTB,SAMRST
RETURN
CPUDOW:
BCF PORTB,CPURST
RETURN
;
CDSAMATR:
NOP ;
MOVLW B'00001111' ;
BSF STATUS,RP0
MOVWF TRISB ;
BCF STATUS,RP0
BTFSS ICFLAG,2
GOTO CPPUU
BSF PORTB,SAMRST
BSF PORTB,SAMIO
GOTO COO1
CPPUU: BSF PORTB,CPURST ; 置CPU卡复位端为'1'
BSF PORTB,CPUIO
COO1: MOVLW B'10101111' ;
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
CALL DE200CLK
CLRW
MOVWF NUMBER ; NUMBER=0 接收复位应答个数
CALL RECHAR
BTFSC STATUS,0 ; 判断接收是否正确
GOTO ICERR
XORLW 0X3B ;
BTFSC STATUS,2 ;
GOTO ZHENG ; 正向(标志)
;
MOVF SCHAR,0
XORLW 0X0C0
BTFSS STATUS,2
GOTO FAN ; 反向(标志)
ICERR: NOP
RETURN
;
ZHENG: BCF ICFLAG,0
GOTO NEXT1
FAN: BSF ICFLAG,0
NEXT1: MOVLW REC_BUF ; T0 SAVE SCHAR+1
MOVWF FSR
CALL RECHAR
BTFSC STATUS,0
GOTO ICERR
MOVWF INDF ;
NEXT3: XORWF NUMBER,1
BTFSC NUMBER,4 ; 复位应答 TA TB TC TD 接收
CALL S_TABC
BTFSC NUMBER,5
CALL S_TABC
BTFSC NUMBER,6
CALL S_TABC
BTFSC NUMBER,7
GOTO S_TD
MOVLW 0X0F
ANDWF NUMBER,1 ; 接收历史字符
NEXT2: CALL S_TABC
DECFSZ NUMBER,1
GOTO NEXT2
RETURN ; 复位应答结束
;
S_TABC: INCF FSR
CALL RECHAR
BTFSC STATUS,0
GOTO ICERR
MOVWF INDF
RETURN
;
S_TD: CALL S_TABC
BTFSS SCHAR,0 ;
GOTO FPROL0
BSF ICFLAG,1 ; 置T=1 标志
FPROL0: ANDLW 0XF0 ; 保留历史字节
GOTO NEXT3
;
;INPUT SCHAR OUTPUT: C--0 OK C--1 ERR
;
RECHAR:
MOVLW 0X02
MOVWF RESENUM
RECHAR1:
MOVLW B'10101111'
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
MOVLW B'00111111' ; 清奇偶校验位 ICFLAG
ANDWF ICFLAG,1
MOVLW 0X65
MOVWF DENUM1
INB2: MOVLW 0X40
MOVWF DENUM
INB1: BTFSC ICFLAG,2 ; 1: 对SAM模块操作
GOTO CZSAM
BTFSS PORTB,CPUIO ; 0: 对CPU卡操作
GOTO GETCHAR
INB3: DECFSZ DENUM,1
GOTO INB1
DECFSZ DENUM1,1
GOTO INB2
BSF STATUS,0
RETURN
CZSAM: BTFSC PORTB,SAMIO
GOTO INB3
;
GETCHAR:NOP
CALL DE372CLK ; 1.5ETU准备采样
CALL DE200CLK
BTFSS ICFLAG,0 ; 正向或反向
GOTO SZHXIN
FANXING: ; 反向
NOP
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;正向读取八位数据;;;;;;;;;;;;;;;;;;;;;;;;;;;
SZHXIN: MOVLW 0X08
MOVWF NUMM1
BTFSS ICFLAG,2 ; 操作SAM 模块
GOTO CARD1
SS_CSAM SAMIO
GOTO TT01
CARD1: SS_CSAM CPUIO
TT01:
BTFSS ICFLAG,1 ; T=1 校验位不比对
GOTO TT00
T0OK: CALL DE200CLK
CALL DE372CLK
BCF STATUS,0 ; C清零,接收正确
MOVF SCHAR,0 ; 接收字符存入W
RETURN
TT00: BTFSC ICFLAG,6 ; 卡传输奇偶位低
GOTO PARI_HIGH
BTFSC ICFLAG,7
GOTO TORERE ; T=0 奇偶位错误,要求重发
GOTO T0OK
PARI_HIGH:
BTFSC ICFLAG,7
GOTO T0OK
;
TORERE: MOVLW B'00001111'
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
CALL DE200CLK
BTFSC ICFLAG,2
GOTO SAMRE ; SAM 模块重发
BCF PORTB,CPUIO
CALL DE372CLK
BSF PORTB,CPUIO ; CPU 卡重发
SAMOK: CALL DE200CLK
DECFSZ RESENUM,1
GOTO RECHAR1
BSF STATUS,0 ; C 置位,操作错误
RETURN
SAMRE: BCF PORTB,SAMIO
CALL DE372CLK
BSF PORTB,SAMIO
GOTO SAMOK
;
DE200CLK: ; 延时0.5ETU
MOVLW 0X0D
MOVWF DENUM
DEDE: DECFSZ DENUM,1
GOTO DEDE
RETURN
DE372CLK: ; 延时1 ETU
MOVLW 0X1B
MOVWF DENUM
DEDE1: DECFSZ DENUM,1
GOTO DEDE1
RETURN
;
;INPUT: FCHAR OUTPUT: C--0 OK C--1 ERR
;
SECHAR:
MOVLW 0X02
MOVWF RESENUM
SECHAR1:
MOVLW B'00001111'
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
MOVLW B'00111111' ; 清奇偶校验位 ICFLAG
ANDWF ICFLAG,1
MOVLW 0X08
MOVWF NUMM1
BTFSC ICFLAG,2
GOTO CZSAM1
BCF PORTB,CPUIO
CALL DE372CLK
NOP
NOP
NOP
FF_CSAM CPUIO
GOTO JUUD
CZSAM1: BCF PORTB,SAMIO
CALL DE372CLK
NOP
NOP
NOP
FF_CSAM SAMIO
JUUD:
BTFSC ICFLAG,1
GOTO T11SE ; T=1 直接返回
MOVLW B'10101111'
BSF STATUS,RP0
MOVWF TRISB
BCF STATUS,RP0
CALL DE200CLK
BTFSC ICFLAG,2
GOTO SSAA
BTFSC PORTB,CPUIO
GOTO SENDOK
SSAA1:
CALL DE372CLK
MOVLW B'00001111'
BSF STATUS,RP0
MOVWF TRISB ; T=0 重新发送
BCF STATUS,RP0
CALL DE372CLK
DECFSZ RESENUM,1
GOTO SECHAR1
BSF STATUS,0
RETURN
SSAA:
BTFSC PORTB,SAMIO
GOTO SENDOK
GOTO SSAA1
T11SE:
CALL DE372CLK
SENDOK: CALL DE372CLK
CALL DE200CLK
BCF STATUS,0
RETURN
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -