シングルチップ マイクロコンピュータ: 割り込みシステム制御ダイオードのオンとオフ

6-2: 6-2に示すように 8 個の発光ダイオードが P0ポート に接続され 、ボタンがピンに接続されている場合、各ボタンで発光ダイオードのオンとオフを切り替えることができる必要があります。 .
#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