📄 card2.asm
字号:
jmp rb38400_err0
rb38400_again0:
; lcall D40T
lcall D10T
lcall D5T
;//要求重发
clr I_O
lcall Detu
lcall D5T
setb I_O
jmp recvbyte384; 重新接收
rb38400_err:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
rb38400_ok:
setb I_O
clr STATE_FLAG
ret
rb38400_err0:
setb I_O
clr ET0
setb STATE_FLAG ;四次重发不成功
mov r7, #0ffh;//#define IFD_ICC_TypeError -1 //卡片类型不对
ret
parity2:
setb parity_bit
ret
;-----------------------------------------------------------------------
recvbyte19200:
clr parity_bit
mov r2,#5
jnb reverse, recvbyte192
jmp recvbyteRV19200
recvbyte192:
jb CPU2_T0_T1,recvbyte192T1
mov r3,#0feh;0f4h
mov r4,#0f0h;020h
jmp recvbyte1920
recvbyte192T1:
mov r3,#06h
mov r4,#36h
recvbyte1920:
jnb I_O,rb19200_next;等待一个起始位
clr ET0
mov timer0,r3
jnb I_O,rb19200_next;等待一个起始位
mov timer0 + 01H,r4
jnb I_O,rb19200_next;等待一个起始位
setb ET0
jnb I_O,rb19200_next;等待一个起始位
rb19200_begin:
jnb I_O,rb19200_next;等待一个起始位
jb IC_SW, rb19200_err
jnb I_O,rb19200_next;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rb19200_next;等待一个起始位
orl a,timer0
jnb I_O,rb19200_next;等待一个起始位
jz rb19200_err
jnb I_O,rb19200_next;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rb19200_begin;等待一个起始位
rb19200_next:
clr ET0 ;8C 24
jb I_O,rb19200_begin ;16C 40 延时0.25etu 再检起始位 2 3
lcall D27T ;240C 280
jb I_O,rb19200_begin ;16C 296 延时0.25etu 再检起始位 2 5
lcall D30T ;444C 740
clr a ;4C 744
;19200bps 1etu=744C
;; 接收第0位
lcall recv1bit19200
rrc a
;; 接收第1位
lcall recv1bit19200
rrc a
;; 接收第2位
lcall recv1bit19200
rrc a
;; 接收第3位
lcall recv1bit19200
rrc a
;; 接收第4位
lcall recv1bit19200
rrc a
;; 接收第5位
lcall recv1bit19200
rrc a
;; 接收第6位
lcall recv1bit19200
rrc a
;; 接收第7位
lcall recv1bit19200
rrc a
; 接收奇偶位(未比较)
lcall recv1bit19200
mov r7,a
mov a,r7
jc rb19200_c1
jb P,rb19200_again
jmp rb19200_ok
rb19200_c1:
jb P,rb19200_ok
rb19200_again:
jb CPU2_T0_T1,parity
djnz r2,rb19200_again0
jmp rb19200_err0
rb19200_again0:
; lcall D40T
lcall D21T
clr I_O
lcall Detu
lcall D15T
; lcall D123T
setb I_O
jmp recvbyte192
rb19200_err:
setb I_O
clr ET0
setb STATE_FLAG
mov r7,#0fch
ret
rb19200_ok:
setb I_o
clr STATE_FLAG
ret
rb19200_err0:
setb I_O
clr ET0
setb STATE_FLAG ;四次重发不成功
mov r7, #0ffh;//#define IFD_ICC_TypeError -1 //卡片类型不对
ret
parity:
setb parity_bit
ret
;-----------------------------------------------------------------------
CARD2recvbyte1:
setb I_O
mov r2, 0
WaitStopBit1:
jb I_O,recvbyte96_0;等待停止位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
djnz r2,WaitStopBit1
jmp rb115200_err1;等待停止位
recvbyte96:
jnb reverse, recvbyte96_0
jmp recvbyteRV
recvbyte96_0:
jnb I_O,rb_next;等待一个起始位
clr ET0
mov timer0,#0
jnb I_O,rb_next;等待一个起始位
mov timer0 + 1H,#64h ;// 40,000 cycle (4MHz)
jnb I_O,rb_next;等待一个起始位
setb ET0
jnb I_O,rb_next;等待一个起始位
jmp rb_begin
rb_next:
jmp rb_next1
;-----------------------------------------------------------------------
recvbyte9600:
jnb I_O,rb_next1;等待一个起始位
mov a,WI
mov r2, #5
jnb reverse, recv9600
jmp recvbyteRV
recv9600:
jnb I_O,rb_next1
jb CPU2_T0_T1,rb_next9600
jnb I_O,rb_next1
mov r3,#0feh;0f3h
jnb I_O,rb_next1
mov r4,#0f0h;0ffh
jnb I_O,rb_next1
jmp recv960
rb_next9600:
mov r3,#16h;10h
jnb I_O,rb_next1
mov r4,#0ffh;0eah ;EA
recv960:
jnb I_O,rb_next1;等待一个起始位
clr ET0
mov timer0,r3
jnb I_O,rb_next1;等待一个起始位
mov timer0 + 01H,r4
jnb I_O,rb_next1;等待一个起始位
setb ET0
jnb I_O,rb_next1;等待一个起始位
rb_begin:
jnb I_O,rb_next1;等待一个起始位
jb IC_SW, rb_err
jnb I_O,rb_next1;等待一个起始位
mov a,timer0 + 01H
jnb I_O,rb_next1;等待一个起始位
orl a,timer0
jnb I_O,rb_next1;等待一个起始位
jz rb_err
jnb I_O,rb_next1;等待一个起始位
mov WDTC, #0a7h ;2 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
jb I_O,rb_begin;等待一个起始位
rb_next1: ;//124/2 = 62T
clr ET0 ;8C 24
jb I_O,rb_begin ;16C 40 延时0.25etu 再检起始位 2 3
lcall D40T;D40T ;480C 520
jb I_O,rb_begin ;16C 536 延时0.25etu 再检起始位 2 5
lcall D39T;D39T ;468C 1004
lcall D40T;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 rb_c1 ; c = 0
jb P, rb_again ; c=0 & p=1 err
jmp rb_ok ; c=0 & p=0 ok
rb_c1: ; c = 1
jb P, rb_ok ; c=1 & p=1 ok
; c=1 & p=0 err
rb_again:
jb CPU2_T0_T1,parity1
djnz r2, rb_again0
jmp rb_err0
rb_again0:
lcall D40T
lcall D21T
;//要求重发
clr I_O
lcall D123T
lcall D123T
setb I_O
jmp recv9600 ; 重新接收
rb_err:
setb I_O
clr ET0
setb STATE_FLAG ;超时错
mov r7, #0fch;//#define IFD_ICC_NoResponse -4 //卡片无应答
ret
rb_ok:
setb I_O
clr STATE_FLAG
ret
rb_err0:
setb I_O
clr ET0
setb STATE_FLAG ;四次重发不成功
mov r7, #0ffh;//#define IFD_ICC_TypeError -1 //卡片类型不对
ret
parity1:
setb parity_bit
ret
;=======================================================================
;P1口模拟串口发送
;入口参数: R6.R7:delaytime(TC1+12); R5:待发送数据
;出口参数: 正确STATE_FLAG = 0;错误STATE_FLAG = 1;
_CARD2sendbyte:
;9600bps,19200bps,38400bps
sb_loop:
setb I_O
mov WDTC, #0a7h
jnb I_O,sb_loop
clr STATE_FLAG
jb TC1_flag,sb_flag
call D10T
call Detu
mov A,TC1
mov R2,A
jmp sb_loopDelay
sb_flag:
jnb CPU2_T0_T1,sb_flag1
mov A,TC1
mov R2,A
jmp sb_loopDelay
sb_flag1:
; call D30T
; call D30T
; call D30T
; call D10T
call Detu
mov A,TC1
mov R2,A
jmp sb_loopDelay
;对T0的字符间距处理
sb_loopDelay:
jz sb_loop00
sb_loop01:
call Detu
djnz R2,sb_loop01
;开始发送字符
sb_loop00:
mov r2, #5 ;8C ; 最多重发5此[社保要求为4次]
jnb reverse, sb_loop0
jmp sb_loopRV
sb_loop0:
mov a,r7 ;4C data byte
clr ET0 ;8C
clr I_O ;8C 发送起始位
call Detu
rrc a ;4C 发送第0位 ;1
mov I_O,C
;8C
call Detu ;2*R0+6
rrc a ;发送第1位
mov I_O,C
call Detu
rrc a ;发送第2位
mov I_O,C
call Detu
rrc a ;发送第3位
mov I_O,C
call Detu
rrc a ;发送第4位
mov I_O,C
call Detu
rrc a ;发送第5位
mov I_O,C
call Detu
rrc a ;发送第6位
mov I_O,C
call Detu
rrc a ;发送第7位
mov I_O,C
call Detu_8
mov a,r7 ;4C 发送奇偶位位
mov C,P ;8C
mov I_O,C ;8C
call Detu
nop ;4C
setb I_O ;发送停止位
call Detu
nop
;4C
; 11 etu 检测I/O线
jb I_O, sb_ok
djnz r2,sb_again
jmp sb_err ; 已发5次
; 重发
sb_again:
setb I_O
call Detu
call Detu
call Detu
call Detu
jmp sb_loop0
sb_err:
setb STATE_FLAG
setb I_O
ret
sb_ok:
clr STATE_FLAG
ret
;========================================================================
;接收1位(9600bps -- 124T) 1488C
;外部rrc A 4C
;lcall 16C 20
recv1bit9600:
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 D39T ;
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
;-----------------------------------------------------------------------
;接收1位(19200bps -- 62T) 744C
;外部rrc A 4C
;lcall 16C 20
recv1bit19200:
mov R3,A ;4C 24
lcall D18T ;
clr A ;4C
mov C,I_O ;8C
addc A,#0 ;8C 20
lcall D9T ;
mov C,I_O ;8C
addc A,#0 ;8C 16
lcall D9T ;
mov C,I_O ;8C
addc A,#0 ;8C 16
lcall D17T ;
mov WDTC, #0a7h ;12c
mov C,ACC.1 ;8C
mov A,R3 ;4C
ret ;8C 20 24+20+16+16+20=96C=8T
; 8+9+9+18+18=62T
;-----------------------------------------------------------------------
;接收1位(38400bps -- 31T) 372C
;外部rrc A 4C
;lcall 16C 20
recv1bit38400:
mov R3,A ;4C 24
lcall D8T ;
clr A ;4C
mov C,I_O ;8C
addc A,#0 ;8C 20
lcall D4T ;
mov C,I_O ;8C
addc A,#0 ;8C 16
lcall D4T ;
mov C,I_O ;8C
addc A,#0 ;8C 16
lcall D6T ;
mov WDTC, #0a7h ;12c
mov C,ACC.1 ;8C
mov A,R3 ;4C
ret ;8C 20 24+20+16+16+20=96C=8T
; 8+4+4+8+7=31T
;-----------------------------------------------------------------------
;接收1位55930bps 255C
;外部rrc A 4C
;lcall 16C 20
recv1bit55930:
mov R3,A ;4C 24
lcall D5T ;
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -