1. 使用元器件:硬件:数码管、按键、LED软件:定时器2. 程序设计要求启动后,8颗LED灯依次(1至8循环)点亮(或不点亮),数码管(8位一体、4位一体、独立)同时显示当前被点亮LED位置;按键控制抢答;按键按下后,停止更新LED灯和数码管;数码管显示按键位置,LED灯停止在按键位置;超过10秒没有按键按下,LED全部闪烁;按键复位
#include
code unsigned char duan[8]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07};//段选
code unsigned char wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选
unsigned char number,ms=0,flag=0;
sbit k1=P1^0;
sbit k2=P1^1;//定义LED灯
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
void delay(unsigned char i)//延时
{
while(i--);
}
void key()
{
if(0==k1) //当K1按下时
{
delay(100);
if(0==k1)
{
if((0==ms)||(1==ms))
{
flag=1;
}
}
}
else if(1==k1)
{
if((1==flag)&&(ms!=2))
{
ms=1;
number=1;
}
}
if(0==k2)//当K2按下时
{
delay(100);
if(0==k2)
{
if((0==ms)||(1==ms))
{
flag=2;
}
}
}
else if(1==k2)
{
if((2==flag)&&(ms!=2))
{
ms=1;
number=2;
}
}
if(0==k3)//当K3按下时
{
delay(100);
if(0==k3)
{
if((0==ms)||(1==ms))
{
flag=3;
}
}
}
else if(1==k3)
{
if((3==flag)&&(ms!=2))
{
ms=1;
number=3;
}
}
if(0==k4)//当K4按下时
{
delay(100);
if(0==k4)
{
if((0==ms)||(1==ms))
{
flag=4;
}
}
}
else if(1==k4)
{
if((4==flag)&&(ms!=2))
{
ms=1;
number=4;
}
}
if(0==k5)//当K5按下时
{
delay(100);
if(0==k5)
{
if((0==ms)||(1==ms))
{
flag=5;
}
}
}
else if(1==k5)
{
if((5==flag)&&(ms!=2))
{
ms=1;
number=5;
}
}
if(0==k6)//当K6按下时
{
delay(100);
if(0==k6)
{
if((0==ms)||(1==ms))
{
flag=6;
}
}
}else if(1==k6)
{
if((6==flag)&&(ms!=2))
{
ms=1;
number=6;
}
}
if(0==k7)//当K7按下时
{
delay(100);
if(0==k7)
{
if((0==ms)||(1==ms))
{
flag=7;
}
}
}
else if(1==k7)
{
if((7==flag)&&(ms!=2))
{
ms=1;
number=7;
}
}
if(0==k8)//当K8按下时
{
delay(100);
if(0==k8)
{
if((0==ms)||(1==ms))
{
flag=8;
}
}
}else if(1==k8)
{
if((8==flag)&&(ms!=2))
{
ms=1;
number=8;
}
}
}
void deng()
{
P0=wei[number];
}
void guan()
{
P1=~duan[number];
}
void dsq()
{
TMOD=0X01;//定时器
TH0=0XFC;
TL0=0X18;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
dsq();
while(1)
{
key();
guan();
deng();
}
}
void interruot1() interrupt 1
{
static unsigned cnt=0,cnt1=0,cnt2=0;//静态
TH0=0XFC;
TL0=0X18;
cnt++;
if(cnt>1000)
{
if(0==ms)
{
number++;
if(number>8)
{
number=1;
}
}
cnt=0;
}else if(ms==2)
{
if(cnt/500>0)
{
P0=0x00;
}else
{
P0=0xff;
}
}
if(flag==number)
{
cnt1++;
if((cnt1>1000)&&(1==ms))
{
cnt2++;
if(cnt2>10)
{
P0=0XFF;
number=0;
ms=2;
cnt2=0;
}
cnt1=0;
}
}else if(flag!=number)
{
cnt1=0;
cnt2=0;
}
}