📄 main.asm
字号:
//======================================================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//========================================================================================
// 工程名称: book_UART.spj
// 功能描述: 异步通讯自发自收程序
// 准备5个数据分别是'0x55aa,0xff55,0x1010,0x3344,0x66aa' 发送
// 同时程序接收自身发送的数据,
// 文件来源: 《SPCE061单片机原理及应用技术》第五章 中断系统,第197页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
//
// 涉及的库: CMacro.lib
//
// 组成文件:
// main.asm/hardware.asm
// hardware.inc/hardware.h
//
// 日期: 2002-6-12
//===========================================================================================
.INCLUDE hardware.inc
.DEFINE UART_DATA_SIZE 0x0005;
.DEFINE P_WatchDog_Clear 0x7012
.DATA //发送的数据
C_SendData: .DW 0x55aa,0xff55,0x1010,0x3344,0x66aa
.ISRAM
.PUBLIC C_RecData //接收数据缓冲区
C_RecData: .DW 5 dup(0);
.VAR C_RecNum //接收数据个数
.VAR C_SendNum //发送数据个数
.VAR C_SendFlag; //1,发送高8位,0,发送低8位
.VAR C_RecFlag //1,接收高8位,0,接收低8位
.CODE
//========================================================================
//主程序
//========================================================================
.PUBLIC _main;
_main:
r2 = C_RecData;
_UART_INIT:
F_UART_INIT:
r1 = 0x0480; //设置IOB7为输入IOB10为输出
[P_IOB_Attrib] = r1;
r1 = 0x0400;
[P_IOB_Dir] = r1;
r1 = 0x0000;
[P_IOB_Data] = r1;
r1 = 0x006b; //设置波特率 114.84KHz(~=115.2KHz)
[P_UART_BaudScalarLow] = r1;
r1 = 0x0000;
[P_UART_BaudScalarHigh] = r1;
r1 = 0x00C0;
[P_UART_Command1] = r1; //开接收发送中断
[P_UART_Command2] = r1; //使能RX和TX
r1 = 0x0000;
[C_SendNum] = r1; //初始化发送数据个数
[C_RecNum] = r1; //初始化接收数据个数
r1 = 0x0001 ;
[C_SendFlag] = r1; //初始化发送位标识
[C_RecFlag] = r1; //初始化接收位标识
int IRQ; //开中断
loop:
r1=0x0001;
[P_WatchDog_Clear]=r1; //清看门狗
nop;
jmp loop;
//=============================================================================
//串口中断
//描述:在发送中断中发送数据,接收中断中接收数据
//注意:串口异步通讯每次只能收发一个字节的数据,所以无论是
// 接收数据和发送数据需进行移位处理
//参数:无
//返回:无
//=============================================================================
.TEXT
.PUBLIC _IRQ7
UART_RECC_IRQ:.PROC
_IRQ7:
INT OFF
push r1,r5 to [sp]
r1 = 0x0080 //判断是接收还是发送数据
test r1,[P_UART_Command2]
jnz UART_RECV_IRQ;
//发送数据处理
UART_SEND_IRQ:
r2 = [C_SendFlag];
r2 ^= 0x0001
[C_SendFlag] = r2; //发送位标识取反
r1 = C_SendData;
r4 = [C_SendNum]
r3 = UART_DATA_SIZE
cmp r4,r3; //数据是否发送结束
je exit_INT; //结束,退出发送
//继续发送处理
r1 = r1+r4
r1 = [r1] //取发送数据
r2 = [C_SendFlag]
jz Send_Data;
//发送一个字的高八位
r1 = r1 lsr 4;
r1 = r1 lsr 4; //发送高8位
r4 += 1; //发送的数据加1
[C_SendNum] = r4;
Send_Data:
[P_UART_Data] = r1 ; //发送数据
jmp exit_INT;
UART_RECV_IRQ:
r2 = [C_RecFlag];
r2 ^= 0x0001 //接收标识取反
[C_RecFlag] = r2;
r4 = [C_RecNum];
r3 = UART_DATA_SIZE
cmp r3,r2; //数据是否接收结束
je exit_INT; //接收结束,退出接收
//否则,继续接收
r1 = [P_UART_Data] ; //接收数据
r2 = [C_RecFlag] //接收低8位数据
jnz Shift_Data;
r3 = r4 + C_RecData; //保存数据低8位
[r3] = r1;
jmp exit_INT;
Shift_Data: //接收高8位数据
r1 = r1 lsl 4
r1 = r1 lsl 4;
r2 = [C_RecNum];
r3 = r2 + C_RecData; //保存数据高8位
r4 = [r3]
r4 |= r1;
[r3] = r4;
r2 += 1; //接收数据数量加1
[C_RecNum] = r2;
exit_INT:
pop r1,r5 from [sp];
int IRQ
reti;
.ENDP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -