📄 card2.asm
字号:
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 + -