微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之十一:中断方式按键

单片机学习之十一:中断方式按键

时间:11-18 来源:互联网 点击:
1、实验现象

最右面的数码管初始显示0,每次按下外部按键K0执行加一,计数到九时重新回零。

2、实验目的

掌握中断方式响应按键的原理
掌握中断服务程序的具体编写:如何进行键的识别,如何去抖动

3、实验任务分析

上一个试验我们了解了查询方式按键的原理。当单片机工作于查询方式的时候,要不间断的对外部按键进行查询,其间单片机不能干其他的任何工作。如果单片机的工作量较大,这种方式就很难适应。

为了进一步提高单片机的工作效率,可以采用中断方式。
中断方式的按键响应过程如下:单片机处理自己的工作,如果有按键按下,向单片机发出中断请求,单片机就会停下现在正在处理的工作,转去执行中断程序,执行之后回来继续刚才的工作;如果没有按键按下,单片机就作自己的工作,不理睬外部键盘。

怎样向单片机发出中断请求呢?发出中断请求的来源叫做中断源。单片机可提供五个中断源。其中2个为外部中断请求INT0和INT1,2个为片内定时/计数器T0和T1的计满溢出中断,还有一个是片内串行口中断请求TI或者RI。在本试验中,我们用到的是外部中断INT1。

还是先看看电路吧。(注意在作中断试验之前,我们必须先把JMP4跳线插上,这样按键动作才能发出中断请求。)

我们在试验一中曾经给大家介绍过,单片机的P3口是双功能口,第一种功能可以作通用的I/O口。而在本试验中,我们要用到P3口的第二功能。大家看P3.2和P3.3两个引脚,斜线后面标示的就是P3口的第二功能,分别是INT0和INT1,也就是单片机的两个外部中断源。

我们发现,当任何一个按键按下的时候,P3.3引脚,即INT1上就会出现一个低电平,向单片机发出中断申请。如果单片机开放了外部中断,就响应中断请求,进入中断服务程序。
那么单片机是否开放中断功能是由什么控制的呢?在这里就涉及到另外一个特殊功能寄存器IE啦。还记得单片机内部256字节的数据RAM吗?其中高128字节(80h~ffh)是特殊功能寄存器区。以前我们介绍过PSW就在这个区域,同样IE也在这个区域,它的名字叫做“中断允许寄存器”,专门负责程序是否响应中断的,它的各位功能说明如下:
EA:CPU中断允许标志。EA=0,CPU禁止各种中断;EA=1,CPU开放中断。但是,每个中断源的中断请求是否允许,还需要由各自的允许位决定。所以在本程序中,大家不要忘了首先把EA置1哦!

ES:串行口允许中断。ES=1,允许串行口中断;ES=0,禁止串行口中断。所以,在这个程序中,这一位和我们没有关系,不理它就是啦。

ET1:定时器/计数器T1的溢出中断允许。ET1=1时,允许T1溢出中断;ET1=0时,禁止T1溢出中断。同样,这一位和我们也没有关系。

EX1:外部中断1(即INT1)允许中断。当EX1=1时,允许INT1中断;当EX1=0时,禁止INT1中断。可见,这一位的值和我们这个试验密切相关,所以大家千万不要忘了把这一位置1。

下面的ET0和EX0的功能与ET1和EX1类似,是分别控制定时器T0和外部中断INT0的,这里就不再赘述啦。

在前面分析时,我们发现,四个按键中任何一个按下,都会发出中断请求。那么,如何判断中断请求是由那个按键发出的呢?这就是中断服务程序的工作了。在中断服务程序中,需要完成如下工作:键识别、去抖动、和键功能处理。
那么,键识别是如何完成的呢?它的思路是这样的。
(1)、先把P1口的状态读入a寄存器,然后把高四位屏蔽掉
(2)、判断是否k0按键按下,(即判断a中的数是否00001101),如果是就调用延时程序去抖,否则,表示不是K0按下,退出中断返回主程序
(3)、调用延时程序后,重复上面的(1)(2)步。如果确定k0按下,转中断服务程序,否则就是抖动,退出中断返回主程序。

在这里还需要说明一点:在进入中断服务程序之后,我们首先应该关闭中断,因为如果不关闭中断,就有可能会引起混乱。在中断服务程序返回主程序之前,再把中断打开。
4、实验程序
org 0000h
ljmp start ;(1)为什么这里要放一条跳转指令呢,我们在后面解释把

org 0013h
ljmp ext1 ;(2)同上

org 0030h
start: clr p1.5 ;主程序开始
mov r7,#0ffh
setb ea ;cpu开放中断
setb ex1 ;允许外部中断1申请中断
setb it1 ;(3)设置外部中断1触发方式为跳变触发,原因在后面详细解释
lcall play1 ;调用初始状态显示子程序
ajmp $ ;等待按键发出中断申请

ext1: clr ea ;进入中断,先关闭中断
lcall key_reader ;调用键识别子程序
pass: setb ea ;返回主程序之前先开中断
reti ;(4)中断返回指令,

key_reader: mov a,p1 ;读入P1口的状态
anl a,#0fh ;屏蔽高四位
cjne a,#0dh,pass;如果a的内容不是00001101(表示不是k0按下),就退出中断
lcall del10ms ;否则,表示k0按下,调用10ms延时去抖
mov a,p1 ;再次读入p1口的内容
anl a,#0fh ;屏蔽高四位
cjne a,#0dh,pass ;如果a的内容不是00001101,就是抖动,退出中断
lcall play2 ;否则,确定按键按下,转数码显示程序
ret

play1: mov a,#48h ;让最右面的数码管显示0的子程序
mov p0,a

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top