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

📄 card2.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
📖 第 1 页 / 共 5 页
字号:

;	$XREF DEBUG SYMBOLS
;        NAME    withCard2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROG	SEGMENT	CODE
;BITVAR	SEGMENT	BIT

	public   	CARD2recvbyte
	public   	CARD2recvbyte1
	public   	_CARD2sendbyte
        public          CARD2ATRrecvbyte1 ;ATR接收第一个字节
        public          CARD2ATRrecvbyte;ATR接收字节
        public          CARD2BWTrecvbyte ;块等待时间接收字符

	EXTRN   	CODE(Detu)
	EXTRN   	CODE(Detu_8)
	EXTRN   	CODE(D123T)
	EXTRN   	CODE(D122T)
	EXTRN   	CODE(D121T)
	EXTRN   	CODE(D42T)
	EXTRN   	CODE(D41T)
	EXTRN   	CODE(D40T)
	EXTRN   	CODE(D39T)
	EXTRN   	CODE(D38T)
	EXTRN   	CODE(D37T)
	EXTRN   	CODE(D36T)
	EXTRN   	CODE(D35T)
	EXTRN   	CODE(D34T)
	EXTRN   	CODE(D33T)
	EXTRN   	CODE(D32T)
	EXTRN   	CODE(D31T)
	EXTRN   	CODE(D30T)
	EXTRN   	CODE(D29T)
	EXTRN   	CODE(D28T)
	EXTRN   	CODE(D27T)
	EXTRN   	CODE(D26T)
	EXTRN   	CODE(D25T)
	EXTRN   	CODE(D24T)
	EXTRN   	CODE(D23T)
	EXTRN   	CODE(D22T)
	EXTRN   	CODE(D21T)
	EXTRN   	CODE(D20T)
	EXTRN   	CODE(D19T)
	EXTRN   	CODE(D18T)
	EXTRN   	CODE(D17T)
	EXTRN   	CODE(D16T)
	EXTRN   	CODE(D15T)
	EXTRN   	CODE(D14T)
	EXTRN   	CODE(D13T)
	EXTRN   	CODE(D12T)
	EXTRN   	CODE(D11T)
	EXTRN   	CODE(D10T)
	EXTRN   	CODE(D9T)
	EXTRN   	CODE(D8T)
	EXTRN   	CODE(D7T)
	EXTRN   	CODE(D6T)
	EXTRN   	CODE(D5T)
	EXTRN   	CODE(D4T)
	EXTRN   	CODE(D3T)
	EXTRN   	CODE(D2T)

	EXTRN   	BIT(STATE_FLAG)
        EXTRN		BIT(reverse)
        EXTRN           BIT(CPU2_T0_T1)
        EXTRN           BIT(parity_bit)
        EXTRN           BIT(TC1_flag)


	EXTRN	DATA(TC1)
	EXTRN	DATA(WI)
	EXTRN	DATA(bps)
	EXTRN	DATA(timer0)
	EXTRN	DATA(pointer)
        EXTRN   DATA(BWI)
        EXTRN   DATA(timer1)
        EXTRN   DATA(WTX)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	I_O		equ   	P1.6		//CARD2
	IC_SW	equ   	P1.7		//CARD2
        IC_RST  equ     P1.5
        IC_PWR  equ     P1.4
        CLK_CTR equ     P3.7
	WDTC     	equ		09fh

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	RSEG	       PROG

;-----------------------------------------------------------------------
;p1口模拟串口通讯: 一个起始位, 八个数据位, 一个奇偶位, 一个停止位
;入口参数: R6.R7: delaytime(960*WI*DD)
;出口参数: 正确 STATE_FLAG = 0, 错误 STATE_FLAG = 1;R7:数据, P:奇偶位
;CPU card
CARD2recvbyte:
	setb I_O
	mov	r2, 0
WaitStopBit:
	jb  I_O,P1recvbyte0;等待停止位

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

	djnz	r2,WaitStopBit
	jmp rb115200_err1;等待停止位
;TT:
;	jnb	reverse, P1recvbyte0
;	jmp	recvbyteRV

P1recvbyte0:
	mov	A,bps
	jb	ACC.3,recvbyte115200
	jb	ACC.4,rbyte111600
	jb	ACC.2,rbyte57600
	jb	ACC.5,rbyte55930
	jb	ACC.1,rbyte38400
	jb	ACC.0,rbyte19200
        jmp	recvbyte9600
rbyte19200:
	jmp  recvbyte19200
rbyte38400:
	jmp	recvbyte38400
rbyte55930:
	jmp  recvbyte55930
rbyte57600:
	jmp  recvbyte57600
rbyte111600:
	jmp  recvbyte111600
;-----------------------------------------------------------------------
recvbyte115200:
;	mov	r2, #4
	jnb	reverse, recvbyte1152
	jmp	recvbyteRV115200
recvbyte1152:						;9600etu=9600*10.33=99168T
	jnb   I_O,rb115200_next;等待一个起始位            ;//595200us
	mov   R2, #50h
	jnb   I_O,rb115200_next;等待一个起始位
	mov   R3, #5                         ;//30 s
	jnb   I_O,rb115200_next;等待一个起始位
	mov   R4, #40h
	jnb   I_O,rb115200_next;等待一个起始位
rb115200_begin:
	jnb   I_O,rb115200_next;等待一个起始位 	2
	jb    IC_SW, rb115200_err1
	jnb   I_O,rb115200_next;等待一个起始位 	2

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

	jnb   I_O,rb115200_next;等待一个起始位 	2
	djnz	 R2,rb115200_begin;			2 4*256=1024
	jnb   I_O,rb115200_next;等待一个起始位 	2
	djnz	 R4,rb115200_begin;			2 4*256=1024
	jnb   I_O,rb115200_next;16C		等待一个起始位	2
	djnz	 R3,rb115200_begin;			2 1028*97=99716
	jmp    rb115200_err1
rb115200_next:
	clr 	ET0				;8C	24
	jb   I_O,rb115200_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D2T			;24C	64
	jb   I_O,rb115200_begin	;16C	80	延时0.25etu 再检起始位 2 5
	lcall	D3T			;36C	116
	nop					;4C	120
	clr  a				;4C	124
										;115200bps 1etu = 124C
;;      接收第0位
	lcall     recv1bit115200
	rrc      a			;4c
;;      接收第1位
	lcall     recv1bit115200
	rrc      a
;;      接收第2位
	lcall     recv1bit115200
	rrc      a
;;      接收第3位
	lcall     recv1bit115200
	rrc      a
;;      接收第4位
	lcall     recv1bit115200
	rrc      a
;;      接收第5位
	lcall     recv1bit115200
	rrc      a
;;      接收第6位
	lcall     recv1bit115200
	rrc      a
;;      接收第7位
	lcall     recv1bit115200
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit115200
     	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	clr  STATE_FLAG
;           call Detu;   接收停止位
;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
	mov  r7,a;   保存数据
	ret
rb115200_err1:
rb115200_err:
rb115200_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;-----------------------------------------------------------------------
recvbyte111600:
        jnb	reverse, recvbyte1116
	jmp	recvbyteRV111600
recvbyte1116:						;9600etu=9600*10.33=99168T
	jnb   I_O,rb111600_next;等待一个起始位
	mov   R2, #50h
	jnb   I_O,rb111600_next;等待一个起始位
	mov   R3, #5                         ;//30 s
	jnb   I_O,rb111600_next;等待一个起始位
	mov   R4, #40h
	jnb   I_O,rb111600_next;等待一个起始位
rb111600_begin:
	jnb   I_O,rb111600_next;等待一个起始位 	2
	jb    IC_SW, rb111600_err1
	jnb   I_O,rb111600_next;等待一个起始位 	2

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

	jnb   I_O,rb111600_next;等待一个起始位 	2
	djnz	 R2,rb111600_begin;			2 4*256=1024
	jnb   I_O,rb111600_next;等待一个起始位 	2
	djnz	 R4,rb111600_begin;			2 4*256=1024
	jnb   I_O,rb111600_next;等待一个起始位	2
	djnz	 R3,rb111600_begin;			2 1028*97=99716
	jmp    rb111600_err1
rb111600_next:
	clr 	ET0				;8C	24
	jb   I_O,rb111600_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D2T			;24C	64
	jb   I_O,rb111600_begin	;16C	80	延时0.25etu 再检起始位 2 5
	lcall	D3T			;36C	116
	nop					;4C	120
	nop					;4C	124
	clr  a				;4C	128
									;111600bps 1etu=128C
;;      接收第0位
	lcall     recv1bit111600
	rrc      a			;4C
