📄 card1.asm
字号:
call recv1bit115200
cpl c
rlc a
;; 接收第3位
call recv1bit115200
cpl c
rlc a
;; 接收第2位
call recv1bit115200
cpl c
rlc a
;; 接收第1位
call recv1bit115200
cpl c
rlc a
;; 接收第0位
call recv1bit115200
cpl c
rlc a
; 接收奇偶位(未比较)
call recv1bit115200
mov r7,a ; 保存数据, 不影响C
clr STATE_FLAG
ret
rbRV_err2:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV57600:
clr ET0 ; 减去上一个字节的10个etu
jnb I_O,rbRV_next3;等待一个起始位
clr ET0
mov timer0,#50h;//#27h
jnb I_O,rbRV_next3;等待一个起始位
mov timer0 + 01H,#10h
jnb I_O,rbRV_next3;等待一个起始位
setb ET0
jnb I_O,rbRV_next3;等待一个起始位
rbRV_begin3:
jnb I_O,rbRV_next3;等待一个起始位
jb IC_SW, rbRV_err3
jnb I_O,rbRV_next3;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rbRV_next3;等待一个起始位
orl a,timer0
jnb I_O,rbRV_next3;等待一个起始位
jz rbRV_err3
jnb I_O,rbRV_next3;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rbRV_begin3;等待一个起始位
rbRV_next3: ;//124/2 = 62T
clr ET0 ;1 3
call D7T ;7 10
jb I_O,rbRV_begin3 ;2 12 延时0.25etu 再检起始位 2 10
call D7T ;7 19
jb I_O,rbRV_begin3 ;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 recv1bit57600
cpl c
rlc a
;; 接收第6位
call recv1bit57600
cpl c
rlc a
;; 接收第5位
call recv1bit57600
cpl c
rlc a
;; 接收第4位
call recv1bit57600
cpl c
rlc a
;; 接收第3位
call recv1bit57600
cpl c
rlc a
;; 接收第2位
call recv1bit57600
cpl c
rlc a
;; 接收第1位
call recv1bit57600
cpl c
rlc a
;; 接收第0位
call recv1bit57600
cpl c
rlc a
; 接收奇偶位(未比较)
call recv1bit57600
mov r7,a ; 保存数据, 不影响C
clr STATE_FLAG
ret
rbRV_err3:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV111600:
clr ET0 ; 减去上一个字节的10个etu
jnb I_O,rbRV_next4;等待一个起始位
clr ET0
mov timer0,#50h;//#27h
jnb I_O,rbRV_next4;等待一个起始位
mov timer0 + 01H,#10h
jnb I_O,rbRV_next4;等待一个起始位
setb ET0
jnb I_O,rbRV_next4;等待一个起始位
rbRV_begin4:
jnb I_O,rbRV_next4;等待一个起始位
jb IC_SW, rbRV_err4
jnb I_O,rbRV_next4;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rbRV_next4;等待一个起始位
orl a,timer0
jnb I_O,rbRV_next4;等待一个起始位
jz rbRV_err4
jnb I_O,rbRV_next4;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rbRV_begin4;等待一个起始位
rbRV_next4: ;//124/2 = 62T
clr ET0 ;1 3
call D7T ;7 10
jb I_O,rbRV_begin4 ;2 12 延时0.25etu 再检起始位 2 10
call D7T ;7 19
jb I_O,rbRV_begin4 ;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 recv1bit111600
cpl c
rlc a
;; 接收第6位
call recv1bit111600
cpl c
rlc a
;; 接收第5位
call recv1bit111600
cpl c
rlc a
;; 接收第4位
call recv1bit111600
cpl c
rlc a
;; 接收第3位
call recv1bit111600
cpl c
rlc a
;; 接收第2位
call recv1bit111600
cpl c
rlc a
;; 接收第1位
call recv1bit111600
cpl c
rlc a
;; 接收第0位
call recv1bit111600
cpl c
rlc a
; 接收奇偶位(未比较)
call recv1bit111600
mov r7,a ; 保存数据, 不影响C
clr STATE_FLAG
ret
rbRV_err4:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV55930:
clr ET0 ; 减去上一个字节的10个etu
jnb I_O,rbRV_next5;等待一个起始位
clr ET0
mov timer0,#50h;//#27h
jnb I_O,rbRV_next5;等待一个起始位
mov timer0 + 01H,#10h
jnb I_O,rbRV_next5;等待一个起始位
setb ET0
jnb I_O,rbRV_next5;等待一个起始位
rbRV_begin5:
jnb I_O,rbRV_next5;等待一个起始位
jb IC_SW, rbRV_err5
jnb I_O,rbRV_next5;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rbRV_next5;等待一个起始位
orl a,timer0
jnb I_O,rbRV_next5;等待一个起始位
jz rbRV_err5
jnb I_O,rbRV_next5;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rbRV_begin5;等待一个起始位
rbRV_next5: ;//124/2 = 62T
clr ET0 ;1 3
call D7T ;7 10
jb I_O,rbRV_begin5 ;2 12 延时0.25etu 再检起始位 2 10
call D7T ;7 19
jb I_O,rbRV_begin5 ;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 recv1bit55930
cpl c
rlc a
;; 接收第6位
call recv1bit55930
cpl c
rlc a
;; 接收第5位
call recv1bit55930
cpl c
rlc a
;; 接收第4位
call recv1bit55930
cpl c
rlc a
;; 接收第3位
call recv1bit55930
cpl c
rlc a
;; 接收第2位
call recv1bit55930
cpl c
rlc a
;; 接收第1位
call recv1bit55930
cpl c
rlc a
;; 接收第0位
call recv1bit55930
cpl c
rlc a
; 接收奇偶位(未比较)
call recv1bit55930
mov r7,a ; 保存数据, 不影响C
clr STATE_FLAG
ret
rbRV_err5:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
recvbyteRV38400:
clr ET0 ; 减去上一个字节的10个etu
jnb I_O,rbRV_next6;等待一个起始位
clr ET0
mov timer0,#50h;//#27h
jnb I_O,rbRV_next6;等待一个起始位
mov timer0 + 01H,#10h
jnb I_O,rbRV_next6;等待一个起始位
setb ET0
jnb I_O,rbRV_next6;等待一个起始位
rbRV_begin6:
jnb I_O,rbRV_next6;等待一个起始位
jb IC_SW, rbRV_err38400
jnb I_O,rbRV_next6;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rbRV_next6;等待一个起始位
orl a,timer0
jnb I_O,rbRV_next6;等待一个起始位
jz rbRV_err38400
jnb I_O,rbRV_next6;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rbRV_begin6;等待一个起始位
rbRV_next6: ;//124/2 = 62T
clr ET0 ;1 3
call D7T ;7 10
jb I_O,rbRV_begin6 ;2 12 延时0.25etu 再检起始位 2 10
call D7T ;7 19
jb I_O,rbRV_begin6 ;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 recv1bit38400
cpl c
rlc a
;; 接收第6位
call recv1bit38400
cpl c
rlc a
;; 接收第5位
call recv1bit38400
cpl c
rlc a
;; 接收第4位
call recv1bit38400
cpl c
rlc a
;; 接收第3位
call recv1bit38400
cpl c
rlc a
;; 接收第2位
call recv1bit38400
cpl c
rlc a
;; 接收第1位
call recv1bit38400
cpl c
rlc a
;; 接收第0位
call recv1bit38400
cpl c
rlc a
; 接收奇偶位(未比较)
call recv1bit55930
mov r7,a ; 保存数据, 不影响C
jc rbRV_38400c1
jnb P,rbRV_38400again
jmp rbRV_38400ok
rbRV_38400c1:
jnb P,rbRV_38400ok
rbRV_38400again:
jb CPU1_T0_T1,parity38400
djnz r2, rbRV_again38400
jmp rbRV_err38400
rbRV_err38400:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
rbRV_again38400:
lcall D40T
lcall D21T
;//要求重发
clr I_O
lcall D123T
lcall D123T
setb I_O
jmp recvbyteRV38400; 重新接收
rbRV_38400ok:
clr STATE_FLAG
ret
parity38400:
setb parity_bit
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CARD1ATRrecvbyte:
jnb reverse, recv9600_atr
jmp recvbyteRV
recv9600_atr:
; 960*D*WI etu
clr ET0
mov timer0,#0f3h
jnb I_O,atr_next;等待一个起始位
mov timer0 + 01H,#0dfh
jnb I_O,atr_next;等待一个起始位
setb ET0
jnb I_O,atr_next;等待一个起始位
jmp atr_begin
atr_begin:
jnb I_O,atr_next;等待一个起始位
jb IC_SW, atr_err
jnb I_O,atr_next;等待一个起始位
mov a,timer0 + 01H
jnb I_O,atr_next;等待一个起始位
orl a,timer0
jnb I_O,atr_next;等待一个起始位
jz atr_err
jnb I_O,atr_next;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,atr_begin;等待一个起始位
atr_next: ;//124/2 = 62T
clr ET0 ;8C 24
jb I_O,atr_begin ;16C 40 延时0.25etu 再检起始位 2 3
lcall D40T ;480C 520
jb I_O,atr_begin ;16C 536 延时0.25etu 再检起始位 2 5
lcall D39T ;468C 1004
lcall 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 atr_c1
; c = 0
jb P, atr_again ; c=0 & p=1 err
jmp atr_ok ; c=0 & p=0 ok
atr_c1: ; c = 1
jb P, atr_ok ; c=1 & p=1 ok
; c=1 & p=0 err
atr_again:
jmp atr_err0
atr_err:
clr ET0
setb I_O
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
; call Detu
; clr IC_RST
; clr I_O
; setb CLK_CTR
; setb IC_PWR
ret
atr_ok:
clr STATE_FLAG
ret
atr_err0:
clr ET0
setb I_O
setb STATE_FLAG ;四次重收不成功
mov r7, #0ffh;;#define IFD_ICC_TypeError -1 //卡片类型不对 //奇偶校验错
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CARD1BWTrecvbyte:
setb I_O
mov r2, 0
BWTwaitStopBit:
jb I_O,BWTP1recvbyte0;等待停止位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
djnz r2,BWTwaitStopBit
jmp rb115200_err1;等待停止位
BWTP1recvbyte0:
mov A,bps
jb ACC.1,BWTrbyte38400
jb ACC.0,BWTrbyte19200
jmp BWTrecvbyte9600
BWTrbyte19200:
jmp BWTrecvbyte19200
BWTrbyte38400:
jmp BWTrecvbyte38400
BWTrecvbyte9600:
mov r2,#0
mov r5,#0
mov r6,#0
jnb reverse, BWTrecv960
jmp recvbyteRV
BWTrecv960:
clr C
mov a,BWI
subb a,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -