如何写中断程序?

如何写中断程序?,第1张

中断函数不用进行函数声明,可以写在MAIN函数前面也可以写在MAIN函数后面。

一、中断服务程序,处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为——中断服务程序。

二、当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。

三、实现这一功能的部件称为中断系统,申请CPU中断的请求源称为中断源,单片机的中断系统一般允许多个中断源,当多个中断源同时向CPU请求中断时,就存在一个中断优先权的问题。通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。

四、保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。

五、分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。恢复被中断进程的现场,CPU继续执行原来被中断的进程。

用c语言的话中断程序是单独写在中断服务函数中的,51单片机的中断服务函数的定义:

void functionname(void) interrupt num //functionname是自己定义的函数名字,num对应实际的中断向量号

先初始化中断,我一外部中断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

}

不明白的可以追问我。


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

原文地址: https://outofmemory.cn/yw/8116323.html

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

发表评论

登录后才能评论

评论列表(0条)

保存