;;      接收第1位
	lcall     recv1bit111600
	rrc      a
;;      接收第2位
	lcall     recv1bit111600
	rrc      a
;;      接收第3位
	lcall     recv1bit111600
	rrc      a
;;      接收第4位
        nop                                     ; 1 etu  = 10.33T  实际只有10T  此处不1T
	lcall     recv1bit111600
	rrc      a
;;      接收第5位
	lcall     recv1bit111600
	rrc      a
;;      接收第6位
	lcall     recv1bit111600
	rrc      a
;;      接收第7位
	lcall     recv1bit111600
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit111600

	clr  STATE_FLAG
;;           call etu05;   接收停止位
;;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
	 mov  r7,a;   保存数据
	 ret
rb111600_err1:
rb111600_err:
rb111600_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
;-----------------------------------------------------------------------
recvbyte57600:
        jnb	reverse, recvbyte576
	jmp	recvbyteRV57600
recvbyte576:						;9600etu=9600*21=201600T
	jnb   I_O,rb57600_next;等待一个起始位          ;//1190400
	mov   R2, #0
	jnb   I_O,rb57600_next;等待一个起始位
	mov   R3, #5                        ;//30 s
	jnb   I_O,rb57600_next;等待一个起始位
	mov   R4, #70h
	jnb   I_O,rb57600_next;等待一个起始位
rb57600_begin:
	jnb   I_O,rb57600_next;等待一个起始位  	2
	jb    IC_SW, rb57600_err1
	jnb   I_O,rb57600_next;等待一个起始位  	2

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

	jnb   I_O,rb57600_next;等待一个起始位  	2
	djnz	 R2,rb57600_begin;			2 4*256=1024
	jnb   I_O,rb57600_next;等待一个起始位  	2
	djnz	 R4,rb57600_begin;			2 4*256=1024
	jnb   I_O,rb57600_next;等待一个起始位	2
	djnz  R3,rb57600_begin;			2 1028*197=202516
	jmp    rb57600_err1
rb57600_next:
	clr 	ET0				;8C	24
	jb   I_O,rb57600_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D6T			;72C	112
	jb   I_O,rb57600_begin	;16C	128	延时0.25etu 再检起始位 2 5
	lcall	D9T			;108C 236
	nop					;4C	240
	nop					;4C	244
	clr  a				;4C	248
								;57600bps 1etu=248
;;      接收第0位
	lcall     recv1bit57600
	rrc      a
;;      接收第1位
	lcall     recv1bit57600
	rrc      a
;;      接收第2位
	lcall     recv1bit57600
	rrc      a
;;      接收第3位
	lcall     recv1bit57600
	rrc      a
;;      接收第4位
	lcall     recv1bit57600
	rrc      a
;;      接收第5位
	lcall     recv1bit57600
	rrc      a
;;      接收第6位
	lcall     recv1bit57600
	rrc      a
;;      接收第7位
	lcall     recv1bit57600
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit57600
	clr  STATE_FLAG
;;           call etu05;   接收停止位
;;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
	jmp  rb57600_end;不接收停止位 20010728
rb57600_err:
rb57600_err0:
rb57600_err1:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rb57600_end:
	mov  r7,a;   保存数据
	ret
;-----------------------------------------------------------------------
recvbyte55930:
        jnb	reverse, recvbyte5593
	jmp	recvbyteRV55930
recvbyte5593:						;9600etu=9600*21=201600T
	jnb   I_O,rb55930_next;等待一个起始位          ;//1190400
	mov   R2, #0
	jnb   I_O,rb55930_next;等待一个起始位
	mov   R3, #5                        ;//30 s
	jnb   I_O,rb55930_next;等待一个起始位
	mov   R4, #70h
	jnb   I_O,rb55930_next;等待一个起始位
rb55930_begin:
	jnb   I_O,rb55930_next;等待一个起始位  	2
	jb    IC_SW, rb55930_err1
	jnb   I_O,rb55930_next;等待一个起始位  	2

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

	jnb   I_O,rb55930_next;等待一个起始位  	2
	djnz	 R2,rb55930_begin;			2 4*256=1024
	jnb   I_O,rb55930_next;等待一个起始位  	2
	djnz	 R4,rb55930_begin;			2 4*256=1024
	jnb   I_O,rb55930_next;等待一个起始位	2
	djnz  R3,rb55930_begin;			2 1028*197=202516
	jmp    rb55930_err1
