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

📄 serial.asm

📁 holtek h48c70 将IO模拟串口使用。
💻 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 + -