找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5315|回复: 2
收起左侧

按键的困惑

[复制链接]
ID:16763 发表于 2009-11-25 23:26 | 显示全部楼层 |阅读模式

最近,要设计一个篮球赛计分计时器,把倒时器做好了,在设计按键加分这个环节出了问题,总是不准

不是多次按键才有效,就是一次按加N多分,而设计本意是按一次键只加一分。

看书上介绍的按键防拌动技术,用上去了,也不行。达不到效果

我也曾采用中断,还是不理想

高手们,支支招!

下面是加分函数

void deal_with(void)
{
  if(!f11_key)                  //一队加分按键
  {    delay(200);
      while(f11_key)
   {
      jia_fen++;
   goto deal_out;
   }
   }
  if(!f21_key)      //2队加分按键
  {    delay(200);
      while(f21_key)
   {
      yi_fen++;
   goto deal_out;
   }
   }
deal_out:;
end:;
}

回复

使用道具 举报

ID:16763 发表于 2009-11-25 23:27 | 显示全部楼层

全部程序如下:

#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uint cur_min,cur_sec,cur_ms;
uint q_wei,b_wei,s_wei,g_wei,temp;
sbit on_off_key=P3^0;                   //define on_off key
sbit reset_key=P3^1;     //reset key
sbit sec_flash=P1^1;     //flash led
sbit time_respons_led=P1^3;             //time respons,led on
sbit f11_key=P3^2;            //甲队+1BUTTON
sbit f21_key=P3^3;      //yi+1
uint jia_fen,yi_fen;
uchar code design[10]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60};
//****************************************************************************************
//****************************************************************************************
//*****************延时函数***************************************************************
void delay(uint i)
    {
  uint j;
  for(;i>0;i--)
     for(;j<120;j++)
  {;}
 }
//****************************************************************************************
//deal_with甲方、乙方分数处理*************************************************************
//****************************************分数的处理**************************************
void deal_with(void)
{
  if(!f11_key)
  {    delay(200);
      while(f11_key)
   {
      jia_fen++;
   goto deal_out;
   }
   }
  if(!f21_key)
  {    delay(200);
      while(f21_key)
   {
      yi_fen++;
   goto deal_out;
   }
   }
deal_out:;
end:;
}

 

回复

使用道具 举报

ID:16763 发表于 2009-11-25 23:27 | 显示全部楼层
//******************************************************************************************
//******************************************************************************************
//******************************************************************************************
//**********************计分显示************************************************************
void fenshu_dis(uint fff,dis_bit)
     {uint sss,ggg;                 //显示数据:十位,个位
   sss=fff/10;
   ggg=fff%10;
   if(dis_bit==0)                 //显示甲方分数
       {switch(sss)     //甲方十位
        {case 0x00:P0=design[0];break;
      case 0x01:P0=design[1];break;
      case 0x02:P0=design[2];break;
      case 0x03:P0=design[3];break;
      case 0x04:P0=design[4];break;
      case 0x05:P0=design[5];break;
      case 0x06:P0=design[6];break;
      case 0x07:P0=design[7];break;
      case 0x08:P0=design[8];break;
      case 0x09:P0=design[9];break;
      }
   P2=0xfe;  
   delay(10);
   switch(ggg)      //甲方个位
     {case 0x00:P0=design[0];break;
      case 0x01:P0=design[1];break;
      case 0x02:P0=design[2];break;
      case 0x03:P0=design[3];break;
      case 0x04:P0=design[4];break;
      case 0x05:P0=design[5];break;
      case 0x06:P0=design[6];break;
      case 0x07:P0=design[7];break;
      case 0x08:P0=design[8];break;
      case 0x09:P0=design[9];break;
      }
   P2=0xfd;      
   delay(10);
       }
   else if(dis_bit==1)         //显示乙方分数
    { 
   {switch(sss)     //乙方十位
           {case 0x00:P0=design[0];break;
         case 0x01:P0=design[1];break;
         case 0x02:P0=design[2];break;
         case 0x03:P0=design[3];break;
         case 0x04:P0=design[4];break;
         case 0x05:P0=design[5];break;
         case 0x06:P0=design[6];break;
         case 0x07:P0=design[7];break;
         case 0x08:P0=design[8];break;
         case 0x09:P0=design[9];break;
         }
            P2=0xfb;       //乙方个数
      delay(10);
       switch(ggg)
        {case 0x00:P0=design[0];break;
         case 0x01:P0=design[1];break;
         case 0x02:P0=design[2];break;
         case 0x03:P0=design[3];break;
         case 0x04:P0=design[4];break;
         case 0x05:P0=design[5];break;
         case 0x06:P0=design[6];break;
         case 0x07:P0=design[7];break;
         case 0x08:P0=design[8];break;
         case 0x09:P0=design[9];break;
         }
         P2=0xf7;     
      delay(10);
   }
   }
 }
//***********************************************************************
//***********************************************************************
//***********************************************************************
//***********************初使化函数**************************************
void initial(void)
    {cur_min=15;
  cur_sec=0;
  TMOD=0x01;//50ms中断
  TH0=0x3C;
  TL0=0xB2;
  EA=1;
  //EX0=1;
  //EX1=1;
  //IT0=1;
  //IT1=1;
  if(!on_off_key)
      {ET0=1;
       TR0=1;}
  time_respons_led=1;
  }
