例
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の応答が間に合わず、シリアル ポート データの送受信エラーが発生します。
無料いいね!! !