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

📄 card1.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	djnz	R2, rb38400_again0
	jmp	rb38400_err0
rb38400_again0:
;	lcall  D40T
	lcall  D10T
        lcall  D5T
	;//要求重发
	clr	I_O
        lcall   Detu
        lcall   D5T
	setb	I_O
	jmp  recvbyte384; 重新接收

rb38400_err:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rb38400_ok:
        setb    I_O
	clr	STATE_FLAG
	ret

rb38400_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;四次重发不成功
	mov	r7, #0ffh;//#define IFD_ICC_TypeError	-1			//卡片类型不对
        ret
parity2:
        setb    parity_bit
        ret
;-----------------------------------------------------------------------
recvbyte19200:
        clr    parity_bit
        mov     r2,#5
        jnb	reverse, recvbyte192
	jmp	recvbyteRV19200
recvbyte192:
        jb CPU1_T0_T1,recvbyte192T1
        mov r3,#0feh;0f4h
        mov r4,#0f0h;020h
        jmp recvbyte1920
recvbyte192T1:
        mov r3,#06h
        mov r4,#36h
recvbyte1920:
	jnb   I_O,rb19200_next;等待一个起始位
	clr    ET0
	mov    timer0,r3
	jnb   I_O,rb19200_next;等待一个起始位
	mov    timer0 + 01H,r4
	jnb   I_O,rb19200_next;等待一个起始位
	setb   ET0
	jnb   I_O,rb19200_next;等待一个起始位
rb19200_begin:
	jnb   I_O,rb19200_next;等待一个起始位
	jb    IC_SW, rb19200_err
	jnb   I_O,rb19200_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rb19200_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,rb19200_next;等待一个起始位
	jz    rb19200_err
	jnb   I_O,rb19200_next;等待一个起始位

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

	jb    I_O,rb19200_begin;等待一个起始位
rb19200_next:
	clr 	ET0				;8C	24
	jb   I_O,rb19200_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D27T			;240C 280
	jb   I_O,rb19200_begin	;16C	296	延时0.25etu 再检起始位 2 5
	lcall	D30T		;444C 740
	clr  a				;4C	744
								;19200bps 1etu=744C
;;      接收第0位
	lcall     recv1bit19200
	rrc      a
;;      接收第1位
	lcall     recv1bit19200
	rrc      a
;;      接收第2位
	lcall     recv1bit19200
	rrc      a
;;      接收第3位
	lcall     recv1bit19200
	rrc      a
;;      接收第4位
	lcall     recv1bit19200
	rrc      a
;;      接收第5位
	lcall     recv1bit19200
	rrc      a
;;      接收第6位
	lcall     recv1bit19200
	rrc      a
;;      接收第7位
	lcall     recv1bit19200
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit19200
        mov r7,a
        mov a,r7
        jc  rb19200_c1
        jb P,rb19200_again
        jmp rb19200_ok
rb19200_c1:
         jb P,rb19200_ok
rb19200_again:
        jb CPU1_T0_T1,parity
        djnz r2,rb19200_again0
        jmp rb19200_err0
rb19200_again0:
;        lcall D40T
         lcall D21T
         clr I_O
         lcall  Detu
         lcall  D15T
;         lcall D123T
         setb I_O
         jmp recvbyte192
rb19200_err:
         setb I_O
         clr ET0
         setb STATE_FLAG
         mov r7,#0fch
         ret
rb19200_ok:
         setb   I_o
         clr STATE_FLAG
         ret
rb19200_err0:
         setb I_O
         clr ET0
	 setb STATE_FLAG	;四次重发不成功
	 mov	r7, #0ffh;//#define IFD_ICC_TypeError	-1			//卡片类型不对
         ret
parity:
        setb    parity_bit
        ret
;-----------------------------------------------------------------------
CARD1recvbyte1:
	setb I_O
	mov	r2, 0
WaitStopBit1:
	jb  I_O,recvbyte96_0;等待停止位

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

	djnz	r2,WaitStopBit1
	jmp rb115200_err1;等待停止位

recvbyte96:
	jnb	reverse, recvbyte96_0
	jmp	recvbyteRV

recvbyte96_0:
	jnb   I_O,rb_next;等待一个起始位
	clr    ET0
	mov    timer0,#0
	jnb   I_O,rb_next;等待一个起始位
	mov    timer0 + 1H,#64h		;// 40,000 cycle (4MHz)
	jnb   I_O,rb_next;等待一个起始位
	setb   ET0
	jnb   I_O,rb_next;等待一个起始位
	jmp   rb_begin
rb_next:
        jmp rb_next1
;-----------------------------------------------------------------------

recvbyte9600:
        jnb     I_O,rb_next1;等待一个起始位
        mov     a,WI
	mov	r2, #5
	jnb	reverse, recv9600
	jmp	recvbyteRV
recv9600:
        jnb     I_O,rb_next1
        jb     CPU1_T0_T1,rb_next9600
        jnb     I_O,rb_next1
        mov    r3,#0feh;0f3h
        jnb     I_O,rb_next1
        mov    r4,#0f0h;0ffh
        jnb     I_O,rb_next1
        jmp    recv960
rb_next9600:
        mov    r3,#16h;10h
        jnb     I_O,rb_next1
        mov    r4,#0ffh;0eah  ;EA
