📄 serial.asm
字号:
;================
;= Dfseript.inc =
;================
BAUDRATECONST EQU 66 ;table look-up (4MHz, 4800 bits/second)
;or calculate (see HT-IDE User's Guide)
TXPIN EQU PA.3 ;transmit pin
RXPIN EQU PA.2 ;receive pin
;============
;= Main.asm =
;============
#define HEADER_HT48C70
#include ht48c70-1.inc
#include dfseript.inc
;#define TRANSMIT_MODE ;define TRANSMIT_MODE for transmit mode
;default is receive mode
extern transmit:near ;external functions
extern receive:near
;-------------------------------------------------------
data .section 'data' ;== data section ==
transmit_data db ?
receive_data db ?
counter db ?
;-------------------------------------------------------
code .section at 0 'code' ;== program section ==
org 00H ;
jmp start ;
org 04h ;external interrupt subroutine
reti ;for guarantee
org 08h ;timer/event 0 interrupt subroutine
reti ;for guarantee
org 0ch ;timer/event 1 interrupt subroutine
reti ;for guarantee
start: ;
clr intc ;initialize registers
clr tmr0c ;to guarantee performance
clr tmr0h ;(interrupts)
clr tmr0l ;
clr tmr1c ;
clr tmr1h ;
clr tmr1l ;
set pac ;(ports)
set pbc ;(input mode)
set pcc ;
set pdc ;
set pec ;
set pfc ;
set pgc ;
main:
set pac.2 ;set receive pin to input mode
clr pac.3 ;set transmit pin to output mode
loop:
ifdef TRANSMIT_MODE ;transmit mode
mov a,32 ;transmit 32 bytes
mov counter,a
clr tblp ;tble=0 (data pointer)
again:
tabrdl transmit_data ;load transmit data
mov a,transmit_data
call transmit ;transmit
inc tblp ;tble+1 (point to next)
sdz counter ;transmit over? (counter-1)
jmp again ;no. next byte
jmp loop ;repeat from loop
else
mov a,40h ;receive mode
mov mp0,a ;mp0->receive buffer (40h~5Fh)
mov a,32 ;load counter
mov counter,a ;
again:
call receive ;receive 1 byte
mov r0,a ;put received data to buffer
inc mp0 ;buffer index +1
sdz counter ;receive over?
jmp again ;no. continue receiving
jmp $ ;yes. stop program
endif
test .section at 1f00h 'code'
test_table: ;data fo transmitting (32 bytes)
dc 012h,034h,056h,078h,09ah,0bch,0deh,0f0h, 011h,022h,033h,044h,055h,066h,077h,088h
dc 099h,0aah,0bbh,0cch,0ddh,0eeh,0ffh,000h, 055h,0aah,055h,0aah,055h,0aah,055h,0aah
end
;==============
;= Serial.asm =
;==============
;serial port library
ifndef HEADER_HT48C70 ;depends on what type of IC you selected
#define HEADER_HT48C70
#include ht48c70-1.inc
endif
#include dfseript.inc
public transmit ;external functions
public receive ;
baudrate equ baudrateconst ;replace baudrate with baudrateconst
tx equ txpin ;replace txpin with tx
rx equ rxpin ;replace rxpin with rx
sdata .section 'data' ;
count db ? ;serial bit counter
txreg db ? ;transmit data register
rcreg db ? ;receive data register
delay db ? ;delay counter
serial .section 'code' ;
transmit proc ;transmit a byte (Acc)
mov txreg,a ;hold Acc at txreg
mov a,baudrate ;load delay counter
mov delay,a ;
clr tx ;send start bit '0'
mov a,9 ;load bit counter
mov count,a ;
txdelay: ;
sdz delay ;delay to fit baudrate
jmp txdelay ;
mov a,baudrate ;reload delay counter
mov delay,a ;
sdz count ;if transmit over?
jmp sendbit ;no. send next bit
jmp endtx ;yes. go ahead
sendbit:
rrc txreg ;shift right through carry flag
snz c ;is '1'
jmp lobit ;no. goto lobit
set tx ;yes. send '1'
jmp txdelay ;repeat from txdelay
lobit: ;
clr tx ;send '0'
jmp txdelay ;repeat from txdelay
endtx: ;
nop ;delay for a while
nop ;
set tx ;send stop bit '1'
t1: ;
sdz delay ;delay between bits
jmp t1 ;(timing adjustment)
mov a,baudrate ;
mov delay,a ;
t2: ;
sdz delay ;
jmp t2 ;
ret ;
transmit endp ;
receive proc ;receive a byte
sz rx ;if start bit '0'
jmp receive ;no. test again
mov a,9 ;yes. start receiving
mov count,a ;load bit counter
mov a,baudrate+1 ;load delay counter
mov delay,a ;(+1 for timing adjustment)
rxdelay: ;
sdz delay ;delay to fit baudrate
jmp rxdelay ;
mov a,baudrate+1 ;reload delay counter
mov delay,a ;(+1 for timing adjustment)
sdz count ;if receive over?
jmp rxbit ;no. receive next bit
mov a,rcreg ;yes. put received data to Acc
ret ;
rxbit: ;
set c ;c=1
snz rx ;if received '1'?
clr c ;no. c=0
rrc rcreg ;shift left through carry flag
jmp rxdelay ;repeat from rxdelay
receive endp ;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -