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

📄 sam2.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
字号:

;	$XREF DEBUG SYMBOLS
;        NAME    withSAM1

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

	public   SAM2recvbyte
	public   SAM2recvbyte1
	public   _SAM2sendbyte

	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	DATA(timer0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	I_O		equ		P3.3		//SAM2
     WDTC		equ		09fh

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	RSEG	       PROG
;-----------------------------------------------------------------------
;p1口模拟串口通讯: 一个起始位, 八个数据位, 一个奇偶位, 一个停止位
;入口参数: R6.R7: delaytime(960*WI*DD) 9600etu (1s = 10000*100us = 2710h * 100us)
;出口参数: 正确 STATE_FLAG = 0, 错误 STATE_FLAG = 1;R7:数据, P:奇偶位

;-----------------------------------------------------------------------
SAM2recvbyte1:

	mov	r2,0
WaitSAM:
	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
	jb  I_O,SAMrecvbyte0;等待停止位
	djnz	r2, WaitSAM
	jnb I_O,SAMrb_err1;等待停止位

SAMrecvbyte0:
	jnb   I_O,toSAMrb_next;等待一个起始位
	clr    ET0
	jnb   I_O,toSAMrb_next;等待一个起始位
	mov    timer0,#0h
	jnb   I_O,toSAMrb_next;等待一个起始位
	mov    timer0 + 01H,#64h
	jnb   I_O,toSAMrb_next;等待一个起始位
	setb   ET0
	jnb   I_O,toSAMrb_next;等待一个起始位
	jmp	SAMrb_begin
toSAMrb_next:
	jmp	SAMrb_next
;------------------------------
SAMrb_err1:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;超时错
	mov	r7, #0fch;//#define IFD_ICC_NoResponse	-4			//卡片无应答
	ret
SAMrb_err0:
	setb	I_O
	clr  ET0
	setb STATE_FLAG	;四次重发不成功
	mov	r7, #0ffh;//#define IFD_ICC_TypeError	-1			//卡片类型不对
	ret
;=======================================================================
SAM2recvbyte:
	setb I_O
	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	mov	r2, #4
recvsamagain:
	mov	a, r2
	mov	r3, a

	mov	r2,0
WaitSAM1:
	jb  I_O,SAMrecvbyte00;等待停止位
	djnz	r2, WaitSAM1
	jnb I_O,SAMrb_err1;等待停止位

	mov	a, r3
	mov	r2, a
	
SAMrecvbyte00:
	jnb   I_O,SAMrb_next;等待一个起始位
	clr    ET0
	jnb   I_O,SAMrb_next;等待一个起始位
	mov    timer0,#27h
	jnb   I_O,SAMrb_next;等待一个起始位
	mov    timer0 + 01H,#10h
	jnb   I_O,SAMrb_next;等待一个起始位
	setb   ET0
	jnb   I_O,SAMrb_next;等待一个起始位
SAMrb_begin:
	jnb   I_O,SAMrb_next;等待一个起始位
	mov   a,timer0 + 01H
	jnb   I_O,SAMrb_next;等待一个起始位
	orl   a,timer0
	jnb   I_O,SAMrb_next;等待一个起始位
	jz    SAMrb_err1
	jnb   I_O,SAMrb_next;等待一个起始位

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

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

SAMrb_next:
	clr 	ET0				;8C	24
	jb   I_O,SAMrb_begin	;16C	40	延时0.25etu 再检起始位 2 3
	lcall	D40T			;480C 520
	jb   I_O,SAMrb_begin	;16C	536	延时0.25etu 再检起始位 2 5
	lcall	D39T			;468C 1004
	lcall	D40T			;480C 1484
	clr  a				;4C	1488
								; 9600bps 1etu=1488C

;;      接收第0位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第1位
	lcall     SAMrecv1bit
	rrc      a			;1
;;      接收第2位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第3位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第4位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第5位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第6位
	lcall     SAMrecv1bit
	rrc      a
;;      接收第7位
	lcall     SAMrecv1bit
	rrc      a
;       接收奇偶位(未比较)
	lcall     SAMrecv1bit

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

	jc	rsamb_c1
			; c = 0
	jb	P, rsamb_again	; c=0 & p=1	err
	jmp	rsamb_ok		; c=0 & p=0	ok

rsamb_c1:		; c = 1
	jb	P, rsamb_ok		; c=1 & p=1	ok
					; c=1 & p=0	err

rsamb_again:

	dec	r2
	jz	toSAMrb_err0

	lcall  D40T
	lcall  D21T

	;//要求重发
	clr	I_O
	lcall D123T
	lcall D123T
	setb	I_O
	jmp  recvsamagain	; 重新接收
rsamb_ok:
	clr	STATE_FLAG
	ret
toSAMrb_err0:
	jmp	SAMrb_err0

;=======================================================================
;P1口模拟串口发送
;入口参数: R6.R7:delaytime(TC1+12); R5:待发送数据
;出口参数: 正确STATE_FLAG = 0;错误STATE_FLAG = 1;
_SAM2sendbyte:
SAMsb_loop:
	setb        I_O
	mov	WDTC, #0a7h
;SAMsb_loop:
	jnb         I_O,SAMsb_loop

	clr         STATE_FLAG
	lcall D123T;;(11个call)字节之间(间隙)延时为12etu(含停止位)
	;20020710 add(部分天喻卡时序不标准,如不增加2个etu,则部分天喻卡接收出错)
	lcall D123T

	mov	r2, #4

SAMsb_loop0:	
	mov   a,r7;data byte

	clr   ET0

	clr   I_O; 发送起始位
	lcall D123T

	rrc  a     ;4C	发送第0位
	mov  I_O,C ;8C	
	lcall D123T

	rrc  a     ;发送第1位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第2位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第3位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第4位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第5位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第6位
	mov  I_O,C
	lcall D123T

	rrc  a     ;发送第7位
	mov  I_O,C
	lcall D122T
	nop			;4C

	mov  a,r7    	;4C	发送奇偶位位
	mov  C,P		;8C
	mov  I_O,C	;8C
	lcall D123T

	nop			;4C
	setb I_O     ;发送停止位
	lcall D123T

	; 11 etu	检测I/O线
	jb	I_O, SAMsb_ok
	djnz	r2,SAMsb_again
	jmp     SAMsb_err	; 已发5次
	; 重发
SAMsb_again:
	setb	I_O
	lcall D123T
	lcall D123T
	lcall D123T
	lcall D123T
	jmp	SAMsb_loop0

SAMsb_err:
	setb STATE_FLAG
	setb	I_O
	ret

SAMsb_ok:
	clr STATE_FLAG
	ret

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

	;lcall	 	16C	20
SAMrecv1bit:
	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	D38T		;
	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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	end

⌨️ 快捷键说明

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