rb55930_next:
	clr 	ET0				;8C	24
	jb   I_O,rb55930_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D6T			;72C	112
	jb   I_O,rb55930_begin	;16C	128	延时0.25etu 再检起始位 2 5
	lcall	D10T			;120C 248
	nop					;4C	252
	clr  a				;4C	256
								;55930bps 1etu=255
;;      接收第0位
	lcall     recv1bit55930
	rrc      a
;;      接收第1位
	lcall     recv1bit55930
	rrc      a
;;      接收第2位
	lcall     recv1bit55930
	rrc      a
;;      接收第3位
	lcall     recv1bit55930
	rrc      a
;;      接收第4位
	lcall     recv1bit55930
	rrc      a
;;      接收第5位
	lcall     recv1bit55930
	rrc      a
;;      接收第6位
	lcall     recv1bit55930
	rrc      a
;;      接收第7位
	lcall     recv1bit55930
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit55930
	clr  STATE_FLAG
;;           call etu05;   接收停止位
;;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
	jmp  rb55930_end;不接收停止位 20010728
rb55930_err:
rb55930_err0:
rb55930_err1:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
rb55930_end:
	mov  r7,a;   保存数据
	ret
;-----------------------------------------------------------------------
recvbyte38400:
        jnb   I_O,rb38400_next;等待一个起始位
        mov R2,#5
        jnb	reverse, recvbyte384
	jmp	recvbyteRV38400
recvbyte384:
        jb CPU2_T0_T1,recvbyte39400T1
        jnb   I_O,rb38400_next;等待一个起始位
        mov r3,#0feh;0f4h
        jnb   I_O,rb38400_next;等待一个起始位
        mov r4,#0a0h;20h
        jnb   I_O,rb38400_next;等待一个起始位
        jmp recvbyte3840
recvbyte39400T1:
        jnb   I_O,rb38400_next;等待一个起始位
       	mov r3,#27h
        jnb   I_O,rb38400_next;等待一个起始位
        mov r4,#10h
recvbyte3840:
        jnb   I_O,rb38400_next;等待一个起始位
	clr    ET0
	mov    timer0,r3
	jnb   I_O,rb38400_next;等待一个起始位
	mov    timer0 + 01H,r4
	jnb   I_O,rb38400_next;等待一个起始位
	setb   ET0
	jnb   I_O,rb38400_next;等待一个起始位
rb38400_begin:
	jnb   I_O,rb38400_next;等待一个起始位
	jb    IC_SW, rb38400_err
	jnb   I_O,rb38400_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,rb38400_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,rb38400_next;等待一个起始位
	jz    rb38400_err
	jnb   I_O,rb38400_next;等待一个起始位

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

	jb    I_O,rb38400_begin;等待一个起始位
rb38400_next:
	clr 	ET0				;8C	24
	jb   I_O,rb38400_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D7T;D8T			;120C 160
	jb   I_O,rb38400_begin	;16C	176	延时0.25etu 再检起始位 2 5
	lcall	D7T;D8T			;192C 368
	clr  a				;4C	372
								; 38400bps 1etu=372C
;;      接收第0位
	lcall     recv1bit38400
	rrc      a
;;      接收第1位
	lcall     recv1bit38400
	rrc      a
;;      接收第2位
	lcall     recv1bit38400
	rrc      a
;;      接收第3位
	lcall     recv1bit38400
	rrc      a
;;      接收第4位
	lcall     recv1bit38400
	rrc      a
;;      接收第5位
	lcall     recv1bit38400
	rrc      a
;;      接收第6位
	lcall     recv1bit38400
	rrc      a
;;      接收第7位
	lcall     recv1bit38400
	rrc      a
;       接收奇偶位(未比较)
	lcall     recv1bit38400
	mov  r7,a		; 保存数据, 不影响C
	mov	a, r7	; 置P,不影响C

	jc	rb38400_c1			; c = 0
	jb	P, rb38400_again	; c=0 & p=1	err
	jmp	rb38400_ok		; c=0 & p=0	ok

rb38400_c1:		; c = 1
	jb	P, rb38400_ok		; c=1 & p=1	ok
					; c=1 & p=0	err

rb38400_again:
        jb CPU2_T0_T1,parity2
	djnz	R2, rb38400_again0

⌨️ 快捷键说明

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