?? 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.
//======================================================================
//======================================================================
// 工程名稱: ex13_asm_IRQ6
// 功能描述: 《實驗儀實驗指導(dǎo)書》基礎(chǔ)應(yīng)用實驗
// IRQ6中斷
// 使用IRQ6的時基信號使LED按照設(shè)定頻率閃爍
// IDE環(huán)境: SUNPLUS u'nSPTM IDE 2.0.0(or later)
// 涉及的庫: CMacro1016.lib
// 組成文件: main.asm
// 硬件連接: LED_SEG的IOA0~7分別與a~h連接
// LED_DIG的IOB6連接DIG5
// 維護(hù)記錄: 2005-09-12 v1.0
//
//======================================================================
//======================================================================
// 文件名稱: main.asm
// 功能描述: 使用IRQ6的時基信號使LED按照設(shè)定頻率閃爍
// 維護(hù)記錄: 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);
// 實現(xiàn)功能: 使用IRQ6的時基信號使LED按照設(shè)定頻率閃爍
// 入口參數(shù): 無
// 出口參數(shù): 無
// 破壞寄存器:r1,r2
//===========================================================================
.PUBLIC _main
_main:
int off //關(guān)閉中斷
r1 = 0x0000 //計數(shù)器變量清零
[Count_128Hz] = r1
[Count_64Hz] = r1
r1 = 0x00ff //設(shè)置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 //時基計數(shù)器復(fù)位與時間校準(zhǔn)
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總中斷使能,關(guān)閉FIQ中斷總使能
?Loop:
r1 = 0x0001
[P_Watchdog_Clear] = r1 //清看門狗
jmp ?Loop
.TEXT
//=========================================================================
// 匯編格式: _IRQ6
// C格式: 無
// 實現(xiàn)功能: IRQ6中斷服務(wù)程序
// 入口參數(shù): 無
// 出口參數(shù): 無
// 破壞寄存器:無
//=========================================================================
.PUBLIC _IRQ6
_IRQ6:
push r1,r5 to [sp]
r1 = C_IRQ6_TMB1
test r1,[P_INT_Ctrl] //判斷是否是TMB1中斷?
jnz ?IRQ6_TMB1 //如是,則跳轉(zhuǎn)到?IRQ6_TMB1
?IRQ6_TMB2: //TMB2中斷服務(wù)程序
r1 = [Count_128Hz] //
cmp r1,0x0080 //比較計數(shù)器變量是否等于128
je ?Set128HzFlag //等于則跳轉(zhuǎn)到?Set128HzFlag
r1 += 1 //累加1
[Count_128Hz] = r1
jmp ?Loop128HzExit
?Set128HzFlag:
r1 = [P_IOA_Buffer]
r1 ^= 0x00f0 //IOA7~4數(shù)據(jù)取反
[P_IOA_Data] = r1 //輸出
r1 = 0x0000
[Count_128Hz] = r1 //計數(shù)器變量清零
?Loop128HzExit:
r1 = C_IRQ6_TMB2
[P_INT_Clear] = r1 //清128Hz中斷標(biāo)志
pop r1,r5 from [sp]
reti
?IRQ6_TMB1:
r1 = [Count_64Hz]
cmp r1,0x0080 //比較計數(shù)器變量是否等于128
je ?Set64HzFlag //等于則跳轉(zhuǎn)到?Set64HzFlag
r1 += 1 //累加1
[Count_64Hz] = r1
jmp ?Loop64HzExit
?Set64HzFlag:
r1 = [P_IOA_Buffer]
r1 ^= 0x000f //IOA口低四位數(shù)據(jù)取反
[P_IOA_Data] = r1 //輸出
r1 = 0x0000
[Count_64Hz] = r1 //計數(shù)器清0
?Loop64HzExit:
r1 = C_IRQ6_TMB1
[P_INT_Clear] = r1 //清64Hz中斷標(biāo)志
pop r1,r5 from [sp]
reti
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -