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

📄 uart.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 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)
//
//  涉及的库:	
//
//  组成文件:
//    	 		main.asm/hardware.asm
//	            hardware.inc/hardware.h
//     	
//  日期:          2002-6-12
//===========================================================================================
.INCLUDE	hardware.inc
.DEFINE 	UART_DATA_SIZE  0x0005;

.DATA   								//发送的数据
SendData:	.DW 0x55aa,0xff55,0x1010,0x3344,0x66aa
.ISRAM
.PUBLIC  	RecData     				//接收数据缓冲区
RecData: 	.DW  5 dup(0); 
.VAR 		recNum     				    //接收数据个数
.VAR 		sendNum        				//发送数据个数 
.VAR 		sendFlag;      				//1,发送高8位,0,发送低8位
.VAR 		recFlag        				//1,接收高8位,0,接收低8位
.CODE
//========================================================================
//主程序
//========================================================================
.PUBLIC 	_main;
_main:         
    r2 = 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;		   
	[sendNum] = r1;          			//初始化发送数据个数
    [recNum] = r1;           			//初始化接收数据个数
	r1 = 0x0001 ;   
    [sendFlag] = r1;        			//初始化发送位标识
    [recFlag] = r1;         			//初始化接收位标识
    
    int IRQ;                			//开中断
    
    loop:
       nop;
    goto 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 = [sendFlag];
     r2 ^= 0x0001          
     [sendFlag] = r2;      				//发送位标识取反
     
     r1 = SendData;
     r4 = [sendNum]
     r3 = UART_DATA_SIZE
     cmp r4,r3;             			//数据是否发送结束
     je exit_INT;           			//结束,退出发送
                            			//继续发送处理  
     r1 = r1+r4
     r1 = [r1]              			//取发送数据                         
     r2 = [sendFlag]
     jz  Send_Data; 
                            			//发送一个字的高八位
     
     r1 = r1 lsr 4;
     r1 = r1 lsr 4;         			//发送高8位
     
     r4 += 1;               			//发送的数据加1
     [sendNum] =  r4;
     
Send_Data:  
     [P_UART_Data] = r1 ;   			//发送数据      
     goto exit_INT;     
UART_RECV_IRQ:
     r2 = [recFlag];
     r2 ^= 0x0001           			//接收标识取反
     [recFlag] = r2;
     r4 = [recNum];
     r3 = UART_DATA_SIZE
     cmp r3,r2;            				//数据是否接收结束
     je exit_INT;          				//接收结束,退出接收
                           				//否则,继续接收
     r1 = [P_UART_Data] ;  				//接收数据 
     r2 = [recFlag]        				//接收低8位数据
     jnz  Shift_Data; 
     r3 = r4 + RecData;   			 	//保存数据低8位
     [r3] = r1;
     goto exit_INT;
Shift_Data:                				//接收高8位数据
     r1 = r1 lsl 4
     r1 = r1 lsl 4;
     r2 = [recNum];
     r3 = r2 + RecData;    				//保存数据高8位
     r4 = [r3]
     r4 |= r1;     
     [r3] = r4;
     r2 += 1;							//接收数据数量加1
     [recNum] = r2;        				  
exit_INT:
     pop r1,r5 from [sp];
     int IRQ,FIQ
     reti;
.ENDP;
    
    



   
    	

⌨️ 快捷键说明

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