recv960:
        jnb   I_O,rb_next1;等待一个起始位
	clr    ET0
	mov    timer0,r3
	jnb   I_O,rb_next1;等待一个起始位
	mov    timer0 + 01H,r4
	jnb   I_O,rb_next1;等待一个起始位
	setb   ET0
	jnb   I_O,rb_next1;等待一个起始位
rb_begin:
	jnb   I_O,rb_next1;等待一个起始位
        jb    IC_SW, rb_err
	jnb   I_O,rb_next1;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rb_next1;等待一个起始位
	orl   a,timer0
	jnb   I_O,rb_next1;等待一个起始位
	jz    rb_err
	jnb   I_O,rb_next1;等待一个起始位

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

	jb    I_O,rb_begin;等待一个起始位
rb_next1:                                        ;//124/2 = 62T
	clr 	ET0				;8C	24
	jb   I_O,rb_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D40T;D40T			;480C 520
	jb   I_O,rb_begin	;16C	536	延时0.25etu 再检起始位 2 5
	lcall	D39T;D39T			;468C 1004
	lcall	D40T;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	rb_c1			; c = 0
	jb	P, rb_again	; c=0 & p=1	err
	jmp	rb_ok		; c=0 & p=0	ok

rb_c1:		; c = 1
	jb	P, rb_ok		; c=1 & p=1	ok
					; c=1 & p=0	err

rb_again:
        jb CPU1_T0_T1,parity1
	djnz	r2, rb_again0
	jmp	rb_err0
rb_again0:
	lcall  D40T
	lcall  D21T

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

rb_err:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rb_ok:
        setb    I_O
	clr	STATE_FLAG
	ret

rb_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;四次重发不成功
	mov	r7, #0ffh;//#define IFD_ICC_TypeError	-1			//卡片类型不对
        ret
parity1:
        setb    parity_bit
        ret
;=======================================================================
;P1口模拟串口发送
;入口参数: R6.R7:delaytime(TC1+12); R5:待发送数据
;出口参数: 正确STATE_FLAG = 0;错误STATE_FLAG = 1;
_CARD1sendbyte:

;9600bps,19200bps,38400bps
sb_loop:
	setb        I_O
	mov	    WDTC, #0a7h
	jnb         I_O,sb_loop

	clr  STATE_FLAG
        jb   TC1_flag,sb_flag
        call D10T
        call Detu
	mov  A,TC1
        mov  R2,A
        jmp   sb_loopDelay
sb_flag:
        jnb CPU1_T0_T1,sb_flag1
        mov  A,TC1
        mov  R2,A
        jmp   sb_loopDelay
sb_flag1:
;       call D30T
;       call D30T
;       call D30T
;       call D10T
        call Detu
	mov  A,TC1
        mov  R2,A
        jmp   sb_loopDelay

;对T0的字符间距处理
sb_loopDelay:
        jz   sb_loop00
sb_loop01:
	call Detu
	djnz R2,sb_loop01
;开始发送字符
sb_loop00:

	mov	r2, #5		;8C				; 最多重发5此[社保要求为4次]
	jnb	reverse, sb_loop0
	jmp	sb_loopRV
sb_loop0:
	mov   a,r7		;4C		data byte

	clr   ET0			;8C

	clr   I_O			;8C		发送起始位
	call  Detu

	rrc  a     		;4C	发送第0位	;1
	mov  I_O,C
	                        ;8C
	call Detu			;2*R0+6

	rrc  a     ;发送第1位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第2位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第3位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第4位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第5位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第6位
	mov  I_O,C
	call Detu

	rrc  a     ;发送第7位
	mov  I_O,C
	call Detu_8

	mov  a,r7    	;4C	发送奇偶位位
	mov  C,P		;8C
	mov  I_O,C	;8C
	call Detu

	nop			;4C
	setb I_O     	;发送停止位
	call Detu

	nop
     			;4C
	; 11 etu	检测I/O线

	jb	I_O, sb_ok
	djnz	r2,sb_again
	jmp     sb_err	; 已发5次
	; 重发
sb_again:
	setb	I_O
	call Detu
	call Detu
	call Detu
	call Detu
	jmp	sb_loop0
sb_err:
	setb STATE_FLAG
	setb	I_O
	ret

sb_ok:
	clr STATE_FLAG
	ret

;========================================================================
;接收1位(9600bps -- 124T)			1488C
	;外部rrc A	4C

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

	lcall	D39T		;

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

	lcall	D19T		;

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

	lcall	D19T		;

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

	lcall	D39T		;
	mov	WDTC, #0a7h	;12c

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 8+19+19+39+39=124T
;-----------------------------------------------------------------------
;接收1位(19200bps -- 62T)		744C
	;外部rrc A	4C

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

	lcall	D18T		;

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

	lcall	D9T		;

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

	lcall	D9T		;

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

	lcall	D17T		;
	mov	WDTC, #0a7h	;12c

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 8+9+9+18+18=62T
;-----------------------------------------------------------------------
;接收1位(38400bps -- 31T)			372C
	;外部rrc A	4C

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

	lcall	D8T		;

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

	lcall	D4T		;

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

	lcall	D4T		;

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

	lcall	D6T		;
	mov	WDTC, #0a7h	;12c

	mov     C,ACC.1 ;8C
	mov     A,R3	;4C
	ret       	;8C	20	24+20+16+16+20=96C=8T
				; 8+4+4+8+7=31T
;-----------------------------------------------------------------------
;接收1位55930bps						255C
	;外部rrc A	4C

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

	lcall	D5T		;

	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

⌨️ 快捷键说明

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