|
我来了 把程序给你写一下吧
没上机执行,你看一下 端口p1.1和p1.0驱动LED
两个中断作为按键
程序如下:
//晶振为12M 两个外中断口作为两个按键
#include <reg51.h>
#define LED1On P1^0=0 //用P1.0和P1.1作为输出分别驱动两个LED
#define LED1Off P1^0=1 //LED接电阻到电源,即端口输出0时点亮
#define LED2On P1^1=0
#define LED2Off P1^1=1
unsigned int TimeCount_10s; //定义10s延时计数
unsigned char TimeCount_Rem; //消除按键抖动延时
char K1Down,K2Down; //定义标志位,51里好像这个不能定义成sbit型式,忘了很久没用51了不过char型也没什么影响。用来判断哪个按键被按下了
void main()//主函数
{
INI();
while(1)//循环等待中断
{}
}
void INI()//初始化
{
TimeCount_10s=0; //初值
TimeCount_Rem=0;
K1Down = 0; //初始都没有按下
K2Down = 0;
TMOD = 0x02; //T0:8位定时自动重装
TH0 = 56; //256-56=200us
TL0 = 56;
TR0 = 1; //T0开始计数;
IE = 0x87; //开放T0,INT0,INT1;
}
void Time0() interrupt 1 //定时中断200us
{
if(K1Down)
{
if(++TimeCount_10s>50000)//200*50000=10s
{
TimeCount_10s=0;
K1Down = 0;
LED1Off;
}
}
else if(K2Down)
{
if(++TimeCount_10s>50000)//200*50000=10s
{
TimeCount_10s=0;
K2Down = 0;
LED2Off;
}
}
if(KEY1Down||Key2Down) //按键消抖
{
if(TimeCount_Rem<) //200*2500=500ms
TimeCount_Rem++;
else
IE|=0x05; //重新开外中断0和1
}
}
void KEY1() interrupt 0 //外中断0
{
if(!KEY1Down) //如果刚才KEY1未被按下,则才起作用
{
EX0 = 0; //关中断防止干扰
KEY1Down = 1; //标志置一
LED1On; //开LED
TimeCount_Rem=0;//消抖计数清零
}
}
void KEY2() interrupt 2 //外中断1
{
if(!KEY1Down) //如果刚才KEY1未被按下,则才起作用
{
EX1 = 0; //关中断防止干扰
KEY2Down = 1; //标志置一
LED2On; //开LED
TimeCount_Rem=0;
}
} |