单片机:中断系统控制二极管的亮灭

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及时响应,造成串口数据收发错误。


 可以点个免费的赞吗!!!  

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值