📄 main.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 + -