求助!多路抢答器的程序的问题!!!

2019-07-16 06:02发布

最近想做一个多路抢答器,想实现的功能是可以设置倒计时的时间,设置完后按照设置的时间进行倒计时并抢答,倒计时和抢答的程序已经好了,就是时间设定的部分有问题,我想了两种:1;用中断,但是进去可以加减时间,但一退出来时间就变成0了,而且不能抢答。2:用一个子程序,但是进去可以加减时间,就是退不出来。想了好几天都没有结果,所以向各位大神求助了。帮帮忙啊!谢谢了! 新建 WinRAR ZIP 压缩文件.zip (2.13 KB, 下载次数: 9)


下面是我的程序:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //时间设定
unsigned char code LED[] = {~0x6F,~0x7F,~0x07,~0x7D,~0x6D,~0x66,~0x4F,~0x5B,~0x06,~0x3F,};   //倒计时
unsigned char code jianpan[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; //键盘号码
unsigned char code jishi[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,};
uchar  dis_buf;            //显示缓存
uchar  temp;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
uint i=0;
uchar  key,num,flag,tt,stop;
void  keydown(void);
void  keyscan(void);
void  beep();
void timeset();
void  delay(uchar x)
{ uchar j;
    while((x--)!=0)
    { for(j=0;j<125;j++)
         {;}
    }
}
void main()
{
flag=0;
tt=0;
TMOD=0x01;
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
EA=1;  //开定时器中断和开外部中断
ET0=1;
TR0=1;


while(1)
{   
  
  timeset();
    keydown();
  if(flag==1)    //若标志位为1,退出计时,显示抢答成功的选手号码
  {
   flag=0;
   TR0=0;
       P0 = jianpan[dis_buf%16];     //%16表示输出16进制
    delay(2000);
    while(1)
    {
      beep();
    }

     
   }
   else     //若标志位为0,继续计时,
    if(tt==20)
   {
    tt=0;
    if(num>=10) num=0;
    P0=LED[num];
    num++;
    if(num==10)
    TR0=0;
   }
   
  }
}

void timer0() interrupt 1    //计时中断
{
  
   TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}

//键盘扫描
void  keyscan(void)
{  temp = 0;
    P1=0xF0;                 //高四位输入   行为高电平  列为低电平
    delay(1);
temp=P1;                 //读P1口
    temp=temp&0xF0;    //屏蔽低四位
    temp=~((temp>>4)|0xF0);   
    if(temp==1)   // p1.4 被拉低
        key=1;
    else if(temp==2)   // p1.5 被拉低
        key=2;
    else if(temp==4)   // p1.6 被拉低
        key=3;
    else if(temp==8)   // p1.7 被拉低
         key=4;
        
    P1=0x0F;                //低四位输入  列为高电平 行为低电平
    delay(1);
temp=P1;                //读P1口      
    temp=temp&0x0F;
    temp=~(temp|0xF0);
    if(temp==2)     // p1.1  被拉低
        key=key+0;
    else if(temp==4)   // p1.2  被拉低
        key=key+4;
    else if(temp==8) // p1.3  被拉低
        key=key+8;
    else
        key=16;  
     
     dis_buf = key;              //键值入显示缓存
     dis_buf = dis_buf & 0x0f;

}//以上是键盘扫描
//判断是否按下
void  keydown(void)
{  
   P1=0xF0;
if(P1!=0xF0)  //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
{
   flag=1;
   
   keyscan();  //调用按键扫描程序
    }
}
   
void beep()   //蜂鸣器间断响
{
  P34=1;
delay(150);
P34=0;
delay(150);
}
void timeset() //时间设定:P34开始设定,P35退出设定,P36时间加,P37时间减
{
   
   while(P34==0)
   {  
      delay(5);
   if(P34==0)
    {
  if(P35==0)
         {
     delay(5);
     if(P35==0)
     break;
   }
      
       if(P36==0)
      {
          delay(5);
       if(P36==0)
      {
         i++;
         delay(200);
        if(i>=9) i=9;
      
      }
      }
    else
     {
       if(P37==0)
    {
      delay(5);
     if(P37==0)
     {
        i--;
         delay(200);
       if((i<=0)||(i>9))  i=0;
      
        }
       }
  
   
      
     }   

    P0=~tab;

   }
}



这是中断的
void  counter0(void) interrupt 0
{
   EX0=0;
  
   while(flag==1)
   {  
      
   if(P35==0) flag=0;
if(P36==0)
  {
   delay(5);
  if(P36==0)
  {
     i++;
     delay(200);
    if(i>=9) i=9;
     
  }
  }
  else
   {
     if(P37==0)
  {
    delay(5);
   if(P37==0)
   {
      i--;
       delay(200);
     if((i<=0)||(i>9))  i=0;
     
      }
     }

   }
   P0=~tab;
   num=i;
}
   EX0=1;
  
}
   
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。