本帖最后由 单片机学习123 于 2013-8-31 15:20 编辑
蓝色部分程序是先按K1,释放后再按k2,led灯亮
红色部分程序是按k2 ,释放后再按 K1 ,led灯灭
绿色部分程序是先按k2但不释放再按k1,这时等于说K2、k1都不释放(但必须是有顺序的,不能同时按下去)大约3秒后led亮(此功能无法实现,求助……)
#include<reg52.h>
bit a=0 ;
bit b=0 ;
sbit k1=P3^0;
sbit k2=P3^6;
sbit led=P1^0;
sbit LED2=P1^1;
void DelayUs2x(unsigned int t);
void DelayMs(unsigned int t);
static unsigned char i;
void Init_Timer0(void)
{
TMOD|= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void main()
{ while(1)
{
if(k1==0&&a==0)
{DelayMs(10);
if(k1==0&&a==0)
{a=1;//a是判断第一次按下的标志
Init_Timer0();
while(a==1||k2==0)
{
if(k2==0)
{
DelayMs(10);
if(k2==0)
{
led=0;
a=0;
}
}
}
}
}
if(k2==0&&a==0)
{DelayMs(10);
if(k2==0&&a==0)
{a=1;
Init_Timer0();
while(a==1||k1==0)
{if(k1==0)
{DelayMs(10);
if(k1==0)
{led=1;
a=0;
}
}
}
}
}
if(k2==0&&b==0)
{DelayMs(10);
if(k2==0&&b==0)
{b=1;
while(b==1||k1==0)
{if(k1==0)
DelayMs(10);
if(k1==0)
{
DelayMs(3000);
led=0;
b=0;
}
}
}
}
}
}
void DelayUs2x(unsigned int t)
{
while(--t);
}
void DelayMs(unsigned int t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void Timer0_isr(void) interrupt 1 using 1
{
TH0=(65536-50000)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
i++;
if(i>10) //2s
{i=0;
a=0;
LED2=!LED2;}
}
|