📄 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.
//======================================================================
//======================================================================
// 工程名称: ex15_asm_IRQ3_KEY_WAKEUP
// 功能描述: 《实验仪实验指导书》基础应用实验
// 键唤醒
// 实现触键唤醒功能,按键S20(接在IOA0)进入睡眠状态,然后
// 按S21(接在IOA1)唤醒
// IDE环境: SUNPLUS u'nSPTM IDE 2.0.0(or later)
// 涉及的库: CMacro1016.lib
// 组成文件: main.asm
// 硬件连接: KEYPAD接口的IOA7~6分别与COL1~2连接,IOA8与ROW连接
// IOB8~15与LED_SEG接口的a~h连接
// LED_DIG接口的IOB6与DIG5连接
// 维护记录: 2005-09-12 v1.0
//
//======================================================================
//======================================================================
// 文件名称: main.asm
// 功能描述: 实现触键唤醒功能,按键S20进入睡眠状态,然后按S21键唤醒
// 维护记录: 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_IOA_Latch 0x7004
.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_SystemClock 0x7013
.DEFINE C_IRQ3_KEY 0x0080
.DEFINE C_IRQ3_EXT1 0x0100
.DEFINE C_IRQ3_EXT2 0x0200
.RAM
.CODE
//=======================================================================
// 汇编格式: _main
// C格式: int main(void);
// 实现功能: 实现触键唤醒功能,按键S20进入睡眠状态,
// 然后按S21键唤醒
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:r1,r2
//========================================================================
.PUBLIC _main
_main:
int off //关闭中断
r1 = 0xff40 //设置IOB7~15为低电平输出,IOB6高电平输出
[P_IOB_Dir] = r1
r1 = 0xff40
[P_IOB_Attrib] = r1
r1 = 0x0040
[P_IOB_Data] = r1
?Loop:
r1 = 0x0100 //设置IOA7~6为下拉输入, IOA8输出高
[P_IOA_Dir] = r1
[P_IOA_Attrib] = r1
[P_IOA_Data] = r1
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
r1 = [P_IOA_Data]
test r1,0x0080 //IOA7接的键是否按下?
jz ?Loop //否则循环
?LoopKeyUp:
r1 = 0x0001
[P_Watchdog_Clear] = r1
r1 = [P_IOA_Data]
test r1,0x0080 //IOA7接的键是否还在按下?
jnz ?LoopKeyUp //如还按下,则跳转循环等待放开
r1 = [P_IOA_Attrib] //仅使能IOA6的键唤醒(其他位设为屏蔽唤醒的悬浮输入)
r1 |= 0x00bf
[P_IOA_Attrib] = r1
r1 = [P_IOA_Buffer]
r1 |= 0x00bf
[P_IOA_Data] = r1
r1 = C_IRQ3_KEY
[P_INT_Clear] = r1 //先清触键唤醒中断标志
r1 = C_IRQ3_KEY //使能触键唤醒中断
[P_INT_Ctrl] = r1
int irq //打开IRQ总中断,同时关闭FIQ总中断
r1 = 0x0040
[P_IOB_Data] = r1 //IOB8~15输出低电平
r1 = [P_IOA_Latch] //锁存IOA口低8位数据,用于唤醒
r1 = 0x0007
[P_SystemClock] = r1 //进入睡眠
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看门狗
goto ?Loop
.TEXT
//========================================================
// 汇编格式: _IRQ3
// C格式: 无
// 实现功能: IRQ3中断服务程序
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器:无
//========================================================
.PUBLIC _IRQ3
_IRQ3:
push r1,r5 to [sp]
r1 = C_IRQ3_KEY
test r1,[P_INT_Ctrl] //判断是不是键唤醒中断
jz ?Exit //不是,转向?Exit
r1 = [P_IOB_Buffer]
r1 |= 0xff00 //IOB高八位输出高电平
[P_IOB_Data] = r1
?Exit:
int off //关中断
r1 = C_IRQ3_KEY
[P_INT_Clear] = r1 //清键唤醒中断标志
pop r1,r5 from [sp]
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -