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

📄 card2.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit115200
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit115200
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit115200
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit115200
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit115200

	mov  r7,a		; 保存数据, 不影响C
	clr	STATE_FLAG
	ret

rbRV_err2:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV57600:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next3;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next3;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next3;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next3;等待一个起始位
rbRV_begin3:
	jnb   I_O,rbRV_next3;等待一个起始位
        jb    IC_SW, rbRV_err3
	jnb   I_O,rbRV_next3;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next3;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next3;等待一个起始位
	jz    rbRV_err3
	jnb   I_O,rbRV_next3;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jb    I_O,rbRV_begin3;等待一个起始位

rbRV_next3:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin3		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin3		;2 	21	延时0.25etu 再检起始位 2 19

	call 	D35T			;35 	56
;	call 	D35T			;35 	91
;	call 	D19T			;19 	110
;	call	D12T			;7	117

	clr  a				;1  	118

;;      接收第7位
	call     recv1bit57600
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit57600
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit57600
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit57600

	mov  r7,a		; 保存数据, 不影响C
	clr	STATE_FLAG
	ret

rbRV_err3:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV111600:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next4;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next4;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next4;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next4;等待一个起始位
rbRV_begin4:
	jnb   I_O,rbRV_next4;等待一个起始位
        jb    IC_SW, rbRV_err4
	jnb   I_O,rbRV_next4;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next4;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next4;等待一个起始位
	jz    rbRV_err4
	jnb   I_O,rbRV_next4;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jb    I_O,rbRV_begin4;等待一个起始位

rbRV_next4:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin4		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin4		;2 	21	延时0.25etu 再检起始位 2 19

	call 	D35T			;35 	56
;	call 	D35T			;35 	91
;	call 	D19T			;19 	110
;	call	D12T			;7	117

	clr  a				;1  	118

;;      接收第7位
	call     recv1bit111600
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit111600
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit111600
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit111600

	mov  r7,a		; 保存数据, 不影响C
	clr	STATE_FLAG
	ret

rbRV_err4:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV55930:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next5;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next5;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next5;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next5;等待一个起始位
rbRV_begin5:
	jnb   I_O,rbRV_next5;等待一个起始位
        jb    IC_SW, rbRV_err5
	jnb   I_O,rbRV_next5;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next5;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next5;等待一个起始位
	jz    rbRV_err5
	jnb   I_O,rbRV_next5;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jb    I_O,rbRV_begin5;等待一个起始位

rbRV_next5:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin5		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin5		;2 	21	延时0.25etu 再检起始位 2 19

	call 	D35T			;35 	56
;	call 	D35T			;35 	91
;	call 	D19T			;19 	110
;	call	D12T			;7	117

	clr  a				;1  	118

;;      接收第7位
	call     recv1bit55930
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit55930
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit55930
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit55930

	mov  r7,a		; 保存数据, 不影响C
	clr	STATE_FLAG
	ret

rbRV_err5:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV38400:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next6;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next6;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next6;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next6;等待一个起始位
rbRV_begin6:
	jnb   I_O,rbRV_next6;等待一个起始位
        jb    IC_SW, rbRV_err38400
	jnb   I_O,rbRV_next6;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next6;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next6;等待一个起始位
	jz    rbRV_err38400
	jnb   I_O,rbRV_next6;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jb    I_O,rbRV_begin6;等待一个起始位

rbRV_next6:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin6		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin6		;2 	21	延时0.25etu 再检起始位 2 19

;	call 	D35T			;35 	56
;	call 	D35T			;35 	91
;	call 	D19T			;19 	110
;	call	D12T			;7	117

	clr  a				;1  	118

;;      接收第7位
	call     recv1bit38400
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit38400
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit38400
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit55930

	mov  r7,a    ; 保存数据, 不影响C

        jc   rbRV_38400c1
        jnb   P,rbRV_38400again
        jmp  rbRV_38400ok
rbRV_38400c1:
        jnb  P,rbRV_38400ok
rbRV_38400again:
        jb CPU2_T0_T1,parity38400
	djnz	r2, rbRV_again38400
	jmp	rbRV_err38400
rbRV_err38400:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov  r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rbRV_again38400:
        lcall  D40T
	lcall  D21T

	;//要求重发
	clr	I_O
	lcall D123T
	lcall D123T
	setb	I_O
	jmp  recvbyteRV38400; 重新接收

rbRV_38400ok:
       clr   STATE_FLAG
       ret
parity38400:
       setb    parity_bit
       ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CARD2ATRrecvbyte:
	jnb	reverse, recv9600_atr
	jmp	recvbyteRV
recv9600_atr:
	; 960*D*WI etu
	clr    ET0
	mov    timer0,#0f3h
	jnb   I_O,atr_next;等待一个起始位
	mov    timer0 + 01H,#0dfh
	jnb   I_O,atr_next;等待一个起始位
	setb   ET0
	jnb   I_O,atr_next;等待一个起始位
        jmp   atr_begin
atr_begin:
	jnb   I_O,atr_next;等待一个起始位
        jb    IC_SW, atr_err
	jnb   I_O,atr_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,atr_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,atr_next;等待一个起始位
	jz    atr_err
	jnb   I_O,atr_next;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jb    I_O,atr_begin;等待一个起始位
atr_next:                                        ;//124/2 = 62T
	clr 	ET0				;8C	24
	jb   I_O,atr_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D40T			;480C 520
	jb   I_O,atr_begin	;16C	536	延时0.25etu 再检起始位 2 5
	lcall	D39T			;468C 1004
	lcall	D40T			;480C 1484
	clr  a				;4C	1488



								; 9600bps 1etu=1488C
;;      接收第0位
	lcall     recv1bit9600
	rrc      a
;;      接收第1位
	lcall     recv1bit9600
	rrc      a
;;      接收第2位
	lcall     recv1bit9600
	rrc      a
;;      接收第3位
	lcall     recv1bit9600
	rrc      a
;;      接收第4位
	lcall     recv1bit9600
	rrc      a
;;      接收第5位
	lcall     recv1bit9600
	rrc      a
;;      接收第6位
	lcall     recv1bit9600
	rrc      a
;;      接收第7位
	lcall     recv1bit9600
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit9600

	mov  r7,a		; 保存数据, 不影响C
	mov	a, r7	; 置P,不影响C

	jc	atr_c1
			; c = 0
	jb	P, atr_again	; c=0 & p=1	err
	jmp	atr_ok		; c=0 & p=0	ok

atr_c1:		; c = 1
	jb	P, atr_ok		; c=1 & p=1	ok
					; c=1 & p=0	err

atr_again:
	jmp	atr_err0
atr_err:
	clr  ET0
        setb	I_O
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4 //卡片无应答
;        call    Detu
;        clr     IC_RST
;        clr     I_O
;        setb     CLK_CTR
;        setb    IC_PWR
	ret
atr_ok:
	clr	STATE_FLAG
	ret

atr_err0:
	clr     ET0
        setb	I_O
	setb    STATE_FLAG	;四次重收不成功
	mov	r7, #0ffh;;#define IFD_ICC_TypeError	-1			//卡片类型不对 //奇偶校验错
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CARD2BWTrecvbyte:
        setb I_O
	mov	r2, 0
BWTwaitStopBit:
	jb  I_O,BWTP1recvbyte0;等待停止位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	djnz	r2,BWTwaitStopBit
	jmp rb115200_err1;等待停止位
BWTP1recvbyte0:
	mov	A,bps
	jb	ACC.1,BWTrbyte38400
	jb	ACC.0,BWTrbyte19200
	jmp	BWTrecvbyte9600
BWTrbyte19200:
	jmp  BWTrecvbyte19200
BWTrbyte38400:
	jmp	BWTrecvbyte38400



BWTrecvbyte9600:
        mov     r2,#0
        mov     r5,#0
        mov     r6,#0
	jnb	reverse, BWTrecv960
	jmp	recvbyteRV
BWTrecv960:
        clr     C
        mov     a,BWI
        subb    a,#1
        jz      BWTrecvbyte96T11

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -