一、外部中断控制蜂鸣器开关
具体任务:
当按键按下时蜂鸣器持续鸣叫,按键弹起时蜂鸣器静音。
代码:
#include<>
//位定义蜂鸣器
sbit BEEP=P1^0;
//中断配置函数
static void InitInterrupt()
{
IT0=1;//外部中断0为下降沿触发
EX0=1;//外部中断0中断允许
EA=1;//总中断允许
}
//主函数
void main()
{
InitInterrupt();//调用配置中断
while(1)
{
}
}
//外部中断服务函数
void External0_Handler() interrupt 0
{
BEEP=~BEEP;
}
二、外部中断计数器
具体任务:
采用外部中断判断KEY1按下,每次按下按键后记录按动次数加1,并且能在数码管上显示,能够从0计数至9999
代码:
#include<>
//位定义数码管
sbit SegmentG1=P2^3;
sbit SegmentG2=P2^2;
sbit SegmentG3=P2^1;
sbit SegmentG4=P2^0;
sbit KEY1 = P3^2;
//定义数组0~9
static unsigned char s_arrNumber[] ={0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};
//延时函数
static void DelayNms(int nms)
{
unsigned int i,j;
for(i=0;i<nms;i++)
{
for(j=0;j<123;j++)
{
}
}
}
//中断配置函数
static void InitInterrupt()
{
IT0=1;//外部中断0为下降沿触发
EX0=1;//外部中断0中断允许
EA=1;//总中断允许
}
//主函数
void main()
{
InitInterrupt();//调用中断配置
while(1)
{
}
}
//外部中断服务函数
void External0_Handler() interrupt 0
{
static unsigned int a,b,i,j= 0;//要定义为静态变量!
i++;
if(10==i)
{
i=0;
j++;
}
else if(10==j)
{
j=0;
b++;
}
else if(10==b)
{
b=0;
a++;
}
while(0==KEY1)
{
P0 = s_arrNumber[i];
SegmentG4 = 0;
DelayNms(5);
SegmentG4 = 1;
P0 = s_arrNumber[j];
SegmentG3 = 0;
DelayNms(5);
SegmentG3 = 1;
P0 = s_arrNumber[b];
SegmentG2 = 0;
DelayNms(5);
SegmentG2 = 1;
P0 = s_arrNumber[a];
SegmentG1 = 0;
DelayNms(5);
SegmentG1 = 1;
}
}
三、按键识别长按短按操作
具体任务:
短按KEY1时实现顺序流水,长按KEY1时实现倒序流水。
代码:
#include <>
//位定义
sbit LED1 = P2^4;
sbit LED2 = P2^5;
sbit LED3 = P2^6;
sbit LED4 = P2^7;
sbit KEY1 = P3^2;//后面如果用到了所以位定义不能省略
//延时函数
static void DelayNms(int nms)
{
unsigned int i,j;
for(i=0;i<nms;i++)
{
for(j=0;j<123;j++)
{
}
}
}
//中断配置函数
static void InitInterrupt(void)
{
IT0 = 1;//外部中断0下降沿触发
EX0 = 1;//外部中断0中断允许
EA = 1;//总中断允许
}
//主函数
void main()
{
InitInterrupt();
while(1)
{
}
}
//外部中断服务函数
void External0_Handle(void)interrupt 0
{
if(0==KEY1)
{
DelayNms(500);//表至少持续了500ms的长按
if(0==KEY1)//仍然被按下
{
while(1)//执行长按循环
{
LED1 = 0;
DelayNms(500);
LED2 = 0;
DelayNms(500);
LED3 = 0;
DelayNms(500);
LED4 = 0;
DelayNms(500);
LED1 = 1;
DelayNms(500);
LED2 = 1;
DelayNms(500);
LED3 = 1;
DelayNms(500);
LED4 = 1;
DelayNms(500);
}
}
}
while(1)//否则进入另一个循环
{
LED4 = 0;
DelayNms(500);
LED4 = 1;
LED3 = 0;
DelayNms(500);
LED3 = 1;
LED2 = 0;
DelayNms(500);
LED2 = 1;
LED1 = 0;
DelayNms(500);
LED1 = 1;
}
}