MC68HC08单片机程序设计速成
2013-03-04
wuzhenzhi
标签:

MC68HC08的外部中断和键盘中断

这次给大家带来中断的话题。中断可以说是计算机的法宝。如果想让计算机听从你的实时命令,又不耽误它自己的工作的话,就用中断吧。

中断的定义:

当某种条件满足时,中断源产生中断申请,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;//开启键盘中断

}

细心的朋友可能能看出来,其实外部中断和键盘中断都是一回事,能不能把键盘作为外部中断用呢,没问题。这就能大大扩展外部中断数量了。

共 7 页   上一页1234567下一页
可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号