⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7816demo4pic.asm

📁 CPU卡7816协议读卡DEMO
💻 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 + -