//********************************************************************************
//********************************************************************************
//********************************************************************************
//**************************T0中断函数********************************************
void time0_int(void) interrupt 1
{     TMOD=0x01;
     TH0=0x4c;
  TL0=0x00;
     cur_ms++;                       //+1
     if(cur_ms>=20)           //中断次数达到20
      { cur_ms=0x00;                 //ms清零
    sec_flash=~sec_flash;      //秒闪烁
          if(cur_sec!=0x00)             //秒不等于0则减1,
              {cur_sec--;}
    else
     { cur_sec=59;
       cur_min--;
     }
    }
}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//void ex0int(void) interrupt 0
//{  bit temp,temp2;
//    temp=P3^2;
// if(!temp)
//    {    delay(50);
//      temp2=P3^2;
//   while(temp2)
//      {   delay(50);
//           jia_fen++;
//    break;}
//    }
//}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//void ex1int(void) interrupt 2
//{  bit temp,temp2;
//    temp=P3^3;
// if(!temp)
//    {    delay(50);
//      temp2=P3^3;
//   while(temp2)
//      {   delay(50);
//             yi_fen++;
//    break;
//   }
//     }
//}
//*******************************************************************************
//*******************************************************************************
//*******************************************************************************
//******************************************************************************* 
void display(uint dis_min,dis_sec)    //显示
    {uint qq,bb,ss,gg;             //千百十个位
  //分种的处理
 
 
      if(dis_min>0x09)
          {qq=dis_min/10;
        bb=dis_min%10;}
      else
          {qq=0x00;
        bb=dis_min;}
 //秒的处理
      if(dis_sec>0x09)
          {ss=dis_sec/10;
        gg=dis_sec%10;}
      else
          {ss=0x00;
        gg=dis_sec;}
    if((qq==0)&&(bb==0)&&(ss==0)&&(gg==0)){TR0=0;}   //计数时间到,关断计数器,显示0000

 //
  q_wei=qq;
  b_wei=bb;
  s_wei=ss;
  g_wei=gg;
  //
  temp=q_wei;
  switch(temp)
      {case 0x00:P0=design[0];break;
    case 0x01:P0=design[1];break;
    case 0x02:P0=design[2];break;
    case 0x03:P0=design[3];break;
    case 0x04:P0=design[4];break;
    case 0x05:P0=design[5];break;
    case 0x06:P0=design[6];break;
    case 0x07:P0=design[7];break;
    case 0x08:P0=design[8];break;
    case 0x09:P0=design[9];break;
    }
  P2=0xef;                      //P2.3=1,显示千位
  delay(10);
  //
  temp=b_wei;
  switch(temp)
      {case 0x00:P0=design[0];break;
    case 0x01:P0=design[1];break;
    case 0x02:P0=design[2];break;
    case 0x03:P0=design[3];break;
    case 0x04:P0=design[4];break;
    case 0x05:P0=design[5];break;
    case 0x06:P0=design[6];break;
    case 0x07:P0=design[7];break;
    case 0x08:P0=design[8];break;
    case 0x09:P0=design[9];break;
    }
  P2=0xdf;                      //p2.2=1,显示百位
  delay(10);
  //
  temp=s_wei;
  switch(temp)
      {case 0x00:P0=design[0];break;
    case 0x01:P0=design[1];break;
    case 0x02:P0=design[2];break;
    case 0x03:P0=design[3];break;
    case 0x04:P0=design[4];break;
    case 0x05:P0=design[5];break;
    case 0x06:P0=design[6];break;
    case 0x07:P0=design[7];break;
    case 0x08:P0=design[8];break;
    case 0x09:P0=design[9];break;
    }
  P2=0xbf;                      //p2.2=1,显示百位
  delay(10);
  //
  temp=g_wei;
  switch(temp)
      {case 0x00:P0=design[0];break;
    case 0x01:P0=design[1];break;
    case 0x02:P0=design[2];break;
    case 0x03:P0=design[3];break;
    case 0x04:P0=design[4];break;
    case 0x05:P0=design[5];break;
    case 0x06:P0=design[6];break;
    case 0x07:P0=design[7];break;
    case 0x08:P0=design[8];break;
    case 0x09:P0=design[9];break;
    }
  P2=0x7f;                            //p2.2=1,显示个位
  delay(10);
  }
//*********************************************************************************
//*********************************************************************************
//*********************************************************************************
//*********************************************************************************
void main()
    {
 initial();                          //system initial
 for(;;)
     {
      if(!on_off_key)       //按下键启动计时
          {ET0=1;
        TR0=1;}
       else
          {TR0=0;
        ET0=0;}
      display(cur_min,cur_sec);  //15min
   deal_with();                     //计分函数
   fenshu_dis(jia_fen,0);
   fenshu_dis(yi_fen,1);
      if(!reset_key)
          {TMOD=0x01;
        TH0=0x4c;
        TL0=0x00;
        EA=1;
        cur_min=15;
        cur_sec=0;
        }
     if((cur_min==0)&&(cur_sec==0))
           {time_respons_led=0x00;       //设定时间到达,指示灯亮
               ET0=0;
               TR0=0;}
       else {time_respons_led=1;}
   }
     }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表