📄 sci485.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 + -