📄 fm1702.asm
字号:
pop acc
pop psw
reti
SerialReceive:
push psw
push acc
push b
mov a,r0
push acc
jnb ri,sr_ex
mov a,sbuf
mov b,a
cjne a,#COMM_HEAD,sr_1
mov a,RCV_LEN
jz sr_ex
setb FLAG_RCV
clr FLAG_PARALLEL
sjmp sr_ex
sr_1:
; mov a,SR_MODE
; cjne a,#SR_IDLE,sr_ex
mov a,RCV_LEN
cjne a,#MAX_RCV,sr1_0
sr1_0: jnc sr_ex
add a,#RCV_BUF
mov r0,a
mov @r0,b
inc RCV_LEN
sr_ex: clr ri
pop acc
mov r0,a
pop b
pop acc
pop psw
reti
Send:
jb FLAG_PARALLEL,ParallelSend
sjmp SerialSend
SerialSend:
clr ti
mov r0,#SND_BUF
mov r7,SND_LEN
ss_0: mov a,@r0
mov sbuf,a
jnb ti,$
clr ti
inc r0
djnz r7,ss_0
mov SR_MODE,#SR_IDLE
clr a
ret
ParallelSend:
clr EX1
setb ParallelA
mov r0,#SND_BUF
mov r7,SND_LEN
ps_0: mov a,@r0
mov ParallelPort,a
clr ParallelB
mov r6,#0
ps_1: jnb ParallelA,ps_2
djnz r6,ps_1
ps_2: setb ParallelB
mov r6,#0
ps_3: jb ParallelA,ps_4
djnz r6,ps_3
ps_4:
inc r0
djnz r7,ps_0
mov SR_MODE,#SR_IDLE
clr a
SETB EX1
ret
SRDecode:
mov r0,#RCV_BUF
mov r6,RCV_LEN
sd_0: mov a,@r0
cjne a,#COMM_SHIFT,sd_1
mov a,r0
mov r2,a
inc r0
mov r1,a
mov a,r6
dec a
mov r7,a
lcall MemCopy
dec RCV_LEN
dec r6
mov a,r2
mov r0,a
mov a,@r0
cjne a,#SHIFT_HEAD,sd0_1
mov @r0,#COMM_HEAD
sjmp sd_1
sd0_1: cjne a,#SHIFT_SHIFT,sd_1
mov @r0,#COMM_SHIFT
sd_1: inc r0
djnz r6,sd_0
ret
SRCode:
mov r0,#SND_BUF
mov r7,SND_LEN
mov r1,#SND_BUF+1
lcall MemCopy
mov r0,#SND_BUF
mov @r0,#COMM_HEAD
inc r0
mov r6,SND_LEN
inc SND_LEN
sc_0: mov a,@r0
cjne a,#COMM_HEAD,sc_1
mov a,r0
mov r2,a
mov a,r6
mov r7,a
dec r7
inc r0
mov a,r0
mov r1,a
inc r1
lcall MemCopy
mov a,r2
mov r0,a
mov @r0,#COMM_SHIFT
inc r0
mov @r0,#SHIFT_HEAD
inc SND_LEN
sjmp sr_2
sc_1: cjne a,#COMM_SHIFT,sr_2
mov a,r0
mov r2,a
mov a,r6
mov r7,a
dec r7
inc r0
mov a,r0
mov r1,a
inc r1
lcall MemCopy
mov a,r2
mov r0,a
mov @r0,#COMM_SHIFT
inc r0
mov @r0,#SHIFT_SHIFT
inc SND_LEN
sjmp sr_2
sr_2: inc r0
djnz r6,sc_0
mov @r0,#COMM_HEAD
inc SND_LEN
ret
GetChecksum:
clr a
gc_0: add a,@r0
inc r0
djnz r7,gc_0
ret
; \param R0 = Source
; \param R1 = Dest
; \param R7 = len
; \return none
;
MemCopy:mov a,r7
jnz mc_0
ret
mc_0: mov a,r0
mov b,r1
cjne a,b,mc_1
ret
mc_1: jc mc_2
mc1_0: mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r7,mc1_0
ret
mc_2: add a,r7
dec a
mov r0,a
mov a,b
add a,r7
dec a
mov r1,a
mc2_0: mov a,@r0
mov @r1,a
dec r0
dec r1
djnz r7,mc2_0
ret
;----------------------------------------------------------------------------
;
; FUNCTION: start_timeout
;
; IN: _50us
; OUT: -
;
; COMMENT: Using Timer2 to generate timeout with a resolution of 50 us.
; Timeout is calculated in the interrupt routine.
; Max Timeout = 65535 x 50us = 3.277s
;
;----------------------------------------------------------------------------
; void start_timeout(unsigned int _50us)
; \param A = reg
; \param B = mask
; \return none
;
StartT0Timeout:
clr ET0 ; Disable Timer2 interrupt
clr TR0 ;
; mov RCAP2H,#0ffh
; mov RCAP2L,#0a4h
; RCAP2LH = 0xFFA4;
mov TH0,#TH0_1ms
mov TL0,#TL0_1ms
; T2LH = 0xFFA4;
mov T0CNT,a
; CountDown = _50us;
clr FLAG_T0OUT
; T2IR = 0; // Reset timeout state
mov TMOD,#21h
; T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
setb ET0
setb TR0
ret
;}
;----------------------------------------------------------------------------
;
; FUNCTION: stop_timeout
;
; IN: -
; OUT: -
;
; COMMENT: Stop Timer2 and clear timeout state
;
;----------------------------------------------------------------------------
;void stop_timeout(void)
StopT0Timeout:
clr ET0 ; Disable Timer2 interrupt
clr TR0 ;
clr FLAG_T0OUT
ret
;}
;/////////////////////////////////////////////////////////////////////////////
; Interrupt Handler TIMER2
;/////////////////////////////////////////////////////////////////////////////
;void TIMEOUTISR (void) interrupt 5 using 2 //Timer2 interrupt
Timer0Out:
push psw
push acc
mov TH0,#TH0_10ms
mov TL0,#TL0_10ms
inc T0CNT
mov a,T0CNT
cjne a,#50,tmr0_1
setb FLAG_HALFSEC
sjmp tmr0_ex
tmr0_1: cjne a,#100,tmr01_00
tmr01_00:
jc tmr0_ex
mov T0CNT,#0
setb FLAG_HALFSEC
setb FLAG_SECOND
tmr0_ex:
pop acc
pop psw
reti
; Data, which have to be passed between ISR and other functions are
; colleted within one structure.
;/
; ResetInfo(info) \
ResetInfo:
mov MfCmd,#0
mov MfStatus,#MI_OK
mov MfIrqSource,#0
mov MfBytesSend,#0
mov MfBytesToSend,#0
mov MfBytesReceived,#0
mov MfBitsReceived,#0
mov MfCollPos,#0
ret
WriteRawRC:
mov dph,RC500_BASE
mov dpl,a
mov a,b
movx @dptr,a
ret
ReadRawRC:
mov dph,RC500_BASE
mov dpl,a
movx a,@dptr
ret
GetRegPage:
clr c
rrc a
clr c
rrc a
clr c
rrc a
setb acc.7
ret
CloseRC:
ret
WriteRC:
lcall WriteRawRC
ret
ReadRC:
lcall ReadRawRC
ret
PcdSetTmo:
; timer clock frequency 13,56 MHz
cjne a,#1,pst_01
mov a,#RegTimerClock
mov b,#07
lcall WriteRC
mov a,#RegTimerReload
mov b,#6ah
lcall WriteRC
ret
pst_01: cjne a,#2,pst_02
mov a,#RegTimerClock
mov b,#07
lcall WriteRC
mov a,#RegTimerReload
mov b,#0a0h
lcall WriteRC
ret
pst_02: cjne a,#3,pst_03
mov a,#RegTimerClock
mov b,#09
lcall WriteRC
mov a,#RegTimerReload
mov b,#0a0h
lcall WriteRC
ret
pst_03: cjne a,#4,pst_04
mov a,#RegTimerClock
mov b,#09
lcall WriteRC
mov a,#RegTimerReload
mov b,#0ffh
lcall WriteRC
ret
pst_04: cjne a,#5,pst_05
mov a,#RegTimerClock
mov b,#0bh
lcall WriteRC
mov a,#RegTimerReload
mov b,#0ffh
lcall WriteRC
ret
pst_05: cjne a,#6,pst_06
mov a,#RegTimerClock
mov b,#0dh
lcall WriteRC
mov a,#RegTimerReload
mov b,#0ffh
lcall WriteRC
ret
pst_06: cjne a,#7,pst_07
mov a,#RegTimerClock
mov b,#0fh
lcall WriteRC
mov a,#RegTimerReload
mov b,#0ffh
lcall WriteRC
ret
pst_07:
pst_def:
push acc
mov a,#RegTimerClock
mov b,#07
lcall WriteRC
pop b
mov a,#RegTimerReload
lcall WriteRC
ret
SetBitMask:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -