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

📄 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.
//======================================================================

//======================================================================
//	工程名称:	ex13_asm_IRQ6
//	功能描述:	《实验仪实验指导书》基础应用实验
//              IRQ6中断
//				使用IRQ6的时基信号使LED按照设定频率闪烁
//  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
//	功能描述:	使用IRQ6的时基信号使LED按照设定频率闪烁
//	维护记录:	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 P_TimeBase_Setup	0x700E
.DEFINE P_TimeBase_Clear	0x700F

.DEFINE C_IRQ6_TMB2			0x0001
.DEFINE C_IRQ6_TMB1			0x0002

.RAM
.VAR	Count_128Hz
.VAR	Count_64Hz

.CODE

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

.PUBLIC	_main
_main:
	int off							//关闭中断
	
	r1 = 0x0000						//计数器变量清零
	[Count_128Hz] = r1
	[Count_64Hz] = r1
	
	r1 = 0x00ff						//设置IOA7~0为同相高电平输出
	[P_IOA_Dir] = r1
	[P_IOA_Attrib] = r1
	[P_IOA_Data] = r1
	 
	r1 = 0x0040						//IOB输出高电平
	[P_IOB_Dir] = r1
	[P_IOB_Attrib] = r1
	[P_IOB_Data] = r1
	
	r1 = 0x0000
	[P_TimeBase_Clear] = r1			//时基计数器复位与时间校准
	r1 = 0x0003
	[P_TimeBase_Setup] = r1			//TMB1选择64Hz,TMB2选择128Hz

	r1 = C_IRQ6_TMB2 | C_IRQ6_TMB1
	[P_INT_Ctrl] = r1				//打开TMB1和TMB2中断
	
	int irq							//打开IRQ总中断使能,关闭FIQ中断总使能
?Loop:
	r1 = 0x0001
	[P_Watchdog_Clear] = r1         //清看门狗
	jmp ?Loop

.TEXT
//=========================================================================
//	汇编格式:	_IRQ6
//	C格式:		无
//	实现功能:	IRQ6中断服务程序
//	入口参数:	无
//	出口参数:	无
//	破坏寄存器:无
//=========================================================================
.PUBLIC _IRQ6
_IRQ6:
	push r1,r5 to [sp]
	r1 = C_IRQ6_TMB1
	test r1,[P_INT_Ctrl]			//判断是否是TMB1中断?
	jnz ?IRQ6_TMB1					//如是,则跳转到?IRQ6_TMB1
?IRQ6_TMB2:							//TMB2中断服务程序
	r1 = [Count_128Hz]				//
	cmp r1,0x0080					//比较计数器变量是否等于128
	je ?Set128HzFlag				//等于则跳转到?Set128HzFlag
	r1 += 1							//累加1
	[Count_128Hz] = r1
	jmp ?Loop128HzExit
?Set128HzFlag:
	r1 = [P_IOA_Buffer]
	r1 ^= 0x00f0					//IOA7~4数据取反
	[P_IOA_Data] = r1               //输出
	r1 = 0x0000
	[Count_128Hz] = r1				//计数器变量清零
?Loop128HzExit:
	r1 = C_IRQ6_TMB2
	[P_INT_Clear] = r1              //清128Hz中断标志
	pop r1,r5 from [sp]
	reti
	
?IRQ6_TMB1:
	r1 = [Count_64Hz]
	cmp r1,0x0080					//比较计数器变量是否等于128
	je ?Set64HzFlag                 //等于则跳转到?Set64HzFlag
	r1 += 1                         //累加1
	[Count_64Hz] = r1
	jmp ?Loop64HzExit
?Set64HzFlag:
	r1 = [P_IOA_Buffer]
	r1 ^= 0x000f                    //IOA口低四位数据取反
	[P_IOA_Data] = r1               //输出
	r1 = 0x0000
	[Count_64Hz] = r1	            //计数器清0   
?Loop64HzExit:
	r1 = C_IRQ6_TMB1      
	[P_INT_Clear] = r1              //清64Hz中断标志
	pop r1,r5 from [sp]
	reti

⌨️ 快捷键说明

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