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

📄 uart.asm

📁 用AVR单片机时可以按发送寄存器空中断来连续发送字串。
💻 ASM
字号:
       ;清单40
       .ORG     0            ;8535UART串行通讯程序,晶振4MHZ
.EQU    DTPINT=$180          ;UBRR=12 波特率19200(REL.ERR.=0.16%)
.EQU    DRPINT=$1D0
STRT30: RJMP    RST30
       .ORG     $00B
        RJMP    U_RXC        ;UART接收完成中断
       .ORG     $00C
        RJMP    U_TXC        ;UART发送寄存器空中断
       .ORG     $011
RST30:  LDS     R16,$A3      ;
        CBR     R16,3
        STS     $A3,R16      ;清完整ASCII数据块接收到标志($A3,1),错误标志
 ;(FE/OR)($A3,0)
        LDI     R16,12
        OUT     UBRR,R16     ;BAUD RATE=FCP/16(UBRR+1)=19200
        LDI     R27,HIGH(DIPINT)
        MOV     R6,R27
        LDI     R26,LOW(DTPINT)
        MOV     R7,R26       ;发送数据指针在r6r7(dtpint)
        CLR     R11
        INC     R11
        LDI     R16,$30      ;发送数据块长度为$30
        MOV     R12,R16
        RCALL   CRC0         ;得到CRC检测之余式(冲掉$0D&$0A)
        INC     XL
        INC     XL
        LDI     R16,$0D
        ST      X+,R16
        LDI     R16,$0A
        ST      X,R16        ;在数据块末尾加$0D&$0A,实际发送数据块长度为$32
        LDI     R16,$B8      ;允许UART发送和接收,接收中断,发送寄存器空中断,8
;位数据
        OUT     UCR,R16      
        LDI     R16,HIGH(DRPINT)
        MOV     R8,R16
        LDI     R16,LOW(DRPINT)
        MOV     R9,R16       ;r8,r9:接收缓存区指针(FIRST POINT TO $1D0)
        CLR     R10          ;接收数据块长预先清除
        SEI                  ;
HH30:   LDS     R16,$A3
        SBRC    R16,0        ;错误接收?
        RJMP    RCVER        ;错误处理
        SBRS    R16,1        ;接收数据完成?
        RJMP    HH30         ;否,转再查询
RCVEF:  CLR     R11          ;块长予处理
        INC     R11
        DEC     R10
        DEC     R10          ;$0D&$0A不算块长度之内(故将块长减2)
        MOV     R12,R10      ;(R11,R12):块长
        LDI     XH,HIGH(DRPINT)
        MOV     R8,XH
        LDI     XL,LOW(DRPINT)
        MOV     R9,XL
        RCALL   CRC0         ;恢复出CRC余式
        LDI     R16,$0D
        CP      R16,R14
        BRNE    CRCER
        LDI     R16,$0A
        CP      R16,R15      ;恢复出$0D$0A为正确接收
        BREQ    HH30
CRCER:  ;.                   ;循环冗余检测错误处理
        ;.
        ;.
        RJMP    STRT30
RCVER:  CBI     UCR,RXCIE
        ;.                   ;接收错误(FE/OR)处理
        ;.                   ;过程略
        ;.
        RJMP    STRT30
       :UART接收数据块程序    
U_RXC:  PUSH    R16          
        IN      R16,SREG
        PUSH    R16
        PUSH    R26
        PUSH    R27
RSC1:   IN      R16,USR      ;UART状态寄存器
        ANDI    R16,$18      ;FE/OR ERROR?
        BRNE    RVERR        ;错误转
        INC     R10          ;块长加1
        MOV     XH,R8
        MOV     XL,R9        ;r8r9:接收数据指针,首指$1D0
        IN      R16,UDR
        ST      X+,r16       ;
        MOV     R8,XH
        MOV     R9,XL
        CPI     R16,$0A      ;收到最末字符(回车命令LF)?
        BRNE    RSCOM
        LDS     R16,$A3      
        SBR     R16,2        ;建立数据块接收完毕标志
        STS     $A3,R16      
        CBI     UCR,RXCIE    ;禁止接收中断
        RJMP    RSCOM
RVERR:  LDS     R16,$A3
        SBR     R16,1
        STS     $A3,R16      ;$A3,0:FE/OR错误接收标志
RSCOM:  POP     R27
        POP     R26
        POP     R16
        OUT     SREG,R16
        POP     R16
        RETI
;       UART发送数据块程序
U_TXC:  PUSH    R16
        IN      R16,SREG
        PUSH    R16
        PUSH    R26
        PUSH    R27
SPSV1:  MOV     XH,R6         
        MOV     XL,R7        ;发送数据指针,首指$180
        LD      R16,X+       ;取发送数据,调指针
        MOV     R6,XH
        MOV     R7,XL
SPS11:  OUT     UDR,R16      ;送入数据寄存器,写入发送移位寄存器后即引起数据寄存
;器空中断
        CPI     R16,$0A
        BRNE    SPCOM
        CBI     UCR,UDRIE    ;发送最末字符后禁止发送寄存器空中断
        LDI     R16,HIGH(DRPINT)
        MOV     R8,R16
        LDI     R16,LOW(DRPINT)
        MOV     R9,R16       ;接收数据指针初始化,指向$1D0
       ;CBI     USR,6        ;
SPCOM:  POP     R27
        POP     R26
        POP     R16
        OUT     SREG,R16
        POP     R16
        RETI
       .DSEG
       .ORG    $180
DTPINT:.BYTE   $32
         $41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $8C $4D $4B $74 $67
         $42 $4F $66 $78 $47 $45 $44 $63 $32 $48 $60 $7C $6D $45 $76 $63
         $43 $56 $55 $53 $4D $4F $40 $2E $31 $42 $67 $4C $47 $4A $38 $39
         $0D $0A
        .EQU     DRPINT=$1D0
        .ORG     $1D0
DRPINT: .BYTE    $34   ;(内容略)

⌨️ 快捷键说明

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