用单片机实现抢答器

2019-04-15 18:29发布

1. 使用元器件:硬件:数码管、按键、LED软件:定时器2. 程序设计要求启动后,8LED灯依次(18循环)点亮(或不点亮),数码管(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;
}
}