📄 ints.asm
字号:
//////////////////////////////////////////////////
//描述:利用定时器B 定时0.5s 使A口低四位的LED闪烁
//利用时基信号1024Hz 中断定时1s,使IOA4--IOA7连接的LED闪烁
//硬件连接:IOA0--IOA3接4个LED
// IOA4--IOA7接4个LED
///////////////////////////////////////////////////
.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
.RAM
.VAR C_IOA_LED1,C_IOA_LED2 //C_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;
goto 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;
goto exit_int;
l_irq4_2k:
goto exit_int;
l_irq4_1k:
r1 = [C_Clock_Cnt]
cmp r1,1024;
je LED_pro;
r1 += 1;
[C_Clock_Cnt] = r1;
r1 = 0x0010
goto 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 + -