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

📄 sci485.asm

📁 MOT单片机的串口驱动
💻 ASM
字号:
* ---------------------------------------------------------------- *
* SOFT SERIAL COMMUNICATION INTERFACE
* Use common I/O ports
* Boud Rate=600 Bit/s
* MCU buss Frequance=7.3728M
* input:  getchar
* output: putchar
* ---------------------------------------------------------------- *

* ---------------------------------------------------------------- *
* Unsigned 16x16 multiply
* name: um2
* Ram require: int1:4 byte ; int2:2 byte
* (int1:(int1+1))*(int2:(int2+1))=int1:(int1+3)
* ---------------------------------------------------------------- *

portd     EQU   $3
ddrd      EQU   $7
COUNT     EQU   $40
OUTCHAR   EQU   $41
RECECHAR  EQU   $42
BITCOU    EQU   $43
RECECOU   EQU   $44
bitcheck  equ   $45
FLAG      EQU   $46

checkeor  equ   $47

int1      equ   $60h ; 4 byte
int2      equ   $64h ; 2 byte

b_r       equ   6  ;485 use portb 3,6,7.
b_t       equ   7
b_c       equ   3  ;low is recive,high is transmit
b_noise   equ   0
b_frame   equ   1
b_even    equ   2
b_stop    equ   3

       ORG    $8000

MAIN:  BSET  b_c,ddrd
       bset  b_t,ddrd
       BCLR  b_r,ddrd
       bclr  b_c,portd
       
       clr int1
       clr int2
       jsr um2
       
       clr COUNT
       clr OUTCHAR
       clr RECECHAR
       clr BITCOU
       clr RECECOU
       clr bitcheck
       clr FLAG
       bset  b_c,portd
       bset  b_t,portd
       MOV   #$DD,OUTCHAR    ;发送“DD”
       JSR   PUTCHAR

       bclr  b_c,portd
       LDA   #$79            ;共121个数据
       STA   RECECOU
LOOP:  JSR   GETCHAR         ;等待接收数据(1个字节)
       lda   rececou
       cmp   #$3c            ;接收60个字
       bne   loop1
       LDA   RECECHAR
       STA   RECECHAR        ;接收数据送缓冲区
loop1: DEC   RECECOU
       BNE   LOOP
******************************************************
*description: This module is to get a char
*name:GETCHAR
*in:none
*out:CHAR
*call:delay1500,DELAY3000
*called by: MAIN
*********************************************************
GETCHAR: LDA     #$08
         STA     COUNT
         clrx
         clr     flag
         clr     bitcheck
get_st:  brclr   b_r,portd,*
         brset   b_r,portd,*
         JSR     delay150
         jsr     get_bit
         LSRA                            ; noise bit to Carry
         bne     get_st
         nop
         nop
         nop
         jsr     delay300
rx_byte: jsr     get_bit
         rora
         rorx
         rora
         bcc     rx_b1
         ROR     RECECHAR               ; Carry to RECECHAR
         nop
         jmp     rx_b2
rx_b1:   ROR     RECECHAR               ; Carry to RECECHAR
         inc     bitcheck
rx_b2:   JSR     DELAY300
         nop
         DEC     COUNT
         BNE     rx_byte
rx_even: jsr     get_bit                ;采样校验位
         lsra
         bcc     noise
         lsra
         bcc     rx_e1
         brclr   0,bitcheck,rx_e2      ;校验位低,应为奇数
         bclr    b_even,flag
         jmp     rx_e3
rx_e1:   brset   0,bitcheck,rx_e2      ;校验位高,应为偶数
         bclr    b_even,flag
         jmp     rx_e3
rx_e2:   bset    b_even,flag
         nop
         nop
         nop
rx_e3:   jsr     delay300
         nop
rx_stop: jsr     get_bit                ;采样停止位
         sta     count
         brset   1,count,rx_sp1
         bclr    b_stop,flag
         jmp     rx_sp2
rx_sp1:  bset    b_stop,flag
rx_sp2:  lsra
         bcc     noise
         txa
         eor     recechar
         beq     return
noise:   bset   b_noise,flag
return:  RTS

get_bit: CLRA                            ;Used to add sampled bits
         BRSET   b_r,portd,SAMP1         ;Sample three times
SAMP1:   ADC     #$0
         BRSET   b_r,portd,SAMP2
SAMP2:   ADC     #$0
         BRSET   b_r,portd,SAMP3
SAMP3:   ADC     #$0
         rts
******************************************************
*description: This module is to send out a char
*name:PUTCHAR
*in:OUTCHAR
*out:none
*call:delay150
*called by: MAIN
*********************************************************
PUTCHAR: CLRA
         STA    BITCOU
         BCLR   b_t,portd           ;起始位
         LDA    #$09
         STA    COUNT
         nop
PUT_LP1: JSR    DELAY300
         DEC    COUNT
         BEQ    PUT_CHK
         ROR    OUTCHAR
         BCC    PUT_TX2
         BSET   b_t,portd
         nop
         nop
         jmp    PUT_LP1
PUT_TX2: BCLR   b_t,portd
         INC    BITCOU
         jmp    PUT_LP1
PUT_CHK: BRSET  0,BITCOU,PUT_L  ;奇数置低电平
         BSET   b_t,portd       ;偶数置高电平
         jmp    PUT_STOP
PUT_L:   BCLR   b_t,portd
PUT_STOP:JSR    DELAY300
         BSET   b_t,portd
         JSR    DELAY300
         NOP
         NOP
         RTS
******************************************************
*description: This module is to delay $3000t
*name:DELAY300
*in:none
*out:none
*temp:
*register:A
*call:
*called by:GETCHAR,PUTCHAR
********************************************************
DELAY300: PSHH
          PSHX
          ldhx #$5fd
DEL3001:  aix #-1
          cphx #0
          bne del3001
          PULX
          PULH
          RTS
******************************************************
*description: This module is to delay 1700t
*name:delay150
*in:none
*out:none
*temp:
*register:A
*call:
*called by:GETCHAR,PUTCHAR
********************************************************
delay150: PSHH
          PSHX
          ldhx #$300
DEL1501:  aix #-1
          cphx #0
          bne del1501
          PULX
          PULH
          RTS
*****************************************************

UM2:    PSHA           ; int1(2 byte)*int2(2 byte)=int1(4 byte)
        PSHX
        PSHH
        AIS #-6
        CLR 6,SP
        LDX INT1+1
        LDA INT2+1
        MUL
        STX 6,SP
        STA INT1+3
        LDX INT1
        LDA INT2+1
        MUL
        ADD 6,SP
        STA 2,SP
        BCC U_M1
        INCX
U_M1:   STX 1,SP
        CLR 6,SP
        LDX INT1+1
        LDA INT2
        MUL
        STX 6,SP
        STA 5,SP
        LDX INT1
        LDA INT2
        MUL
        ADD 6,SP
        STA 4,SP
        BCC U_M2
        INCX
U_M2:   STX 3,SP
        LDA 2,SP
        ADD 5,SP
        STA INT1+2
        LDA 1,SP
        ADC 4,SP
        STA INT1+1
        LDA 3,SP
        ADC #0
        STA INT1
        AIS #6
        PULH
        PULX
        PULA
        RTS

       ORG $FFFE
       FDB      main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -