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

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


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

猜你喜欢

转载自blog.csdn.net/weixin_59798969/article/details/123796630