例
6-2:
如图
6-2
所示,
P0
口连接了
8
个发光二极管,
引脚上接了一个按键,要求每次按键均能改变发光二级管的亮灭。
#include <reg51.h>
#define LED P0
sbit KEY = P3^3;
bit flag=0;
void delay(unsigned char n) //延时子函数;
{
unsigned char a;
for(a=0;a<n;a++);
}
main(void)
{
IT1=1; //设置边沿触发方式
EA=1;
EX1=1;
LED=0xff; //发光二极管灭
while(1)
{
if( flag==1 ) //有外部中断的按键
{
delay(100); //延迟一段时间,判断是否为抖动
if( KEY==0 ) //还有按键,说明不是抖动
{
while( !KEY ); //等待按键松开
LED=~LED; //改变发光二级管的亮灭
}
flag=0; //上次外部中断已经处理完毕,所以清除该变量
EX1=1; //再次开放外部中断
}
}
}
void int1(void) interrupt 2 //中断服务程序
{
flag=1; //设置中断标志变量为真,表明有按键闭合
EX1=0; //暂时不允许再次产生外部中断
}
示例图为:
编写中断服务程序时,应避免使中断时间过长的操作,如果本例中断服务程序编成如下形式:
void int1(void) interrupt 2//中断服务程序
{
delay(100); //延迟一段时间,判断是否为抖动
if( KEY==0 ) //还有按键,说明不是抖动
{
while( !KEY ); //等待按键松开
LED=~LED; //改变发光二级管的亮灭
}
}
由于中断函数里有去除按键抖动以及等待按键松开的处理,当按键时间过长时,程序会陷入执行语句while( !KEY )不得退出,有可能造成程序逻辑错误。如果此时系统中同时使用串口中断收发数据,会使串口中断请求得不到CPU及时响应,造成串口数据收发错误。
可以点个免费的赞吗!!!