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