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

📄 main.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.
//
//========================================================================================
//  工程名称:  many_int.spj
//  功能描述:   FIQ有FIQ_PWM、FIQ_TMA和FIQ_TMB三个中断源,当定时器A或B
//  			计满溢出时产生中断请求信号TA_TIMEOUT_INT或TA_TIMEOUT_INT,
//              CPU响应后进入中断执行相应的子程序控制二极管发光。
//  文件来源: 《SPCE061单片机原理及应用技术》第五章 中断系统,第201页
//  IDE环境:  	SUNPLUS u'nSPTM  IDE 1.8.0(or later)
//
//  涉及的库:	CMacro.lib
//
//  组成文件:
//    	 		main.asm
//	            
//     	
//  日期:          2002-6-12
//===========================================================================================

.DEFINE		P_IOA_Data  	 0x7000;
.DEFINE		P_IOA_Dir   	 0x7002;
.DEFINE		P_IOA_Attri 	 0x7003;
.DEFINE		P_IOB_Data  	 0x7005;
.DEFINE		P_IOB_Dir   	 0x7007;
.DEFINE		P_IOB_Attri		 0x7008;
.DEFINE		P_INT_Ctrl		 0x7010;
.DEFINE		P_INT_Clear		 0x7011;
.DEFINE		P_TimerA_Data	 0x700A;
.DEFINE		P_TimerA_Ctrl	 0x700B;
.DEFINE		P_TimerB_Data	 0x700C;
.DEFINE		P_TimerB_Ctrl	 0x700D;
.DEFINE		timea_clk		 0x020d; //1024hz
.DEFINE		timeb_clk		 0x0004; //4096hz
.DEFINE		P_WatchDog_Clear 0x7012
.RAM

.VAR TA_Flag
.VAR TB_Flag

.CODE
.PUBLIC _main
_main:
	int off 
	r1 = 0xffff 				//IOA口为输出口;
	[P_IOA_Attri] = r1 
	[P_IOA_Dir] = r1 
	r1 = 0x0000 
	[P_IOA_Data] = r1 
	
	r1 = 0xffff 				//B口的低8位设置为输出  
    [P_IOB_Dir] = r1 
	[P_IOB_Attri] = r1 
	r1 = 0x0000 
	[P_IOB_Data] = r1
	
	r1 = 0xff9f;
	[P_TimerA_Data] = r1;
	[P_TimerB_Data] = r1;
	r1 = timea_clk;	 
	[P_TimerA_Ctrl] = r1;
	
	r2 = 0x0004 			  	//开中断IRQ0_TMA、IRQ1_TMA、IRQ1_TMB
	r1 = 0x2000 			  	//开中断FIQ_PWM、FIQ_TMA、FIQ_TMB
	r1 |= r2;
	[P_INT_Ctrl] = r1
   

	int IRQ,FIQ;

loop:
	nop
	r1=0x0001;
	[P_WatchDog_Clear]=r1;
	nop
	jmp loop

.TEXT	
.PUBLIC _FIQ		
_FIQ:
   push r1,r5 to [sp]			//压栈保护 
   

   r1 = 0x0800 
   r2 = [P_INT_Ctrl]	    
   test r1,[P_INT_Ctrl] 		//比较是否为FIQ_TMB	 
   jnz  FIQ_TMB	 				//是,则转至对应程序段 
   r1 = 0x2000 	    
   test r1,[P_INT_Ctrl] 		//否,则比较是否为FIQ_TMA
   jnz  FIQ_TMA 				//是,则转至对应程序段 
 	    
   
FIQ_PWM:						//否,则进入FIQ_PWM中断
	r1 = 0x8000 	     
	[P_INT_Clear] = r1 
	
	pop r1,r5 from [sp]   
	reti

FIQ_TMA:
   r1 = [TA_Flag]
   
   r1 ^= 0xffff 			 			 
   [P_IOA_Data] = r1   
   [TA_Flag] = r1
   r1 = 0x2000 	     
   [P_INT_Clear] = r1 
   pop r1,r5 from [sp]
   reti 

FIQ_TMB:
   
   r1 = 0x0800  	     
   [P_INT_Clear] = r1 
   pop r1,r5 from [sp]
   reti

    	            
.TEXT	
.PUBLIC _IRQ5
_IRQ5:	
	push r1,r5 to [sp]			//压栈保护    
    r1 = 0x0008 	    
	test r1,[P_INT_Ctrl] 		//比较是否为4Hz的中断源
    jnz l_irq5_4 				//是,则转至对应程序段
   	
l_irq5_2:
     nop;
     nop;
     nop
    r1 = 0xffff				   //否,则进入2Hz程序段			 
	[P_IOA_Data]=r1   
    jmp l_irq5_2;

LED2Hz_RET:
    r1=0x0004      
	[P_INT_Clear]=r1 
    pop r1,r5 from [sp]
    RETI    
l_irq5_4:    
	[P_INT_Clear]=r1 
    pop r1,r5 from [sp]
    RETI

⌨️ 快捷键说明

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