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

📄 card2.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	lcall	D3T		;
	mov	WDTC, #0a7h	;12c
	nop			;4C

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 96+2*12+2*12+5*12+4*12+4=256C
;-----------------------------------------------------------------------
;接收1位(57600bps -- 20.67T)			248C
	;外部rrc A	4C

	;lcall	 	16C	20
recv1bit57600:
	mov     R3,A	;4C	24

	lcall	D4T		;
	nop			;4C

	clr     A 	;4C
	mov     C,I_O	;8C
	addc    A,#0	;8C	20

	lcall	D2T		;

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	lcall	D2T		;

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	lcall	D3T		;
	mov	WDTC, #0a7h	;12c
	nop			;4C

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 96+2*12+2*12+4*12+4+4*12+4=248C
;-----------------------------------------------------------------------
;接收1位(115200bps -- 10.33T)			124C
	;外部rrc A	4C

	;lcall	 	16C	20
recv1bit115200:
	mov     R3,A	;4C	24

	nop			;4C
	nop			;4C
	nop			;4C
	nop			;4C	16

	clr     A 	;4C
	mov     C,I_O	;8C
	addc    A,#0	;8C	20

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	mov	WDTC, #0a7h	;12c

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 96+16+12=124C

;-----------------------------------------------------------------------
;接收1位(111600)							128C
	;外部rrc A	4C

	;lcall	 	16C	20
recv1bit111600:
	mov     R3,A	;4C	24

	nop			;4C
	nop			;4C
	nop			;4C
	nop			;4C	16

	clr     A 	;4C
	mov     C,I_O	;8C
	addc    A,#0	;8C	20

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	mov     C,I_O	;8C
	addc    A,#0	;8C	16

	mov	WDTC, #0a7h	;12c
	nop			;4C	16

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 96+16+16=128C
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

recvbyteRV:
        mov     r2,#5
rbRV_recv9600:
	clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next;等待一个起始位
rbRV_begin:
	jnb   I_O,rbRV_next;等待一个起始位
        jb    IC_SW, rbRV_err
	jnb   I_O,rbRV_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next;等待一个起始位
	jz    rbRV_err
	jnb   I_O,rbRV_next;等待一个起始位

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

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

rbRV_next:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin		;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     recv1bit9600
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit9600
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit9600
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit9600
	mov  r7,a    ; 保存数据, 不影响C

        jc   rbRV_9600c1
        jnb   P,rbRV_9600again
        jmp  rbRV_9600ok
rbRV_9600c1:
        jnb  P,rbRV_9600ok
rbRV_9600again:
        jb CPU2_T0_T1,parity9600
	djnz	r2, rbRV_again9600
	jmp	rbRV_err
rbRV_err:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rbRV_again9600:
        lcall  D40T
	lcall  D21T

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

rbRV_9600ok:
       clr   STATE_FLAG
       ret
parity9600:
       setb    parity_bit
       ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sb_loopRV:

	mov   a,r7;data byte

	clr   ET0

	clr   I_O; 发送起始位
	nop
	call  Detu

	rlc  a     ;发送第7位	;1
	cpl	c
	mov  I_O,C			;2
	call Detu			;2*R0+6

	rlc  a     ;发送第6位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第5位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第4位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第3位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第2位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第1位
	cpl	c
	mov  I_O,C
	call Detu

	rlc  a     ;发送第0位
	cpl	c
	mov  I_O,C
	call Detu

	mov  a,r7    ;发送奇偶位位
	mov  C,P
	cpl	c
	mov  I_O,C
	call Detu

	setb I_O     ;发送停止位
	call Detu

	clr STATE_FLAG
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CARD2ATRrecvbyte1:
	setb I_O
	mov	r2, 0
T1WaitStopBit:
	jb  I_O,T1recvbyte9600;等待停止位

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

	djnz	r2,T1WaitStopBit
	jmp T1rb_err0;等待停止位

T1recvbyte9600:

	jnb	reverse, T1recvbyte9600_0
	jmp	recvbyteRV

T1recvbyte9600_0:
	; 960*D*WI etu
	clr   ET0              ; 减去上一个字节的10个etu
	jnb   I_O,T1rb_next;等待一个起始位
	clr   ET0
	mov   timer0,#02h;   00
	jnb   I_O,T1rb_next;等待一个起始位
	mov    timer0 + 01H,#0b8h    ;55
	jnb   I_O,T1rb_next;等待一个起始位
	setb   ET0
	jnb   I_O,T1rb_next;等待一个起始位
T1rb_begin:
	jnb   I_O,T1rb_next;等待一个起始位
        jb    IC_SW, T1rb_err0
	jnb   I_O,T1rb_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,T1rb_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,T1rb_next;等待一个起始位
	jz    T1rb_err0
	jnb   I_O,T1rb_next;等待一个起始位

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

	jb    I_O,T1rb_begin;等待一个起始位
T1rb_next:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,T1rb_begin		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,T1rb_begin		;2 	21	延时0.25etu 再检起始位 2 19

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

	clr  a				;1  	118

;;      接收第0位
	call     recv1bit9600
	rrc      a
;;      接收第1位
	call     recv1bit9600
	rrc      a
;;      接收第2位
	call     recv1bit9600
	rrc      a
;;      接收第3位
	call     recv1bit9600
	rrc      a
;;      接收第4位
	call     recv1bit9600
	rrc      a
;;      接收第5位
	call     recv1bit9600
	rrc      a
;;      接收第6位
	call     recv1bit9600
	rrc      a
;;      接收第7位
	call     recv1bit9600
	rrc      a
;       接收奇偶位(未比较)
	call     recv1bit9600
	;call D121T;   接收停止位

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

T1rb_ok:
	clr	STATE_FLAG
	ret

T1rb_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;四次重发不成功
	mov	r7, #0ffh;//#define IFD_ICC_TypeError	-1			//卡片类型不对
	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV19200:
        mov     r2,#5
recvbyteRV1920:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next1;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next1;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next1;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next1;等待一个起始位
rbRV_begin1:
	jnb   I_O,rbRV_next1;等待一个起始位
        jb    IC_SW, rbRV_err1
	jnb   I_O,rbRV_next1;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next1;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next1;等待一个起始位
	jz    rbRV_err1
	jnb   I_O,rbRV_next1;等待一个起始位

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

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

rbRV_next1:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin1		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin1		;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     recv1bit19200
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第3位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第2位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第1位
	call     recv1bit19200
	cpl	c
	rlc      a
;;      接收第0位
	call     recv1bit19200
	cpl	c
	rlc      a
;  接收奇偶位(未比较)
	call     recv1bit19200

	mov  r7,a		; 保存数据, 不影响C
        jc  rbRV_c1
        jnb  P, rbRV_err1
        jmp rbRV_19200ok
rbRV_c1:
        jnb   P, rbRV_19200ok
        jb CPU2_T0_T1,parity19200
	djnz	r2, rbRV_again19200
	jmp	rbRV_err1
rbRV_again19200:
        lcall  D40T
	lcall  D21T

	;//要求重发
	clr	I_O
	lcall D42T
        lcall D42T
	setb	I_O
	jmp  recvbyteRV19200; 重新接收
rbRV_err1:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rbRV_19200ok:
       	clr	STATE_FLAG
	ret
parity19200:
        setb    parity_bit
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV115200:
        clr    ET0              ; 减去上一个字节的10个etu
	jnb    I_O,rbRV_next2;等待一个起始位
	clr    ET0
	mov    timer0,#50h;//#27h
	jnb    I_O,rbRV_next2;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,rbRV_next2;等待一个起始位
	setb   ET0
	jnb   I_O,rbRV_next2;等待一个起始位
rbRV_begin2:
	jnb   I_O,rbRV_next2;等待一个起始位
        jb    IC_SW, rbRV_err2
	jnb   I_O,rbRV_next2;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rbRV_next2;等待一个起始位
	orl   a,timer0
	jnb   I_O,rbRV_next2;等待一个起始位
	jz    rbRV_err2
	jnb   I_O,rbRV_next2;等待一个起始位

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

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

rbRV_next2:                                        ;//124/2 = 62T
	clr 	ET0				;1 	3
	call	D7T				;7 	10
	jb   I_O,rbRV_begin2		;2 	12	延时0.25etu 再检起始位 2 10
	call	D7T				;7 	19
	jb   I_O,rbRV_begin2		;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     recv1bit115200
	cpl	 c
	rlc      a
;;      接收第6位
	call     recv1bit115200
	cpl	c
	rlc      a
;;      接收第5位
	call     recv1bit115200
	cpl	c
	rlc      a
;;      接收第4位
	call     recv1bit115200

⌨️ 快捷键说明

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