📄 receive_data.asm
字号:
;文件名: receive_data.asm
;功能: 测试串口中断
;开始日期: 2006-08-31
;完成日期: 2006_08-31
.INCLUDE "m8def.inc" ;器件配置文件
;接收到的一个字节
.DEF RECEIVE_BYTE = R18
;数据接收计数器
.DEF RECEIVE_COUNTER = R17
;接收数据缓冲区
.EQU RECEIVE_BUFFER = $000B
.DEF RECEIVE_BYTE01 = R11
.DEF RECEIVE_BYTE02 = R12
.DEF RECEIVE_BYTE03 = R13
.DEF RECEIVE_BYTE04 = R14
.CSEG
.ORG $0000
;中断向量表
RJMP MAIN ;复位
.ORG $000B
RJMP RECEIVE_DATA ;串口接收
;*******************************************************************************
;主程序
;*******************************************************************************
.ORG $0020
MAIN:
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16
RCALL CPU_INIT
RCALL USART_INIT
MAIN02:
SBIS UCSRA,UDRE
RJMP MAIN02
LDI R16,$5A
OUT UDR,R16
MAIN01:
RJMP MAIN01
;-------------------------------------------------------------------------------
;类别:宏
;名称:RECEIVE_CHECK
;功能:串口接收中断服务程序
;-------------------------------------------------------------------------------
.MACRO RECEIVE_CHECK
NOP
NOP
NOP
LDI R20,$03
.ENDMACRO
;-------------------------------------------------------------------------------
;类别:普通子程序
;名称:USART_INIT:
;功能:对串口进行初始化
;-------------------------------------------------------------------------------
USART_INIT:
;设定波特率为4800(8M时钟)
LDI R16,$67
OUT UBRRL,R16
LDI R16,$00
OUT UBRRH,R16
;允许接收中断,允许接收,允许发送
LDI R16,(1<<RXCIE)|(1<<RXEN)|(1<<TXEN)
OUT UCSRB,r16
;无奇偶校验、8位数据、一个停止位
LDI R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
OUT UCSRC,R16
RET
;-------------------------------------------------------------------------------
;类别:普通子程序
;名称:USART_INIT:
;功能:对串口进行初始化
;-------------------------------------------------------------------------------
CPU_INIT:
NOP
SEI
RET
;-------------------------------------------------------------------------------
;类别:中断服务程序
;名称:RECEIVE_DATA
;功能:串口接收四个字节数据
;-------------------------------------------------------------------------------
RECEIVE_DATA:
PUSH R16
IN R16,SREG
PUSH R16
IN R16,UDR
CPI ZL,LOW(RECEIVE_BUFFER)+3
BREQ RECEIVE_DATA03
;判断接收到的一个字节的最高位是否为1
SBRS R16,7
RJMP RECEIVE_DATA01
RECEIVE_DATA03:
;接收到的数据的最高位为1的操作
ST Z,RECEIVE_BYTE
RECEIVE_CHECK ;对接收到的数据进行校验
;初始化接收指针、接收计数器
LDI ZL,LOW(RECEIVE_BUFFER)
LDI ZH,HIGH(RECEIVE_BUFFER)
LDI RECEIVE_COUNTER,$04
RJMP RECEIVE_DATA02
RECEIVE_DATA01:
;接收的数据的最高位为0的操作
ST Z+,R16
RECEIVE_DATA02:
POP R16
OUT SREG,R16
POP R16
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -