给你写个程序,完全满足你的要求#include <AT89X51.H>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P3^0;
sbit LED2=P3^1;
sbit LED3=P3^2;
sbit LED4=P3^3;
sbit LED5=P3^4;
sbit LED6=P3^5;
sbit LED7=P3^6;
sbit LED8=P3^7;
uchar num1=0,num2=0,num3=0,num4=0; //中断计时变量
uchar num1_1=0,num2_1=0,num3_1=0,num4_1=0;//中断计数变量
bit flag1=0,flag2=0,flag3=0,flag4=0; //使能计时标志
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TR0 = 1; //定时器0开启
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void keyscan() //按键扫描程序
{
static bit sign=0; //按键自锁标志
static uint count=0; //消抖计数变量
uchar key=0; //临时变量
if(P1!=0xff) //检测有按键按下
{
count++; //消抖计数
if((count>=500)&&(sign==0))
{
sign=1; //按键自锁标志置1
key=P1; //读取键值
switch(key)
{
case 0xfe: flag1=1;num1=0; break;
case 0xfd: flag1=0;LED1=1;LED2=1;break;
case 0xfb: flag2=1;num2=0; break;
case 0xf7: flag2=0;LED3=1;LED4=1;break;
case 0xef: flag3=1;num3=0; break;
case 0xdf: flag3=0;LED5=1;LED6=1;break;
case 0xbf: flag4=1;num4=0; break;
case 0x7f: flag4=0;LED7=1;LED8=1;break;
default: break;
}
}
}
else //按键抬起
{
count=0; //消抖计数变量清0
sign=0; //按键自锁标志清0
}
}
void main()
{
Timer0Init();
while(1)
{
keyscan();
}
}
/**************中断服务程序*****************/
void timer0() interrupt 1
{
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
if(flag1==1)
{
num1++;
if(num1<=100)
{
LED1=0;LED2=1;
}
else
{
LED1=1;LED2=0;
}
if(num1>=220)
{
num1=0;
num1_1++;
}
if(num1_1>=10)
{
LED1=1;LED2=1;flag1=0;
}
}
if(flag2==1)
{
num2++;
if(num2<=100)
{
LED3=0;LED4=1;
}
else
{
LED3=1;LED4=0;
}
if(num2>=220)
{
num2=0;
num2_1++;
}
if(num2_1>=10)
{
LED3=1;LED4=1;flag2=0;
}
}
if(flag3==1)
{
num3++;
if(num3<=100)
{
LED5=0;LED6=1;
}
else
{
LED5=1;LED6=0;
}
if(num3>=220)
{
num3=0;
num3_1++;
}
if(num3_1>=10)
{
LED5=1;LED6=1;flag3=0;
}
}
if(flag4==1)
{
num4++;
if(num4<=100)
{
LED7=0;LED8=1;
}
else
{
LED7=1;LED8=0;
}
if(num4>=220)
{
num4=0;
num4_1++;
}
if(num4_1>=10)
{
LED7=1;LED8=1;flag4=0;
}
}
}
|