📄 main.asm
字号:
//======================================================================================
//
// The information contained herein is the exclusive property of
// Sunplus Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
//
// (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.
// ALL RIGHTS RESERVED
//
// The entire notice above must be reproduced on all authorized copies.
//
//========================================================================================
// 工程名称: book_INTs.spj
// 功能描述: 利用定时器B 定时0.5s 使A口低四位的LED闪烁
// 利用时基信号1024Hz 中断定时1s,使IOA4--IOA7连接的LED闪烁。
// 硬件连接: IOA0--IOA3接4个LED
// IOA4--IOA7接4个LED
// 文件来源: 《SPCE061单片机原理及应用技术》第五章 中断系统,第205页
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.0(or later)
//
// 涉及的库: CMacro.lib
//
// 组成文件:
// main.asm/hardware.asm
// hardware.inc/hardware.h
//
// 日期: 2002-6-12
//===========================================================================================
.INCLUDE hardware.inc
.DEFINE RUN_TIMERB 0x0400 //定义启动定时器
.DEFINE TIMER_DATA_FOR_4KHZ (0xffff - 2048) //定时0.5秒F
.DEFINE RUN_TIMEBASE_1024 0x0010 //时基信号1024hz中断位
.DEFINE TIMER_CLKA_4096 0x0004; //时钟源A 选择4096Hz
.DEFINE P_WatchDog_Clear 0x7012
.RAM
.VAR C_IOA_LED1,C_IOA_LED2 //C_IOA_LED1为定时器B LED亮灭数据,C_IOA_LED2为时基信号LED亮灭的数据
.VAR C_Clock_Cnt; //时基信号的计数器
.CODE
.PUBLIC _main
_main:
int off
r1=0xffff //IOA口为输出口
[P_IOA_Attrib]=r1
[P_IOA_Dir]=r1
r1=0x00ff
[P_IOA_Data]=r1;
[C_IOA_LED1] = r1;
[C_IOA_LED2] = r1;
//定时器B的预置数
r1 = TIMER_DATA_FOR_4KHZ
[P_TimerB_Data]=r1
//定义使用的时钟源频率时钟源A为4096Hz时
r1 = TIMER_CLKA_4096
[P_TimerB_Ctrl]=r1
//开放定时器B中断和时基信号1024hz中断
r1 = RUN_TIMEBASE_1024 + RUN_TIMERB
[P_INT_Ctrl]=r1
INT IRQ //开IRQ中断
//空操作
loop:
nop;
r1=0x0001; //清看门狗
[P_WatchDog_Clear]=r1;
jmp loop;
//==================================================================
//定时器A中断程序
//功能:使IOA0--IOA3位接的4个LED0.5s闪烁
//===================================================================
.TEXT
.PUBLIC _IRQ2;
_IRQ2:
push r1,r5 to [sp] //现场保护
r1 = [C_IOA_LED1] //LED 赋值
r1 &= 0x000f;
r2 = [P_IOA_Data]
r2 &= 0x00f0;
r1|=r2
[P_IOA_Data]=r1
r1 ^= 0xffff;
[C_IOA_LED1] = r1;
//清中断
r1=0x0400
[P_INT_Clear]=r1
//恢复现场
pop r1,r5 from [sp]
reti //返回
//===================================================================
//1024Hz时基信号中断
//功能:使IOA4--IOA7接的4个LED 1秒闪烁
//===================================================================
.TEXT
.PUBLIC _IRQ4
_IRQ4:
push r1,r5 to [sp] //压栈保护;
r1=0x0010;
test r1,[P_INT_Ctrl]; //比较是否为1KHz的中断源;
jnz l_irq4_1k; //是,则转至对应程序段;
r1=0x0020;
test r1,[P_INT_Ctrl] //否,则比较是否为2KHz的中断源;
jnz l_irq4_2k; //是,则转至对应程序段;
l_irq4_4k: //否,则进入4KHz程序段;
r1 = 0x0040;
jmp exit_int;
l_irq4_2k:
jmp exit_int;
l_irq4_1k:
r1 = [C_Clock_Cnt]
cmp r1,1024;
je LED_pro;
r1 += 1;
[C_Clock_Cnt] = r1;
r1 = 0x0010
jmp exit_int;
//LED赋值
LED_pro:
r1 = [C_IOA_LED2]
r1 &= 0x00f0
r2 = [P_IOA_Data]
r2 &= 0x000f
r1 |= r2
[P_IOA_Data]=r1
r1 ^= 0xffff;
[C_IOA_LED2] = r1;
r1 = 0x0000
[C_Clock_Cnt] = r1; //清时基计数器
r1 = 0x0010
exit_int:
[P_INT_Clear] = r1;
pop r1,r5 from [sp]
reti;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -