⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm1702.asm

📁 FM1702/rc500驱动代码 at89c55wd,汇编语言
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        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 + -