📄 sam1.asm
字号:
; $XREF DEBUG SYMBOLS
; NAME withSAM1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROG SEGMENT CODE
;BITVAR SEGMENT BIT
public SAM1recvbyte
public SAM1recvbyte1
public _SAM1sendbyte
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.2 //SAM1
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:奇偶位
;-----------------------------------------------------------------------
SAM1recvbyte1:
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
;=======================================================================
SAM1recvbyte:
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;
_SAM1sendbyte:
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 + -