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

📄 main.asm

📁 电压控制程序,符合各种设备需要,核心程序,IBm专属
💻 ASM
字号:
//=======================================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//=======================================================================

//=======================================================================
//	工程名称:	ex11_asm_IRQ4
//	功能描述:	《实验仪实验指导书》基础应用实验
//              IRQ4中断
//				使用IRQ4使1*8LED按照设定的频率闪烁
//  IDE环境:   SUNPLUS u'nSPTM  IDE 2.0.0(or later)
//	涉及的库:	CMacro1016.lib
//	组成文件:	main.asm
//	硬件连接:	LED_SEG接口的IOA0~7与a~h分别连接
//				LED_DIG接口的IOB6与DIG5连接
//	维护记录:	2005-09-12	v1.0
//
//========================================================================

//========================================================================
//	文件名称:	main.asm
//	功能描述:	使用IRQ4使1*8LED按照设定的频率闪烁
//	维护记录:	2005-09-12	v1.0
//========================================================================
.DEFINE	P_IOA_Data			0x7000
.DEFINE	P_IOA_Buffer		0x7001
.DEFINE P_IOA_Dir			0x7002
.DEFINE P_IOA_Attrib		0x7003
.DEFINE	P_IOB_Data			0x7005
.DEFINE	P_IOB_Buffer		0x7006
.DEFINE P_IOB_Dir			0x7007
.DEFINE P_IOB_Attrib		0x7008

.DEFINE P_INT_Ctrl			0x7010
.DEFINE P_INT_Clear			0x7011
.DEFINE P_Watchdog_Clear	0x7012

.DEFINE C_IRQ4_1KHz			0x0010
.DEFINE C_IRQ4_2KHz			0x0020
.DEFINE C_IRQ4_4KHz			0x0040

.RAM
.VAR	Count_4K
.VAR	Count_2K
.VAR	Count_1K

.CODE

//==========================================================================
//	汇编格式:	_main
//	C格式:		int main(void);
//	实现功能:	使用IRQ4使1*8LED按照设定的频率闪烁
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:r1,r2
//==========================================================================

.PUBLIC	_main
_main:
	int off							//关闭中断
	
	r1 = 0x0040						//IOB6输出高电平
	[P_IOB_Dir] = r1
	[P_IOB_Attrib] = r1
	[P_IOB_Data] = r1

	r1 = 0x00ff						//设置IOA口低8位为同相输出口
	[P_IOA_Dir] = r1
	[P_IOA_Attrib] = r1
	[P_IOA_Data] = r1				//初始化输出为高电平

	r1 = C_IRQ4_1KHz | C_IRQ4_2KHz | C_IRQ4_4KHz
	[P_INT_Ctrl] = r1				//打开IRQ4的1KHz、2KHz、4KHz的时基中断
	
	int irq							//打开IRQ总中断,关闭FIQ总中断
?Loop:
	r1 = 0x0001
	[P_Watchdog_Clear] = r1         //清看门狗
	jmp ?Loop

.TEXT
//==================================================================================
//	汇编格式:	_IRQ4
//	C格式:		无
//	实现功能:	IRQ4中断服务程序,在中断服务程序当中,各时基
//				的中断响应服务程序里对计数器进行累加,当累加
//				到1024时,则翻转对应的IO口输出,并清对应的计
//				数器
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:无
//===================================================================================
.PUBLIC _IRQ4
_IRQ4:
	push r1,r5 to [sp]
	r1 = [P_INT_Ctrl] 
	test r1,C_IRQ4_1KHz				//是否为IRQ4的1KHZ中断?
	jnz ?L_IRQ4_1KHz
	test r1,C_IRQ4_2KHz				//是否为IRQ4的2KHz中断?
	jnz ?L_IRQ4_2KHz
?L_IRQ4_4KHz:						//IRQ4的4KHz中断
	r1 = [Count_4K]					//读取计数器中的数值
	cmp r1,0x0400					//与0x0400(即1024)比较,即是否到0.25s
	je ?Set4KFlag					//等于则转向?Set4KFlag程序
	r1 += 1							//不等则继续累加
	[Count_4K] = r1
	jmp ?Loop4KExit
?Set4KFlag:
	r1 = [P_IOA_Buffer]					
	r1 ^= 0x00f0					//对上次输出的数据的b4~b7位取反
	[P_IOA_Data] = r1               //输出
	r1 = 0x0000                     
	[Count_4K] = r1					//计数器清零
?Loop4KExit:
	r1 = C_IRQ4_4KHz
	[P_INT_Clear] = r1				//清中断标志位
	pop r1,r5 from [sp]
	reti
	
?L_IRQ4_2KHz:						//IRQ4的2KHz中断
	r1 = [Count_2K]                 //读取计数器中的数值
	cmp r1,0x0400					//与0x0400(即1024)比较,即是否到0.5s
	je ?Set2KFlag                   //等于则转向?Set2KFlag程序
	r1 += 1                         //不等于则继续累加计数
	[Count_2K] = r1
	jmp ?Loop2KExit
?Set2KFlag:
	r1 = [P_IOA_Buffer]
	r1 ^= 0x000c					//翻转IOA口b2、b3位数据
	[P_IOA_Data] = r1               //输出
	r1 = 0x0000
	[Count_2K] = r1	                //计数器清零
?Loop2KExit:
	r1 = C_IRQ4_2KHz
	[P_INT_Clear] = r1
	pop r1,r5 from [sp]
	reti
	
?L_IRQ4_1KHz:
	r1 = [Count_1K]                 //读取计数器中的数值
	cmp r1,0x0400					//与0x0400(即1024)比较,即是否到0.5s
	je ?Set1KFlag                   //等于则转向?Set1KFlag程序
	r1 += 1                         //不等于则继续累加计数
	[Count_1K] = r1         
	jmp ?Loop1KExit
?Set1KFlag:
	r1 = [P_IOA_Buffer]
	r1 ^= 0x0003					//翻转IOA口b0、b1位数据
	[P_IOA_Data] = r1               //输出
	r1 = 0x0000
	[Count_1K] = r1	                //计数器清零
?Loop1KExit:
	r1 = C_IRQ4_1KHz
	[P_INT_Clear] = r1              //清中断标志
	pop r1,r5 from [sp]
	reti

⌨️ 快捷键说明

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