这次给大家带来中断的话题。中断可以说是计算机的法宝。如果想让计算机听从你的实时命令,又不耽误它自己的工作的话,就用中断吧。
中断的定义:
当某种条件满足时,中断源产生中断申请,cpu在当前指令执行完毕后会检测是否有中断申请,如果有的话,立即将有关寄存器值存入堆栈。转去执行中断源所对应的中断处理程序。中断处理执行完毕后,回到原来的程序中继续执行。
中断向量:每一个中断源都有一个标识号,叫中断向量,当cpu检测到中断申请时,就根据中断向量号寻找对应的中断处理程序(函数),一个向量号对应一个处理程序(函数)。
干说没有用,下面我们来看看MC68HC08是怎么处理外部中断的.
外部中断处理:
有个寄存器需要说明:
//头文件
#include
#include
void main(void){
//初始化
CONFIG1=0x39;
DDRC=0xff;//c口用于led显示,所以作为输出口
PTC=0b011100000; //c口低五位作为输出
INTSCR_IMASK=0; //开外部中断
INTSCR_MODE=1; //下降沿出发
EnableInterrupts;//开中断cli
for(;;);//进入死循环
}
interrupt 2 void IRQ_ISR(void){ //中断处理程序
INTSCR_IMASK=1;//禁止外部中断
PTC=0b011111111;//将所有的灯都点亮,作为中断程序的可视化输出
INTSCR_ACK=1;//表明中断已响应
INTSCR_IMASK=0;//允许外部中断
}
如果你看懂了外部触发,那么键盘触发就易如反掌了
键盘中断处理:
有两个寄存器需要说明
首先INTKBSCR寄存器,实际上用法跟外部中断所用的INTSCR非常相像。参照上例即可。
其次是INTKBIER,由于MC68HC08中默认用A口作为键盘输入端口的。究竟A口作为普通口,还是键盘输入端口,通过INTKBIER控制,A口八个管脚对应它的八个位。为0时作普通端口,为1时作键盘输入,此时硬件置该管脚为高电平,当键被按下时,产生低电平,引发键盘中断。
本例是利用中断方式响应按键,按下哪个键就点亮哪个led指示灯,并把按键的值显示在七段数码管上。
#include
#include
int i,ans;
void main(void) {
CONFIG2=0x01;
CONFIG1=0x01;
INTKBSCR_MODEK = 1;//选择触发方式为下降沿和低电平
INTKBSCR_IMASKK = 1; //禁止键盘中断
INTKBIER = 0xff;//A口都作为键盘输入
INTKBSCR_ACKK = 1;//键盘响应置1,用于清除IREQ
INTKBSCR_IMASKK = 0;//允许键盘中断
DDRA=0x00;//A口都为输入
DDRC=0xff;//c口连指示灯,作为输出
PTC=0b11100000;//c口灯全部点亮
EnableInterrupts;//开中断对应汇编的cli
for(;;){};//死循环,等待中断
}
void print(void){//显示中断
SPCR=0x3a;//显示管驱动芯片通信初始化
SPSCR=0x01;
DDRB=0x7f;
DDRD=0xff;
DDRE=0xff;
ans=0;//将键值转换为数字
switch (PTA){
case 0b011111110:ans=1;break;
case 0b011111101:ans=2;break;
case 0b011111011:ans=3;break;
case 0b011110111:ans=4;break;
case 0b011101111:ans=5;break;
case 0b011011111:ans=6;break;
case 0b010111111:ans=7;break;
case 0b001111111:ans=8;break;
}
PTE_PTE1=0;//送交显示
SPDR=0x80;
for (i=1;i<=5;i++){;}
SPDR=0x00;
for (i=1;i<=5;i++){;}
SPDR=ans;
for (i=1;i<=5;i++){;}
PTE_PTE1=1;
PTE_PTE1=0;
SPDR=0x01;
for (i=1;i<=5;i++){;}
PTE_PTE1=1;
}
interrupt void KBI_ISR(void)
{
INTKBSCR_IMASKK = 1;//屏蔽键盘中断
PTC=PTA;//将键盘的值用c口led灯显示
print();//同时将键盘值用数字的形式在数码管显示
INTKBSCR_ACKK = 1;//清除中断确认
INTKBSCR_IMASKK = 0;//开启键盘中断
}
细心的朋友可能能看出来,其实外部中断和键盘中断都是一回事,能不能把键盘作为外部中断用呢,没问题。这就能大大扩展外部中断数量了。