汇编 中断处理程序怎么写?

汇编 中断处理程序怎么写?,第1张

mov di,2000
delay:
mov si,3000
delay1:
dec si
jnz delay
这段就是main process
改成你要的判断
还有也不要用21h了,换个保留的中断号就行了

标准c语言没有中断调用机制,但是不同编译器都有相应的中断处理方式,可以使用户实现中断功能。
解决方案:
1、采取轮询的方式解决,就是每10毫秒检查一下是否有键盘请求,总的来说,这样基本上可以解决问题,而且简单易行,但每10毫秒都要检查,系统消耗太大。
2、采取中断的方式:
(1)用高级语言调用中断来处理问题。中断是cpu响应一个中断外围设备8259A的一个过程,当键盘敲击,cpu保存断点暂停执行并且跳到相应的中断处理程序继续执行,结束后根据断点再跳回来。通过这种方式可以轻松+愉快地解决这个问题。但是需要用到高级语言调用汇编,根据编译器的不同而有所差别。
(2)自己模拟中断。可以另外建立一个线程专门响应键盘的敲击,如果有敲击则打断主线程。这样做实现起来很复杂,而且涉及到不少复杂的关键技术,比如信号量之类的东西。
3、强大的vc
vc采取了消息映射的机制来处理外部设备的请求,比如时钟中断、键盘中断等等。通过此可以灰常灰常容易的处理外部中断。

关于c的中断使用一般是,定义函数的时候在后面加上interrupt
n
其中
n
对应中断源的编号,其值从
0
开始,以
80c51
单片机为例,编号从
0~4,分别对应外中断
0
定时器0
中断外部中断
1
定时器1
中断和串行口中断

void
xxxx(void)interrupt
n//中断服务函数
{
要写的中断服务程序
}

先初始化中断,我一外部中断1-4为例,中断程序请看下方:
void Key_Init(void)
{
rGPFCON&=~((3<<2)|(3<<4)|(3<<6)|(3<<8));//初始化GPF1,GPF2,GPF3,GPF4(分别对应KEY2,KEY3,KEY4,KEY5)
rGPFCON|=(2<<2)|(2<<4)|(2<<6)|(2<<8);//将GPF1,GPF2,GPF3,GPF4分别设置为EINT
}
然后设置中断控制寄存器
void Irq_Init(void)
{
rINTMSK &= ~((1<<2)|(1<<3)|(1<<4)|(1<<5));//将INTMSK(中断屏蔽寄存器)中的EINT1-4_7设置为可服务状态
rEINTMASK &= ~((1<<4));//外部中断屏蔽寄存器(KEY1,KEY2,KEY3和KEY4分别对应EINT4)
}
然后就要写中断服务函数了。
void Isr_Init(void)
{
pISR_EINT1=(unsigned int)Eint1_Isr;
}
void __irq Eint1_Isr(void)
{
unsigned long val;
val=rEINTPEND;
if(val&(1<<1))
{
rEINTPEND |=1<<8;
Led1_On();
Delay1s();
Led1_Off();
}
rSRCPND |=1<<1;
rINTPND |=1<<1;
}
不明白的可以追问我。

000BH 0030H是这两个中断的入口地址,也就是发生中断后将要跳到这里来
T0INT,T1INT都是中断子程序的名字,也相当于地址,我们要跳到那个地方去执行中断子程序!!!!
在程序中,一般只有中断才会用到保护和恢复现场,我到现在还没有看见其它情况用它们的!!!
你的第3个问题就要看你用什么IC了,有的IC自带的有那些功能,你就不需要了,但是51是需要的至于子程序那就不用中断首地址了,因为你掉用的子程序是固定的,不象中断,不知道发生在什么地方,不好把中断子程序放置,才要定义中断入口!!!!

SIGNAL(中断向量名)
{
//中断处理程序
}
中断向量名的定义在iom16h头文件中,文件位置在winavr安装目录/avr/include/avr下
如果没记错的话定时器2匹配中断名应该是 TIMER2_COMP_vect
友情提示:
1中断程序中 *** 作的变量应在声明时加上 volatile 声明,否则gcc不认,会被优化掉
2切忌只有sei();开全局中断后才能进中断响应程序
3中断第一句话建议cli();关中断,最后一句话sei();开中断。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13165764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-14
下一篇 2023-06-14

发表评论

登录后才能评论

评论列表(0条)

保存