1.回顾
中断程序代码由两部分组成:中断初始化函数+中断服务函数
void 函数名()
{
中断初始化函数主要写一些中断程序的初始化变量。
}
void 函数名() interrupt 中断号
{
中断服务函数就是写中断执行什么,即紧急事件是什么。(但是为了中断的实时性,有时只写只写中断状态的标志,紧急事件用另一个函数来写,后续实践篇代码有讲)
}
中断初始化函数中体现:
(1)选择触发类型。(有的中断源只有一种类型不需要选择)
(2)控制开关和总开关闭合
还要查看对应的中断号。
2 实践
2.1 任务
2.2 思路
中断之外的主程序都是之前所学内容,这里就不再赘述,主要是中断函数的代码编写。
按结构来写,题目显示中断源是INT0,在指南中查阅到可选择触发类型,所以中断初始函数就包括触发类型,总开关和分开关;(以下降沿触发为例)
void Init_INT0()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
编写中断服务函数,INT0的中断号查阅为0,题目要求用两种方式来实现,第一种方式:直接在中断服务函数中写中断相关操作,即L8点亮;
void INT0() interrupt 0
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
第二种方式,在外部写中断相关操作,则此时在中断服务函数中就要写一个状态来表示进入了中断程序
注意:两种实现方式是有区别的
第一种,中断可能发生在L1亮灯或灭灯的时候,只要中断来了就立马停止
第二种,中断只会发生在L1灭灯的时候,因为执行完Diaplay函数,才进行中断的内容。
2.3 完整代码(以第二种方式为例)
注意这里main函数的写法,要把中断初始函数放在while(1)的外面,中断服务函数不用写进man里面。
#include "stc15f2k60s2.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
void Delay(unsigned int t)
{
while(t--);
}
void selectHC138(unsigned int n)
{
switch(n)
{
case 0:
P2 = (P2 % 0x1f) | 0xff; break;
case 1:
P2 = (P2 & 0x1f) | 0x20; break;
case 2:
P2 = (P2 & 0x1f) | 0x40; break;
case 3:
P2 = (P2 & 0x1f) | 0x60; break;
case 4:
P2 = (P2 & 0x1f) | 0x80; break;
case 5:
P2 = (P2 & 0x1f) | 0xa0; break;
case 6:
P2 = (P2 & 0x1f) | 0xc0; break;
case 7:
P2 = (P2 & 0x1f) | 0xe0; break;
}
}
void Display()
{
selectHC138(4);
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
void close()
{
selectHC138(5);
P0 = 0x00;
selectHC138(4);
P0 = 0xff;
}
void Init_INT0()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
unsigned int flag = 0;
void INT0() interrupt 0
{
flag = 1;
}
void interr()
{
if(flag == 1)
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
flag = 0;
}
void main()
{
close();
Init_INT0();
while(1)
{
Display();
interr();
}
}